Index: sys/arch/evbarm/rpi/rpi_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbarm/rpi/rpi_machdep.c,v
retrieving revision 1.54
diff -u -r1.54 rpi_machdep.c
--- sys/arch/evbarm/rpi/rpi_machdep.c 4 Oct 2014 13:05:57 -0000 1.54
+++ sys/arch/evbarm/rpi/rpi_machdep.c 4 Oct 2014 13:22:13 -0000
@@ -171,6 +171,8 @@
/* Smallest amount of RAM start.elf could give us. */
#define RPI_MINIMUM_SPLIT (128U * 1024 * 1024)
+#define RPI_FWREV_HWCURSOR 1390809622
+
static struct __aligned(16) {
struct vcprop_buffer_hdr vb_hdr;
struct vcprop_tag_fwrev vbt_fwrev;
@@ -385,17 +387,16 @@
static int rpi_video_on = WSDISPLAYIO_VIDEO_ON;
-#if defined(RPI_HWCURSOR)
#define CURSOR_BITMAP_SIZE (64 * 8)
#define CURSOR_ARGB_SIZE (64 * 64 * 4)
static uint32_t hcursor = 0;
static bus_addr_t pcursor = 0;
static uint32_t *cmem = NULL;
static int cursor_x = 0, cursor_y = 0, hot_x = 0, hot_y = 0, cursor_on = 0;
+static int cursor_x_min, cursor_x_max, cursor_y_min, cursor_y_max;
static uint32_t cursor_cmap[4];
static uint8_t cursor_mask[8 * 64], cursor_bitmap[8 * 64];
#endif
-#endif
static void
@@ -403,7 +404,7 @@
{
bus_space_tag_t iot = &bcm2835_bs_tag;
bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(BCM2835_ARMMBOX_BASE);
- uint32_t res;
+ uint32_t res[BCM2835_MBOX_NUMCHANNELS];
bcm2835_mbox_write(iot, ioh, BCMMBOX_CHANPM, (
#if (NSDHC > 0)
@@ -426,7 +427,7 @@
bcm2835_mbox_write(iot, ioh, BCMMBOX_CHANARM2VC, KERN_VTOPHYS(&vb));
- bcm2835_mbox_read(iot, ioh, BCMMBOX_CHANARM2VC, &res);
+ bcm2835_mbox_read(iot, ioh, BCMMBOX_CHANARM2VC, res);
/*
* No need to invalid the cache as the memory has never been referenced
@@ -463,16 +464,16 @@
#ifdef VERBOSE_INIT_ARM
if (vcprop_tag_success_p(&vb.vbt_fwrev.tag))
- printf("%s: firmware rev %x\n", __func__,
+ printf("%s: firmware rev %u\n", __func__,
vb.vbt_fwrev.rev);
if (vcprop_tag_success_p(&vb.vbt_macaddr.tag))
printf("%s: mac-address %llx\n", __func__,
vb.vbt_macaddr.addr);
if (vcprop_tag_success_p(&vb.vbt_boardmodel.tag))
- printf("%s: board model %x\n", __func__,
+ printf("%s: board model %u\n", __func__,
vb.vbt_boardmodel.model);
if (vcprop_tag_success_p(&vb.vbt_boardrev.tag))
- printf("%s: board rev %x\n", __func__,
+ printf("%s: board rev %u\n", __func__,
vb.vbt_boardrev.rev);
if (vcprop_tag_success_p(&vb.vbt_serial.tag))
printf("%s: board serial %llx\n", __func__,
@@ -831,47 +832,57 @@
}
#if defined(RPI_HWCURSOR)
- struct amba_attach_args *aaa = aux;
- bus_space_handle_t hc;
+ if (vb.vbt_fwrev.rev >= RPI_FWREV_HWCURSOR) {
+#else
+ if (/* CONSTCOND */ 0) {
+#endif
+
+ struct amba_attach_args *aaa = aux;
+ bus_space_handle_t hc;
+
+ cursor_x_min = 0;
+ cursor_x_max = width-1;
+ cursor_y_min = 0;
+ cursor_y_max = height-1;
+
+ hcursor = rpi_alloc_mem(CURSOR_ARGB_SIZE, PAGE_SIZE,
+ MEM_FLAG_L1_NONALLOCATING | MEM_FLAG_HINT_PERMALOCK);
+ pcursor = rpi_lock_mem(hcursor);
- hcursor = rpi_alloc_mem(CURSOR_ARGB_SIZE, PAGE_SIZE,
- MEM_FLAG_L1_NONALLOCATING | MEM_FLAG_HINT_PERMALOCK);
- pcursor = rpi_lock_mem(hcursor);
#ifdef RPI_IOCTL_DEBUG
- printf("hcursor: %08x\n", hcursor);
- printf("pcursor: %08x\n", (uint32_t)pcursor);
- printf("fb: %08x\n", (uint32_t)vb_setfb.vbt_allocbuf.address);
-#endif
- if (bus_space_map(aaa->aaa_iot, pcursor, CURSOR_ARGB_SIZE,
- BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE, &hc) != 0) {
- printf("couldn't map cursor memory\n");
- } else {
- int i, j, k;
-
- cmem = bus_space_vaddr(aaa->aaa_iot, hc);
- k = 0;
- for (j = 0; j < 64; j++) {
- for (i = 0; i < 64; i++) {
- cmem[i + k] =
- ((i & 8) ^ (j & 8)) ? 0xa0ff0000 : 0xa000ff00;
+ printf("hcursor: %08x\n", hcursor);
+ printf("pcursor: %08x\n", (uint32_t)pcursor);
+ printf("fb: %08x\n", (uint32_t)vb_setfb.vbt_allocbuf.address);
+#endif
+ if (bus_space_map(aaa->aaa_iot, pcursor, CURSOR_ARGB_SIZE,
+ BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE, &hc) != 0) {
+ printf("couldn't map cursor memory\n");
+ } else {
+ int i, j, k;
+
+ cmem = bus_space_vaddr(aaa->aaa_iot, hc);
+ k = 0;
+ for (j = 0; j < 64; j++) {
+ for (i = 0; i < 64; i++) {
+ cmem[i + k] =
+ ((i & 8) ^ (j & 8)) ? 0xa0ff0000 : 0xa000ff00;
+ }
+ k += 64;
}
- k += 64;
- }
- cpu_dcache_wb_range((vaddr_t)cmem, CURSOR_ARGB_SIZE);
- rpi_fb_initcursor(pcursor, 0, 0);
+
+ cpu_dcache_wb_range((vaddr_t)cmem, CURSOR_ARGB_SIZE);
+ rpi_fb_initcursor(pcursor, 0, 0);
+ }
+
#ifdef RPI_IOCTL_DEBUG
rpi_fb_movecursor(600, 400, 1);
#else
rpi_fb_movecursor(cursor_x, cursor_y, cursor_on);
#endif
- }
-#endif
-
+ }
return true;
}
-
-#if defined(RPI_HWCURSOR)
static int
rpi_fb_do_cursor(struct wsdisplay_cursor *cur)
{
@@ -887,14 +898,22 @@
if (cur->which & WSDISPLAY_CURSOR_DOHOT) {
hot_x = cur->hot.x;
+ if (hot_x < 0) hot_x = 0;
+ if (hot_x > 63) hot_x = 63;
hot_y = cur->hot.y;
+ if (hot_y < 0) hot_y = 0;
+ if (hot_y > 63) hot_y = 63;
pos = 1;
shape = 1;
}
if (cur->which & WSDISPLAY_CURSOR_DOPOS) {
cursor_x = cur->pos.x;
+ if (cursor_x < cursor_x_min) cursor_x = cursor_x_min;
+ if (cursor_x > cursor_x_max) cursor_x = cursor_x_max;
cursor_y = cur->pos.y;
+ if (cursor_y < cursor_y_min) cursor_y = cursor_y_min;
+ if (cursor_y > cursor_y_max) cursor_y = cursor_y_max;
pos = 1;
}
if (cur->which & WSDISPLAY_CURSOR_DOCMAP) {
@@ -941,7 +960,6 @@
}
return 0;
}
-#endif
static int
rpi_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, lwp_t *l)
@@ -955,20 +973,23 @@
return 0;
rpi_video_on = d;
rpi_fb_set_video(d);
-#if defined(RPI_HWCURSOR)
- rpi_fb_movecursor(cursor_x, cursor_y,
- d ? cursor_on : 0);
-#endif
+
+ if (hcursor) {
+ rpi_fb_movecursor(cursor_x, cursor_y,
+ d ? cursor_on : 0);
+ }
}
return 0;
case WSDISPLAYIO_GVIDEO:
*(int *)data = rpi_video_on;
return 0;
-#if defined(RPI_HWCURSOR)
case WSDISPLAYIO_GCURPOS:
{
struct wsdisplay_curpos *cp = (void *)data;
+ if (hcursor == 0)
+ return ENODEV;
+
cp->x = cursor_x;
cp->y = cursor_y;
}
@@ -977,6 +998,9 @@
{
struct wsdisplay_curpos *cp = (void *)data;
+ if (hcursor == 0)
+ return ENODEV;
+
cursor_x = cp->x;
cursor_y = cp->y;
rpi_fb_movecursor(cursor_x, cursor_y, cursor_on);
@@ -986,6 +1010,9 @@
{
struct wsdisplay_curpos *cp = (void *)data;
+ if (hcursor == 0)
+ return ENODEV;
+
cp->x = 64;
cp->y = 64;
}
@@ -994,9 +1021,11 @@
{
struct wsdisplay_cursor *cursor = (void *)data;
+ if (hcursor == 0)
+ return ENODEV;
+
return rpi_fb_do_cursor(cursor);
}
-#endif
default:
return EPASSTHROUGH;
}
@@ -1082,7 +1111,7 @@
NULL, 0, NULL, 0, CTL_MACHDEP, CTL_EOL);
sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT|CTLFLAG_READONLY|CTLFLAG_HEX,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY,
CTLTYPE_INT, "firmware_revision", NULL, NULL, 0,
&vb.vbt_fwrev.rev, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL);