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);
 
