Lines Matching +full:io +full:- +full:width

4  *  Copyright IBM, Corp. 2005-2006
5 * Copyright Red Hat, Inc. 2006-2008
33 #include "hw/xen/xen-legacy-backend.h"
35 #include "hw/xen/interface/io/fbif.h"
36 #include "hw/xen/interface/io/kbdif.h"
37 #include "hw/xen/interface/io/protocols.h"
45 /* -------------------------------------------------------------------- */
70 int width; member
87 /* -------------------------------------------------------------------- */
94 if (xenstore_read_fe_uint64(&c->xendev, "page-ref", &val) == -1) in common_bind()
95 return -1; in common_bind()
99 if (xenstore_read_fe_int(&c->xendev, "event-channel", &c->xendev.remote_port) == -1) in common_bind()
100 return -1; in common_bind()
102 c->page = qemu_xen_foreignmem_map(c->xendev.dom, NULL, in common_bind()
105 if (c->page == NULL) in common_bind()
106 return -1; in common_bind()
108 xen_be_bind_evtchn(&c->xendev); in common_bind()
109 xen_pv_printf(&c->xendev, 1, in common_bind()
110 "ring mfn %"PRI_xen_pfn", remote-port %d, local-port %d\n", in common_bind()
111 mfn, c->xendev.remote_port, c->xendev.local_port); in common_bind()
118 xen_pv_unbind_evtchn(&c->xendev); in common_unbind()
119 if (c->page) { in common_unbind()
120 qemu_xen_foreignmem_unmap(c->page, 1); in common_unbind()
121 c->page = NULL; in common_unbind()
125 /* -------------------------------------------------------------------- */
130 struct xenkbd_page *page = xenfb->c.page; in xenfb_kbd_event()
133 if (xenfb->c.xendev.be_state != XenbusStateConnected) in xenfb_kbd_event()
138 prod = page->in_prod; in xenfb_kbd_event()
139 if (prod - page->in_cons == XENKBD_IN_RING_LEN) { in xenfb_kbd_event()
141 return -1; in xenfb_kbd_event()
147 page->in_prod = prod + 1; in xenfb_kbd_event()
148 return xen_pv_send_notify(&xenfb->c.xendev); in xenfb_kbd_event()
206 InputKeyEvent *key = evt->u.key.data; in xenfb_key_event()
207 int qcode = qemu_input_key_value_to_qcode(key->key); in xenfb_key_event()
214 trace_xenfb_key_event(xenfb, lnx, key->down); in xenfb_key_event()
215 xenfb_send_key(xenfb, key->down, lnx); in xenfb_key_event()
239 switch (evt->type) { in xenfb_mouse_event()
241 btn = evt->u.btn.data; in xenfb_mouse_event()
242 switch (btn->button) { in xenfb_mouse_event()
244 xenfb_send_key(xenfb, btn->down, BTN_LEFT); in xenfb_mouse_event()
247 xenfb_send_key(xenfb, btn->down, BTN_LEFT + 1); in xenfb_mouse_event()
250 xenfb_send_key(xenfb, btn->down, BTN_LEFT + 2); in xenfb_mouse_event()
253 if (btn->down) { in xenfb_mouse_event()
254 xenfb->wheel--; in xenfb_mouse_event()
258 if (btn->down) { in xenfb_mouse_event()
259 xenfb->wheel++; in xenfb_mouse_event()
268 move = evt->u.abs.data; in xenfb_mouse_event()
269 if (xenfb->raw_pointer_wanted) { in xenfb_mouse_event()
270 xenfb->axis[move->axis] = move->value; in xenfb_mouse_event()
274 xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available"); in xenfb_mouse_event()
278 switch (move->axis) { in xenfb_mouse_event()
280 scale = surface_width(surface) - 1; in xenfb_mouse_event()
283 scale = surface_height(surface) - 1; in xenfb_mouse_event()
289 xenfb->axis[move->axis] = move->value * scale / 0x7fff; in xenfb_mouse_event()
294 move = evt->u.rel.data; in xenfb_mouse_event()
295 xenfb->axis[move->axis] += move->value; in xenfb_mouse_event()
307 trace_xenfb_mouse_event(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
308 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
309 xenfb->wheel, 0, in xenfb_mouse_sync()
310 xenfb->abs_pointer_wanted); in xenfb_mouse_sync()
311 if (xenfb->abs_pointer_wanted) { in xenfb_mouse_sync()
312 xenfb_send_position(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
313 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
314 xenfb->wheel); in xenfb_mouse_sync()
316 xenfb_send_motion(xenfb, xenfb->axis[INPUT_AXIS_X], in xenfb_mouse_sync()
317 xenfb->axis[INPUT_AXIS_Y], in xenfb_mouse_sync()
318 xenfb->wheel); in xenfb_mouse_sync()
319 xenfb->axis[INPUT_AXIS_X] = 0; in xenfb_mouse_sync()
320 xenfb->axis[INPUT_AXIS_Y] = 0; in xenfb_mouse_sync()
322 xenfb->wheel = 0; in xenfb_mouse_sync()
347 xenstore_write_be_int(xendev, "feature-abs-pointer", 1); in input_init()
348 xenstore_write_be_int(xendev, "feature-raw-pointer", 1); in input_init()
357 rc = common_bind(&in->c); in input_initialise()
368 if (xenstore_read_fe_int(xendev, "request-abs-pointer", in input_connected()
369 &in->abs_pointer_wanted) == -1) { in input_connected()
370 in->abs_pointer_wanted = 0; in input_connected()
372 if (xenstore_read_fe_int(xendev, "request-raw-pointer", in input_connected()
373 &in->raw_pointer_wanted) == -1) { in input_connected()
374 in->raw_pointer_wanted = 0; in input_connected()
376 if (in->raw_pointer_wanted && in->abs_pointer_wanted == 0) { in input_connected()
380 if (in->qkbd) { in input_connected()
381 qemu_input_handler_unregister(in->qkbd); in input_connected()
383 if (in->qmou) { in input_connected()
384 qemu_input_handler_unregister(in->qmou); in input_connected()
386 trace_xenfb_input_connected(xendev, in->abs_pointer_wanted); in input_connected()
388 in->qkbd = qemu_input_handler_register((DeviceState *)in, &xenfb_keyboard); in input_connected()
389 in->qmou = qemu_input_handler_register((DeviceState *)in, in input_connected()
390 in->abs_pointer_wanted ? &xenfb_abs_mouse : &xenfb_rel_mouse); in input_connected()
392 if (in->raw_pointer_wanted) { in input_connected()
393 qemu_input_handler_activate(in->qkbd); in input_connected()
394 qemu_input_handler_activate(in->qmou); in input_connected()
402 if (in->qkbd) { in input_disconnect()
403 qemu_input_handler_unregister(in->qkbd); in input_disconnect()
404 in->qkbd = NULL; in input_disconnect()
406 if (in->qmou) { in input_disconnect()
407 qemu_input_handler_unregister(in->qmou); in input_disconnect()
408 in->qmou = NULL; in input_disconnect()
410 common_unbind(&in->c); in input_disconnect()
416 struct xenkbd_page *page = xenfb->c.page; in input_event()
419 if (page->out_prod == page->out_cons) in input_event()
421 page->out_cons = page->out_prod; in input_event()
422 xen_pv_send_notify(&xenfb->c.xendev); in input_event()
425 /* -------------------------------------------------------------------- */
439 struct xenfb_page *page = xenfb->c.page; in xenfb_map_fb()
440 char *protocol = xenfb->c.xendev.protocol; in xenfb_map_fb()
445 int mode, ret = -1; in xenfb_map_fb()
448 pd = page->pd; in xenfb_map_fb()
464 ptr32 = (void*)page->pd; in xenfb_map_fb()
465 ptr64 = ((void*)page->pd) + 4; in xenfb_map_fb()
467 ptr32 = ((void*)page->pd) - 4; in xenfb_map_fb()
468 ptr64 = (void*)page->pd; in xenfb_map_fb()
483 pd = ((void*)page->pd) - 4; in xenfb_map_fb()
488 pd = ((void*)page->pd) + 4; in xenfb_map_fb()
492 if (xenfb->pixels) { in xenfb_map_fb()
493 munmap(xenfb->pixels, xenfb->fbpages * XEN_PAGE_SIZE); in xenfb_map_fb()
494 xenfb->pixels = NULL; in xenfb_map_fb()
497 xenfb->fbpages = DIV_ROUND_UP(xenfb->fb_len, XEN_PAGE_SIZE); in xenfb_map_fb()
498 n_fbdirs = xenfb->fbpages * mode / 8; in xenfb_map_fb()
502 fbmfns = g_new0(xen_pfn_t, xenfb->fbpages); in xenfb_map_fb()
505 map = qemu_xen_foreignmem_map(xenfb->c.xendev.dom, NULL, PROT_READ, in xenfb_map_fb()
509 xenfb_copy_mfns(mode, xenfb->fbpages, fbmfns, map); in xenfb_map_fb()
512 xenfb->pixels = qemu_xen_foreignmem_map(xenfb->c.xendev.dom, NULL, in xenfb_map_fb()
513 PROT_READ, xenfb->fbpages, in xenfb_map_fb()
515 if (xenfb->pixels == NULL) in xenfb_map_fb()
527 int width, int height, int depth, in xenfb_configure_fb() argument
537 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
543 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
549 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
552 return -1; in xenfb_configure_fb()
555 xen_pv_printf(&xenfb->c.xendev, 0, "invalid frontend stride %d\n", in xenfb_configure_fb()
557 return -1; in xenfb_configure_fb()
560 if (width < 0 || width > max_width) { in xenfb_configure_fb()
561 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
562 "invalid frontend width %d limited to %d\n", in xenfb_configure_fb()
563 width, max_width); in xenfb_configure_fb()
564 width = max_width; in xenfb_configure_fb()
567 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
569 offset, fb_len - 1); in xenfb_configure_fb()
570 return -1; in xenfb_configure_fb()
572 max_height = (fb_len - offset) / row_stride; in xenfb_configure_fb()
574 xen_pv_printf(&xenfb->c.xendev, 0, in xenfb_configure_fb()
579 xenfb->fb_len = fb_len; in xenfb_configure_fb()
580 xenfb->row_stride = row_stride; in xenfb_configure_fb()
581 xenfb->depth = depth; in xenfb_configure_fb()
582 xenfb->width = width; in xenfb_configure_fb()
583 xenfb->height = height; in xenfb_configure_fb()
584 xenfb->offset = offset; in xenfb_configure_fb()
585 xenfb->up_fullscreen = 1; in xenfb_configure_fb()
586 xenfb->do_resize = 1; in xenfb_configure_fb()
587 xen_pv_printf(&xenfb->c.xendev, 1, in xenfb_configure_fb()
589 width, height, depth, offset, row_stride); in xenfb_configure_fb()
596 SRC_T *src = (SRC_T *)(xenfb->pixels \
597 + xenfb->offset \
598 + (line * xenfb->row_stride) \
599 + (x * xenfb->depth / 8)); \
604 const int RSS = 32 - (RSB + GSB + BSB); \
605 const int GSS = 32 - (GSB + BSB); \
606 const int BSS = 32 - (BSB); \
607 const uint32_t RSM = (~0U) << (32 - RSB); \
608 const uint32_t GSM = (~0U) << (32 - GSB); \
609 const uint32_t BSM = (~0U) << (32 - BSB); \
610 const int RDS = 32 - (RDB + GDB + BDB); \
611 const int GDS = 32 - (GDB + BDB); \
612 const int BDS = 32 - (BDB); \
613 const uint32_t RDM = (~0U) << (32 - RDB); \
614 const uint32_t GDM = (~0U) << (32 - GDB); \
615 const uint32_t BDM = (~0U) << (32 - BDB); \
621 src = (SRC_T *) ((unsigned long) src + xenfb->depth / 8); \
635 DisplaySurface *surface = qemu_console_surface(xenfb->con); in xenfb_guest_copy()
642 switch (xenfb->depth) { in xenfb_guest_copy()
666 xen_pv_printf(&xenfb->c.xendev, 0, "%s: oops: convert %d -> %d bpp?\n", in xenfb_guest_copy()
667 __func__, xenfb->depth, bpp); in xenfb_guest_copy()
669 dpy_gfx_update(xenfb->con, x, y, w, h); in xenfb_guest_copy()
675 struct xenfb_page *page = xenfb->c.page; in xenfb_queue_full()
681 prod = page->in_prod; in xenfb_queue_full()
682 cons = page->in_cons; in xenfb_queue_full()
683 return prod - cons == XENFB_IN_RING_LEN; in xenfb_queue_full()
689 struct xenfb_page *page = xenfb->c.page; in xenfb_send_event()
691 prod = page->in_prod; in xenfb_send_event()
696 page->in_prod = prod + 1; in xenfb_send_event()
698 xen_pv_send_notify(&xenfb->c.xendev); in xenfb_send_event()
727 if (xenfb->c.xendev.be_state != XenbusStateConnected) in xenfb_update()
730 if (!xenfb->feature_update) { in xenfb_update()
733 xenfb->up_fullscreen = 1; in xenfb_update()
737 if (xenfb->do_resize) { in xenfb_update()
740 xenfb->do_resize = 0; in xenfb_update()
741 switch (xenfb->depth) { in xenfb_update()
744 /* console.c supported depth -> buffer can be used directly */ in xenfb_update()
745 format = qemu_default_pixman_format(xenfb->depth, true); in xenfb_update()
747 (xenfb->width, xenfb->height, format, in xenfb_update()
748 xenfb->row_stride, xenfb->pixels + xenfb->offset); in xenfb_update()
752 surface = qemu_create_displaysurface(xenfb->width, xenfb->height); in xenfb_update()
755 dpy_gfx_replace_surface(xenfb->con, surface); in xenfb_update()
756 xen_pv_printf(&xenfb->c.xendev, 1, in xenfb_update()
758 xenfb->width, xenfb->height, xenfb->depth, in xenfb_update()
761 xenfb->up_fullscreen = 1; in xenfb_update()
765 if (xenfb->up_fullscreen) { in xenfb_update()
766 xen_pv_printf(&xenfb->c.xendev, 3, "update: fullscreen\n"); in xenfb_update()
767 xenfb_guest_copy(xenfb, 0, 0, xenfb->width, xenfb->height); in xenfb_update()
768 } else if (xenfb->up_count) { in xenfb_update()
769 xen_pv_printf(&xenfb->c.xendev, 3, "update: %d rects\n", in xenfb_update()
770 xenfb->up_count); in xenfb_update()
771 for (i = 0; i < xenfb->up_count; i++) in xenfb_update()
773 xenfb->up_rects[i].x, in xenfb_update()
774 xenfb->up_rects[i].y, in xenfb_update()
775 xenfb->up_rects[i].w, in xenfb_update()
776 xenfb->up_rects[i].h); in xenfb_update()
778 xen_pv_printf(&xenfb->c.xendev, 3, "update: nothing\n"); in xenfb_update()
780 xenfb->up_count = 0; in xenfb_update()
781 xenfb->up_fullscreen = 0; in xenfb_update()
789 if (xenfb->feature_update) { in xenfb_ui_info()
795 refresh_rate = info->refresh_rate; in xenfb_ui_info()
810 xenfb->up_fullscreen = 1; in xenfb_invalidate()
816 struct xenfb_page *page = xenfb->c.page; in xenfb_handle_events()
818 prod = page->out_prod; in xenfb_handle_events()
819 out_cons = page->out_cons; in xenfb_handle_events()
820 if (prod - out_cons > XENFB_OUT_RING_LEN) { in xenfb_handle_events()
826 uint8_t type = event->type; in xenfb_handle_events()
831 if (xenfb->up_count == UP_QUEUE) in xenfb_handle_events()
832 xenfb->up_fullscreen = 1; in xenfb_handle_events()
833 if (xenfb->up_fullscreen) in xenfb_handle_events()
835 x = MAX(event->update.x, 0); in xenfb_handle_events()
836 y = MAX(event->update.y, 0); in xenfb_handle_events()
837 w = MIN(event->update.width, xenfb->width - x); in xenfb_handle_events()
838 h = MIN(event->update.height, xenfb->height - y); in xenfb_handle_events()
840 xen_pv_printf(&xenfb->c.xendev, 1, "bogus update ignored\n"); in xenfb_handle_events()
843 if (x != event->update.x || in xenfb_handle_events()
844 y != event->update.y || in xenfb_handle_events()
845 w != event->update.width || in xenfb_handle_events()
846 h != event->update.height) { in xenfb_handle_events()
847 xen_pv_printf(&xenfb->c.xendev, 1, "bogus update clipped\n"); in xenfb_handle_events()
849 if (w == xenfb->width && h > xenfb->height / 2) { in xenfb_handle_events()
852 xenfb->up_fullscreen = 1; in xenfb_handle_events()
854 xenfb->up_rects[xenfb->up_count].x = x; in xenfb_handle_events()
855 xenfb->up_rects[xenfb->up_count].y = y; in xenfb_handle_events()
856 xenfb->up_rects[xenfb->up_count].w = w; in xenfb_handle_events()
857 xenfb->up_rects[xenfb->up_count].h = h; in xenfb_handle_events()
858 xenfb->up_count++; in xenfb_handle_events()
863 if (xenfb_configure_fb(xenfb, xenfb->fb_len, in xenfb_handle_events()
864 event->resize.width, in xenfb_handle_events()
865 event->resize.height, in xenfb_handle_events()
866 event->resize.depth, in xenfb_handle_events()
867 xenfb->fb_len, in xenfb_handle_events()
868 event->resize.offset, in xenfb_handle_events()
869 event->resize.stride) < 0) in xenfb_handle_events()
877 page->out_cons = cons; in xenfb_handle_events()
883 xenstore_write_be_int(xendev, "feature-resize", 1); in fb_init()
895 if (xenstore_read_fe_int(xendev, "videoram", &videoram) == -1) in fb_initialise()
898 rc = common_bind(&fb->c); in fb_initialise()
902 fb_page = fb->c.page; in fb_initialise()
904 fb_page->width, fb_page->height, fb_page->depth, in fb_initialise()
905 fb_page->mem_length, 0, fb_page->line_length); in fb_initialise()
913 fb->con = graphic_console_init(NULL, 0, &xenfb_ops, fb); in fb_initialise()
915 if (xenstore_read_fe_int(xendev, "feature-update", &fb->feature_update) == -1) in fb_initialise()
916 fb->feature_update = 0; in fb_initialise()
917 if (fb->feature_update) in fb_initialise()
918 xenstore_write_be_int(xendev, "request-update", 1); in fb_initialise()
920 xen_pv_printf(xendev, 1, "feature-update=%d, videoram=%d\n", in fb_initialise()
921 fb->feature_update, videoram); in fb_initialise()
930 * FIXME: qemu can't un-init gfx display (yet?). in fb_disconnect()
934 qemu_xen_foreignmem_unmap(fb->pixels, fb->fbpages); in fb_disconnect()
935 fb->pixels = mmap(fb->pixels, fb->fbpages * XEN_PAGE_SIZE, in fb_disconnect()
937 -1, 0); in fb_disconnect()
938 if (fb->pixels == MAP_FAILED) { in fb_disconnect()
943 common_unbind(&fb->c); in fb_disconnect()
944 fb->feature_update = 0; in fb_disconnect()
945 fb->bug_trigger = 0; in fb_disconnect()
958 if (fb->bug_trigger == 0 && strcmp(node, "state") == 0 && in fb_frontend_changed()
959 xendev->fe_state == XenbusStateConnected && in fb_frontend_changed()
960 xendev->be_state == XenbusStateConnected) { in fb_frontend_changed()
961 xen_pv_printf(xendev, 2, "re-trigger connected (frontend bug)\n"); in fb_frontend_changed()
963 fb->bug_trigger = 1; /* only once */ in fb_frontend_changed()
972 xen_pv_send_notify(&xenfb->c.xendev); in fb_event()
975 /* -------------------------------------------------------------------- */