Index: rpi_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbarm/rpi/rpi_machdep.c,v
retrieving revision 1.55
diff -u -r1.55 rpi_machdep.c
--- rpi_machdep.c       7 Oct 2014 08:37:18 -0000       1.55
+++ rpi_machdep.c       7 Oct 2014 09:20:20 -0000
@@ -386,6 +386,7 @@
static int rpi_video_on = WSDISPLAYIO_VIDEO_ON;

#if defined(RPI_HWCURSOR)
+#define RPI_FWREV_HWCURSOR 1390809622
#define CURSOR_BITMAP_SIZE     (64 * 8)
#define CURSOR_ARGB_SIZE       (64 * 64 * 4)
static uint32_t hcursor = 0;
@@ -831,40 +832,43 @@
       }

#if defined(RPI_HWCURSOR)
-       struct amba_attach_args *aaa = aux;
-       bus_space_handle_t hc;
+       if (vb.vbt_fwrev.rev >= RPI_FWREV_HWCURSOR) {

-       hcursor = rpi_alloc_mem(CURSOR_ARGB_SIZE, PAGE_SIZE,
-           MEM_FLAG_L1_NONALLOCATING | MEM_FLAG_HINT_PERMALOCK);
-       pcursor = rpi_lock_mem(hcursor);
+               struct amba_attach_args *aaa = aux;
+               bus_space_handle_t hc;
+
+               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);
+                       rpi_fb_movecursor(600, 400, 1);
#else
-               rpi_fb_movecursor(cursor_x, cursor_y, cursor_on);
+                       rpi_fb_movecursor(cursor_x, cursor_y, cursor_on);
#endif
-       }
+               }
+       }
#endif

       return true;
@@ -956,8 +960,9 @@
                       rpi_video_on = d;
                       rpi_fb_set_video(d);
#if defined(RPI_HWCURSOR)
-                       rpi_fb_movecursor(cursor_x, cursor_y,
-                                         d ? cursor_on : 0);
+                       if (hcursor)
+                               rpi_fb_movecursor(cursor_x, cursor_y,
+                                                 d ? cursor_on : 0);
#endif
               }
               return 0;
@@ -969,6 +974,9 @@
               {
                       struct wsdisplay_curpos *cp = (void *)data;

+                       if (hcursor == 0)
+                               return ENODEV;
+
                       cp->x = cursor_x;
                       cp->y = cursor_y;
               }
@@ -977,6 +985,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 +997,9 @@
               {
                       struct wsdisplay_curpos *cp = (void *)data;

+                       if (hcursor == 0)
+                               return ENODEV;
+
                       cp->x = 64;
                       cp->y = 64;
               }
@@ -994,6 +1008,9 @@
               {
                       struct wsdisplay_cursor *cursor = (void *)data;

+                       if (hcursor == 0)
+                               return ENODEV;
+
                       return rpi_fb_do_cursor(cursor);
               }
#endif