Lines Matching refs:xenfb

126 static int xenfb_kbd_event(struct XenInput *xenfb,  in xenfb_kbd_event()  argument
129 struct xenkbd_page *page = xenfb->c.page; in xenfb_kbd_event()
132 if (xenfb->c.xendev.be_state != XenbusStateConnected) in xenfb_kbd_event()
147 return xen_pv_send_notify(&xenfb->c.xendev); in xenfb_kbd_event()
151 static int xenfb_send_key(struct XenInput *xenfb, bool down, int keycode) in xenfb_send_key() argument
160 return xenfb_kbd_event(xenfb, &event); in xenfb_send_key()
164 static int xenfb_send_motion(struct XenInput *xenfb, in xenfb_send_motion() argument
175 return xenfb_kbd_event(xenfb, &event); in xenfb_send_motion()
179 static int xenfb_send_position(struct XenInput *xenfb, in xenfb_send_position() argument
190 return xenfb_kbd_event(xenfb, &event); in xenfb_send_position()
204 struct XenInput *xenfb = (struct XenInput *)dev; in xenfb_key_event() local
213 trace_xenfb_key_event(xenfb, lnx, key->down); in xenfb_key_event()
214 xenfb_send_key(xenfb, key->down, lnx); in xenfb_key_event()
231 struct XenInput *xenfb = (struct XenInput *)dev; in xenfb_mouse_event() local
243 xenfb_send_key(xenfb, btn->down, BTN_LEFT); in xenfb_mouse_event()
246 xenfb_send_key(xenfb, btn->down, BTN_LEFT + 1); in xenfb_mouse_event()
249 xenfb_send_key(xenfb, btn->down, BTN_LEFT + 2); in xenfb_mouse_event()
253 xenfb->wheel--; in xenfb_mouse_event()
258 xenfb->wheel++; in xenfb_mouse_event()
268 if (xenfb->raw_pointer_wanted) { in xenfb_mouse_event()
269 xenfb->axis[move->axis] = move->value; in xenfb_mouse_event()
273 xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available"); in xenfb_mouse_event()
288 xenfb->axis[move->axis] = move->value * scale / 0x7fff; in xenfb_mouse_event()
294 xenfb->axis[move->axis] += move->value; in xenfb_mouse_event()
304 struct XenInput *xenfb = (struct XenInput *)dev; in xenfb_mouse_sync() local
306 trace_xenfb_mouse_event(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
307 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
308 xenfb->wheel, 0, in xenfb_mouse_sync()
309 xenfb->abs_pointer_wanted); in xenfb_mouse_sync()
310 if (xenfb->abs_pointer_wanted) { in xenfb_mouse_sync()
311 xenfb_send_position(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
312 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
313 xenfb->wheel); in xenfb_mouse_sync()
315 xenfb_send_motion(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
316 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
317 xenfb->wheel); in xenfb_mouse_sync()
318 xenfb->axis[INPUT_AXIS_X] = 0; in xenfb_mouse_sync()
319 xenfb->axis[INPUT_AXIS_Y] = 0; in xenfb_mouse_sync()
321 xenfb->wheel = 0; in xenfb_mouse_sync()
414 struct XenInput *xenfb = container_of(xendev, struct XenInput, c.xendev); in input_event() local
415 struct xenkbd_page *page = xenfb->c.page; in input_event()
421 xen_pv_send_notify(&xenfb->c.xendev); in input_event()
436 static int xenfb_map_fb(struct XenFB *xenfb) in xenfb_map_fb() argument
438 struct xenfb_page *page = xenfb->c.page; in xenfb_map_fb()
439 char *protocol = xenfb->c.xendev.protocol; in xenfb_map_fb()
491 if (xenfb->pixels) { in xenfb_map_fb()
492 munmap(xenfb->pixels, xenfb->fbpages * XEN_PAGE_SIZE); in xenfb_map_fb()
493 xenfb->pixels = NULL; in xenfb_map_fb()
496 xenfb->fbpages = DIV_ROUND_UP(xenfb->fb_len, XEN_PAGE_SIZE); in xenfb_map_fb()
497 n_fbdirs = xenfb->fbpages * mode / 8; in xenfb_map_fb()
501 fbmfns = g_new0(xen_pfn_t, xenfb->fbpages); in xenfb_map_fb()
504 map = qemu_xen_foreignmem_map(xenfb->c.xendev.dom, NULL, PROT_READ, in xenfb_map_fb()
508 xenfb_copy_mfns(mode, xenfb->fbpages, fbmfns, map); in xenfb_map_fb()
511 xenfb->pixels = qemu_xen_foreignmem_map(xenfb->c.xendev.dom, NULL, in xenfb_map_fb()
512 PROT_READ, xenfb->fbpages, in xenfb_map_fb()
514 if (xenfb->pixels == NULL) in xenfb_map_fb()
525 static int xenfb_configure_fb(struct XenFB *xenfb, size_t fb_len_lim, in xenfb_configure_fb() argument
536 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
542 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
548 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
554 xen_pv_printf(&xenfb->c.xendev, 0, "invalid frontend stride %d\n", in xenfb_configure_fb()
560 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
566 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
573 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
578 xenfb->fb_len = fb_len; in xenfb_configure_fb()
579 xenfb->row_stride = row_stride; in xenfb_configure_fb()
580 xenfb->depth = depth; in xenfb_configure_fb()
581 xenfb->width = width; in xenfb_configure_fb()
582 xenfb->height = height; in xenfb_configure_fb()
583 xenfb->offset = offset; in xenfb_configure_fb()
584 xenfb->up_fullscreen = 1; in xenfb_configure_fb()
585 xenfb->do_resize = 1; in xenfb_configure_fb()
586 xen_pv_printf(&xenfb->c.xendev, 1, in xenfb_configure_fb()
595 SRC_T *src = (SRC_T *)(xenfb->pixels \
596 + xenfb->offset \
597 + (line * xenfb->row_stride) \
598 + (x * xenfb->depth / 8)); \
620 src = (SRC_T *) ((unsigned long) src + xenfb->depth / 8); \
632 static void xenfb_guest_copy(struct XenFB *xenfb, int x, int y, int w, int h) in xenfb_guest_copy() argument
634 DisplaySurface *surface = qemu_console_surface(xenfb->con); in xenfb_guest_copy()
641 switch (xenfb->depth) { in xenfb_guest_copy()
665 xen_pv_printf(&xenfb->c.xendev, 0, "%s: oops: convert %d -> %d bpp?\n", in xenfb_guest_copy()
666 __func__, xenfb->depth, bpp); in xenfb_guest_copy()
668 dpy_gfx_update(xenfb->con, x, y, w, h); in xenfb_guest_copy()
672 static int xenfb_queue_full(struct XenFB *xenfb) in xenfb_queue_full() argument
674 struct xenfb_page *page = xenfb->c.page; in xenfb_queue_full()
685 static void xenfb_send_event(struct XenFB *xenfb, union xenfb_in_event *event) in xenfb_send_event() argument
688 struct xenfb_page *page = xenfb->c.page; in xenfb_send_event()
697 xen_pv_send_notify(&xenfb->c.xendev); in xenfb_send_event()
700 static void xenfb_send_refresh_period(struct XenFB *xenfb, int period) in xenfb_send_refresh_period() argument
707 xenfb_send_event(xenfb, &event); in xenfb_send_refresh_period()
722 struct XenFB *xenfb = opaque; in xenfb_update() local
726 if (xenfb->c.xendev.be_state != XenbusStateConnected) in xenfb_update()
729 if (!xenfb->feature_update) { in xenfb_update()
732 xenfb->up_fullscreen = 1; in xenfb_update()
736 if (xenfb->do_resize) { in xenfb_update()
739 xenfb->do_resize = 0; in xenfb_update()
740 switch (xenfb->depth) { in xenfb_update()
744 format = qemu_default_pixman_format(xenfb->depth, true); in xenfb_update()
746 (xenfb->width, xenfb->height, format, in xenfb_update()
747 xenfb->row_stride, xenfb->pixels + xenfb->offset); in xenfb_update()
751 surface = qemu_create_displaysurface(xenfb->width, xenfb->height); in xenfb_update()
754 dpy_gfx_replace_surface(xenfb->con, surface); in xenfb_update()
755 xen_pv_printf(&xenfb->c.xendev, 1, in xenfb_update()
757 xenfb->width, xenfb->height, xenfb->depth, in xenfb_update()
759 xenfb->up_fullscreen = 1; in xenfb_update()
763 if (xenfb->up_fullscreen) { in xenfb_update()
764 xen_pv_printf(&xenfb->c.xendev, 3, "update: fullscreen\n"); in xenfb_update()
765 xenfb_guest_copy(xenfb, 0, 0, xenfb->width, xenfb->height); in xenfb_update()
766 } else if (xenfb->up_count) { in xenfb_update()
767 xen_pv_printf(&xenfb->c.xendev, 3, "update: %d rects\n", in xenfb_update()
768 xenfb->up_count); in xenfb_update()
769 for (i = 0; i < xenfb->up_count; i++) in xenfb_update()
770 xenfb_guest_copy(xenfb, in xenfb_update()
771 xenfb->up_rects[i].x, in xenfb_update()
772 xenfb->up_rects[i].y, in xenfb_update()
773 xenfb->up_rects[i].w, in xenfb_update()
774 xenfb->up_rects[i].h); in xenfb_update()
776 xen_pv_printf(&xenfb->c.xendev, 3, "update: nothing\n"); in xenfb_update()
778 xenfb->up_count = 0; in xenfb_update()
779 xenfb->up_fullscreen = 0; in xenfb_update()
784 struct XenFB *xenfb = opaque; in xenfb_ui_info() local
787 if (xenfb->feature_update) { in xenfb_ui_info()
789 if (xenfb_queue_full(xenfb)) { in xenfb_ui_info()
799 xenfb_send_refresh_period(xenfb, 1000 * 1000 / refresh_rate); in xenfb_ui_info()
807 struct XenFB *xenfb = opaque; in xenfb_invalidate() local
808 xenfb->up_fullscreen = 1; in xenfb_invalidate()
811 static void xenfb_handle_events(struct XenFB *xenfb) in xenfb_handle_events() argument
814 struct xenfb_page *page = xenfb->c.page; in xenfb_handle_events()
829 if (xenfb->up_count == UP_QUEUE) in xenfb_handle_events()
830 xenfb->up_fullscreen = 1; in xenfb_handle_events()
831 if (xenfb->up_fullscreen) in xenfb_handle_events()
835 w = MIN(event->update.width, xenfb->width - x); in xenfb_handle_events()
836 h = MIN(event->update.height, xenfb->height - y); in xenfb_handle_events()
838 xen_pv_printf(&xenfb->c.xendev, 1, "bogus update ignored\n"); in xenfb_handle_events()
845 xen_pv_printf(&xenfb->c.xendev, 1, "bogus update clipped\n"); in xenfb_handle_events()
847 if (w == xenfb->width && h > xenfb->height / 2) { in xenfb_handle_events()
850 xenfb->up_fullscreen = 1; in xenfb_handle_events()
852 xenfb->up_rects[xenfb->up_count].x = x; in xenfb_handle_events()
853 xenfb->up_rects[xenfb->up_count].y = y; in xenfb_handle_events()
854 xenfb->up_rects[xenfb->up_count].w = w; in xenfb_handle_events()
855 xenfb->up_rects[xenfb->up_count].h = h; in xenfb_handle_events()
856 xenfb->up_count++; in xenfb_handle_events()
861 if (xenfb_configure_fb(xenfb, xenfb->fb_len, in xenfb_handle_events()
865 xenfb->fb_len, in xenfb_handle_events()
869 xenfb_invalidate(xenfb); in xenfb_handle_events()
967 struct XenFB *xenfb = container_of(xendev, struct XenFB, c.xendev); in fb_event() local
969 xenfb_handle_events(xenfb); in fb_event()
970 xen_pv_send_notify(&xenfb->c.xendev); in fb_event()