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