Lines Matching full:info
75 static void xenfb_send_event(struct xenfb_info *info, in xenfb_send_event() argument
80 prod = info->page->out_prod; in xenfb_send_event()
83 XENFB_OUT_RING_REF(info->page, prod) = *event; in xenfb_send_event()
85 info->page->out_prod = prod + 1; in xenfb_send_event()
87 notify_remote_via_irq(info->irq); in xenfb_send_event()
90 static void xenfb_do_update(struct xenfb_info *info, in xenfb_do_update() argument
103 xenfb_send_event(info, &event); in xenfb_do_update()
106 static void xenfb_do_resize(struct xenfb_info *info) in xenfb_do_resize() argument
111 event.resize = info->resize; in xenfb_do_resize()
114 xenfb_send_event(info, &event); in xenfb_do_resize()
117 static int xenfb_queue_full(struct xenfb_info *info) in xenfb_queue_full() argument
121 prod = info->page->out_prod; in xenfb_queue_full()
122 cons = info->page->out_cons; in xenfb_queue_full()
126 static void xenfb_handle_resize_dpy(struct xenfb_info *info) in xenfb_handle_resize_dpy() argument
130 spin_lock_irqsave(&info->resize_lock, flags); in xenfb_handle_resize_dpy()
131 if (info->resize_dpy) { in xenfb_handle_resize_dpy()
132 if (!xenfb_queue_full(info)) { in xenfb_handle_resize_dpy()
133 info->resize_dpy = 0; in xenfb_handle_resize_dpy()
134 xenfb_do_resize(info); in xenfb_handle_resize_dpy()
137 spin_unlock_irqrestore(&info->resize_lock, flags); in xenfb_handle_resize_dpy()
140 static void xenfb_refresh(struct xenfb_info *info, in xenfb_refresh() argument
147 xenfb_handle_resize_dpy(info); in xenfb_refresh()
149 if (!info->update_wanted) in xenfb_refresh()
152 spin_lock_irqsave(&info->dirty_lock, flags); in xenfb_refresh()
155 if (info->y1 < y1) in xenfb_refresh()
156 y1 = info->y1; in xenfb_refresh()
157 if (info->y2 > y2) in xenfb_refresh()
158 y2 = info->y2; in xenfb_refresh()
159 if (info->x1 < x1) in xenfb_refresh()
160 x1 = info->x1; in xenfb_refresh()
161 if (info->x2 > x2) in xenfb_refresh()
162 x2 = info->x2; in xenfb_refresh()
164 if (xenfb_queue_full(info)) { in xenfb_refresh()
166 info->x1 = x1; in xenfb_refresh()
167 info->x2 = x2; in xenfb_refresh()
168 info->y1 = y1; in xenfb_refresh()
169 info->y2 = y2; in xenfb_refresh()
170 spin_unlock_irqrestore(&info->dirty_lock, flags); in xenfb_refresh()
175 info->x1 = info->y1 = INT_MAX; in xenfb_refresh()
176 info->x2 = info->y2 = 0; in xenfb_refresh()
178 spin_unlock_irqrestore(&info->dirty_lock, flags); in xenfb_refresh()
181 xenfb_do_update(info, x1, y1, x2 - x1 + 1, y2 - y1 + 1); in xenfb_refresh()
187 struct xenfb_info *info = fb_info->par; in xenfb_deferred_io() local
206 xenfb_refresh(info, 0, miny, fb_info->var.xres, maxy - miny + 1); in xenfb_deferred_io()
216 struct fb_info *info) in xenfb_setcolreg() argument
220 if (regno > info->cmap.len) in xenfb_setcolreg()
224 red = CNVT_TOHW(red, info->var.red.length); in xenfb_setcolreg()
225 green = CNVT_TOHW(green, info->var.green.length); in xenfb_setcolreg()
226 blue = CNVT_TOHW(blue, info->var.blue.length); in xenfb_setcolreg()
227 transp = CNVT_TOHW(transp, info->var.transp.length); in xenfb_setcolreg()
230 v = (red << info->var.red.offset) | in xenfb_setcolreg()
231 (green << info->var.green.offset) | in xenfb_setcolreg()
232 (blue << info->var.blue.offset); in xenfb_setcolreg()
234 switch (info->var.bits_per_pixel) { in xenfb_setcolreg()
238 ((u32 *)info->pseudo_palette)[regno] = v; in xenfb_setcolreg()
247 struct xenfb_info *info = p->par; in xenfb_fillrect() local
250 xenfb_refresh(info, rect->dx, rect->dy, rect->width, rect->height); in xenfb_fillrect()
255 struct xenfb_info *info = p->par; in xenfb_imageblit() local
258 xenfb_refresh(info, image->dx, image->dy, image->width, image->height); in xenfb_imageblit()
263 struct xenfb_info *info = p->par; in xenfb_copyarea() local
266 xenfb_refresh(info, area->dx, area->dy, area->width, area->height); in xenfb_copyarea()
272 struct xenfb_info *info = p->par; in xenfb_write() local
276 xenfb_refresh(info, 0, 0, info->page->width, info->page->height); in xenfb_write()
281 xenfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) in xenfb_check_var() argument
286 xenfb_info = info->par; in xenfb_check_var()
303 var->xres <= info->fix.line_length / (XENFB_DEPTH / 8) && in xenfb_check_var()
304 required_mem_len <= info->fix.smem_len) { in xenfb_check_var()
312 static int xenfb_set_par(struct fb_info *info) in xenfb_set_par() argument
317 xenfb_info = info->par; in xenfb_set_par()
321 xenfb_info->resize.width = info->var.xres; in xenfb_set_par()
322 xenfb_info->resize.height = info->var.yres; in xenfb_set_par()
323 xenfb_info->resize.stride = info->fix.line_length; in xenfb_set_par()
324 xenfb_info->resize.depth = info->var.bits_per_pixel; in xenfb_set_par()
350 struct xenfb_info *info = dev_id; in xenfb_event_handler() local
351 struct xenfb_page *page = info->page; in xenfb_event_handler()
354 info->page->in_cons = info->page->in_prod; in xenfb_event_handler()
355 notify_remote_via_irq(info->irq); in xenfb_event_handler()
359 xenfb_refresh(info, INT_MAX, INT_MAX, -INT_MAX, -INT_MAX); in xenfb_event_handler()
367 struct xenfb_info *info; in xenfb_probe() local
373 info = kzalloc(sizeof(*info), GFP_KERNEL); in xenfb_probe()
374 if (info == NULL) { in xenfb_probe()
375 xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure"); in xenfb_probe()
402 dev_set_drvdata(&dev->dev, info); in xenfb_probe()
403 info->xbdev = dev; in xenfb_probe()
404 info->irq = -1; in xenfb_probe()
405 info->x1 = info->y1 = INT_MAX; in xenfb_probe()
406 spin_lock_init(&info->dirty_lock); in xenfb_probe()
407 spin_lock_init(&info->resize_lock); in xenfb_probe()
409 info->fb = vzalloc(fb_size); in xenfb_probe()
410 if (info->fb == NULL) in xenfb_probe()
413 info->nr_pages = (fb_size + PAGE_SIZE - 1) >> PAGE_SHIFT; in xenfb_probe()
415 info->gfns = vmalloc(array_size(sizeof(unsigned long), info->nr_pages)); in xenfb_probe()
416 if (!info->gfns) in xenfb_probe()
420 info->page = (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); in xenfb_probe()
421 if (!info->page) in xenfb_probe()
431 fb_info->par = info; in xenfb_probe()
433 fb_info->screen_base = info->fb; in xenfb_probe()
469 xenfb_init_shared_page(info, fb_info); in xenfb_probe()
471 ret = xenfb_connect_backend(dev, info); in xenfb_probe()
482 info->fb_info = fb_info; in xenfb_probe()
524 struct xenfb_info *info = dev_get_drvdata(&dev->dev); in xenfb_resume() local
526 xenfb_disconnect_backend(info); in xenfb_resume()
527 xenfb_init_shared_page(info, info->fb_info); in xenfb_resume()
528 return xenfb_connect_backend(dev, info); in xenfb_resume()
533 struct xenfb_info *info = dev_get_drvdata(&dev->dev); in xenfb_remove() local
535 xenfb_disconnect_backend(info); in xenfb_remove()
536 if (info->fb_info) { in xenfb_remove()
537 fb_deferred_io_cleanup(info->fb_info); in xenfb_remove()
538 unregister_framebuffer(info->fb_info); in xenfb_remove()
539 fb_dealloc_cmap(&info->fb_info->cmap); in xenfb_remove()
540 framebuffer_release(info->fb_info); in xenfb_remove()
542 free_page((unsigned long)info->page); in xenfb_remove()
543 vfree(info->gfns); in xenfb_remove()
544 vfree(info->fb); in xenfb_remove()
545 kfree(info); in xenfb_remove()
555 static void xenfb_init_shared_page(struct xenfb_info *info, in xenfb_init_shared_page() argument
559 int epd = PAGE_SIZE / sizeof(info->gfns[0]); in xenfb_init_shared_page()
561 for (i = 0; i < info->nr_pages; i++) in xenfb_init_shared_page()
562 info->gfns[i] = vmalloc_to_gfn(info->fb + i * PAGE_SIZE); in xenfb_init_shared_page()
564 for (i = 0; i * epd < info->nr_pages; i++) in xenfb_init_shared_page()
565 info->page->pd[i] = vmalloc_to_gfn(&info->gfns[i * epd]); in xenfb_init_shared_page()
567 info->page->width = fb_info->var.xres; in xenfb_init_shared_page()
568 info->page->height = fb_info->var.yres; in xenfb_init_shared_page()
569 info->page->depth = fb_info->var.bits_per_pixel; in xenfb_init_shared_page()
570 info->page->line_length = fb_info->fix.line_length; in xenfb_init_shared_page()
571 info->page->mem_length = fb_info->fix.smem_len; in xenfb_init_shared_page()
572 info->page->in_cons = info->page->in_prod = 0; in xenfb_init_shared_page()
573 info->page->out_cons = info->page->out_prod = 0; in xenfb_init_shared_page()
577 struct xenfb_info *info) in xenfb_connect_backend() argument
586 0, dev->devicetype, info); in xenfb_connect_backend()
599 virt_to_gfn(info->page)); in xenfb_connect_backend()
622 info->irq = irq; in xenfb_connect_backend()
629 unbind_from_irqhandler(irq, info); in xenfb_connect_backend()
633 static void xenfb_disconnect_backend(struct xenfb_info *info) in xenfb_disconnect_backend() argument
636 info->update_wanted = 0; in xenfb_disconnect_backend()
637 if (info->irq >= 0) in xenfb_disconnect_backend()
638 unbind_from_irqhandler(info->irq, info); in xenfb_disconnect_backend()
639 info->irq = -1; in xenfb_disconnect_backend()
645 struct xenfb_info *info = dev_get_drvdata(&dev->dev); in xenfb_backend_changed() local
669 if (xenbus_read_unsigned(info->xbdev->otherend, in xenfb_backend_changed()
671 info->update_wanted = 1; in xenfb_backend_changed()
673 info->feature_resize = xenbus_read_unsigned(dev->otherend, in xenfb_backend_changed()