• Home
  • Raw
  • Download

Lines Matching +full:enforce +full:- +full:video +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
3 * udlfb.c -- Framebuffer driver for DisplayLink USB controller
10 * usb-skeleton by GregKH.
12 * Device-specific portions based on information from Displaylink, with work
27 #include <video/udlfb.h>
48 * There are many DisplayLink-based graphics products, all with unique PIDs.
49 * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
114 * ----- -----------------------------
200 while (actual_count--) { in dlfb_lfsr16()
219 * This takes a standard fbdev screeninfo struct and all of its monitor mode
229 xds = var->left_margin + var->hsync_len; in dlfb_set_vid_cmds()
232 xde = xds + var->xres; in dlfb_set_vid_cmds()
236 yds = var->upper_margin + var->vsync_len; in dlfb_set_vid_cmds()
239 yde = yds + var->yres; in dlfb_set_vid_cmds()
242 /* x end count is active + blanking - 1 */ in dlfb_set_vid_cmds()
244 xde + var->right_margin - 1); in dlfb_set_vid_cmds()
250 wrptr = dlfb_set_register_lfsr16(wrptr, 0x0D, var->hsync_len + 1); in dlfb_set_vid_cmds()
253 wrptr = dlfb_set_register_16(wrptr, 0x0F, var->xres); in dlfb_set_vid_cmds()
256 yec = var->yres + var->upper_margin + var->lower_margin + in dlfb_set_vid_cmds()
257 var->vsync_len; in dlfb_set_vid_cmds()
264 wrptr = dlfb_set_register_lfsr16(wrptr, 0x15, var->vsync_len); in dlfb_set_vid_cmds()
267 wrptr = dlfb_set_register_16(wrptr, 0x17, var->yres); in dlfb_set_vid_cmds()
271 200*1000*1000/var->pixclock); in dlfb_set_vid_cmds()
290 if (!atomic_read(&dlfb->usb_active)) in dlfb_set_video_mode()
291 return -EPERM; in dlfb_set_video_mode()
295 return -ENOMEM; in dlfb_set_video_mode()
297 buf = (char *) urb->transfer_buffer; in dlfb_set_video_mode()
309 wrptr = dlfb_set_base8bpp(wrptr, dlfb->info->fix.smem_len); in dlfb_set_video_mode()
315 writesize = wrptr - buf; in dlfb_set_video_mode()
319 dlfb->blank_mode = FB_BLANK_UNBLANK; in dlfb_set_video_mode()
326 unsigned long start = vma->vm_start; in dlfb_ops_mmap()
327 unsigned long size = vma->vm_end - vma->vm_start; in dlfb_ops_mmap()
328 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; in dlfb_ops_mmap()
331 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) in dlfb_ops_mmap()
332 return -EINVAL; in dlfb_ops_mmap()
333 if (size > info->fix.smem_len) in dlfb_ops_mmap()
334 return -EINVAL; in dlfb_ops_mmap()
335 if (offset > info->fix.smem_len - size) in dlfb_ops_mmap()
336 return -EINVAL; in dlfb_ops_mmap()
338 pos = (unsigned long)info->fix.smem_start + offset; in dlfb_ops_mmap()
340 dev_dbg(info->dev, "mmap() framebuffer addr:%lu size:%lu\n", in dlfb_ops_mmap()
346 return -EAGAIN; in dlfb_ops_mmap()
351 size -= PAGE_SIZE; in dlfb_ops_mmap()
383 for (k = width - 1; k > j; k--) { in dlfb_trim_hline()
390 identical = start + (width - end); in dlfb_trim_hline()
392 *width_bytes = (end - start) * sizeof(unsigned long); in dlfb_trim_hline()
402 * (the protocol doesn't require this, but we enforce it to allow
438 (cmd_buffer_end - MIN_RLX_CMD_BYTES > cmd)) { in dlfb_compress_hline()
465 (unsigned long)(pixel_end - pixel), in dlfb_compress_hline()
466 (unsigned long)(cmd_buffer_end - 1 - cmd) / BPP); in dlfb_compress_hline()
470 while (cmd_pixel_end - 1 > pixel && in dlfb_compress_hline()
471 *(cmd_pixel_end - 1) == *(u16 *)((u8 *)(cmd_pixel_end - 1) + back_buffer_offset)) in dlfb_compress_hline()
472 cmd_pixel_end--; in dlfb_compress_hline()
488 *raw_pixels_count_byte = ((repeating_pixel - in dlfb_compress_hline()
499 *cmd++ = ((pixel - repeating_pixel) - 1) & 0xFF; in dlfb_compress_hline()
509 *raw_pixels_count_byte = (pixel-raw_pixel_start) & 0xFF; in dlfb_compress_hline()
512 cmd--; in dlfb_compress_hline()
515 *cmd_pixels_count_byte = (pixel - cmd_pixel_start) & 0xFF; in dlfb_compress_hline()
516 dev_addr += (u8 *)pixel - (u8 *)cmd_pixel_start; in dlfb_compress_hline()
519 if (cmd_buffer_end - MIN_RLX_CMD_BYTES <= cmd) { in dlfb_compress_hline()
520 /* Fill leftover bytes with no-ops */ in dlfb_compress_hline()
522 memset(cmd, 0xAF, cmd_buffer_end - cmd); in dlfb_compress_hline()
543 u32 dev_addr = dlfb->base16 + byte_offset; in dlfb_render_hline()
546 u8 *cmd_end = (u8 *) urb->transfer_buffer + urb->transfer_buffer_length; in dlfb_render_hline()
553 if (dlfb->backing_buffer) { in dlfb_render_hline()
555 const u8 *back_start = (u8 *) (dlfb->backing_buffer in dlfb_render_hline()
558 back_buffer_offset = (unsigned long)back_start - (unsigned long)line_start; in dlfb_render_hline()
563 offset = next_pixel - line_start; in dlfb_render_hline()
578 int len = cmd - (u8 *) urb->transfer_buffer; in dlfb_render_hline()
586 cmd = urb->transfer_buffer; in dlfb_render_hline()
587 cmd_end = &cmd[urb->transfer_buffer_length]; in dlfb_render_hline()
608 mutex_lock(&dlfb->render_mutex); in dlfb_handle_damage()
611 width = DL_ALIGN_UP(width + (x-aligned_x), sizeof(unsigned long)); in dlfb_handle_damage()
615 (x + width > dlfb->info->var.xres) || in dlfb_handle_damage()
616 (y + height > dlfb->info->var.yres)) { in dlfb_handle_damage()
617 ret = -EINVAL; in dlfb_handle_damage()
621 if (!atomic_read(&dlfb->usb_active)) { in dlfb_handle_damage()
631 cmd = urb->transfer_buffer; in dlfb_handle_damage()
634 const int line_offset = dlfb->info->fix.line_length * i; in dlfb_handle_damage()
638 (char *) dlfb->info->fix.smem_start, in dlfb_handle_damage()
644 if (cmd > (char *) urb->transfer_buffer) { in dlfb_handle_damage()
646 if (cmd < (char *) urb->transfer_buffer + urb->transfer_buffer_length) in dlfb_handle_damage()
649 len = cmd - (char *) urb->transfer_buffer; in dlfb_handle_damage()
656 atomic_add(bytes_sent, &dlfb->bytes_sent); in dlfb_handle_damage()
657 atomic_add(bytes_identical, &dlfb->bytes_identical); in dlfb_handle_damage()
658 atomic_add(width*height*2, &dlfb->bytes_rendered); in dlfb_handle_damage()
660 atomic_add(((unsigned int) ((end_cycles - start_cycles) in dlfb_handle_damage()
662 &dlfb->cpu_kcycles_used); in dlfb_handle_damage()
667 mutex_unlock(&dlfb->render_mutex); in dlfb_handle_damage()
673 dlfb->damage_x = INT_MAX; in dlfb_init_damage()
674 dlfb->damage_x2 = 0; in dlfb_init_damage()
675 dlfb->damage_y = INT_MAX; in dlfb_init_damage()
676 dlfb->damage_y2 = 0; in dlfb_init_damage()
684 spin_lock_irq(&dlfb->damage_lock); in dlfb_damage_work()
685 x = dlfb->damage_x; in dlfb_damage_work()
686 x2 = dlfb->damage_x2; in dlfb_damage_work()
687 y = dlfb->damage_y; in dlfb_damage_work()
688 y2 = dlfb->damage_y2; in dlfb_damage_work()
690 spin_unlock_irq(&dlfb->damage_lock); in dlfb_damage_work()
693 dlfb_handle_damage(dlfb, x, y, x2 - x, y2 - y); in dlfb_damage_work()
705 spin_lock_irqsave(&dlfb->damage_lock, flags); in dlfb_offload_damage()
706 dlfb->damage_x = min(x, dlfb->damage_x); in dlfb_offload_damage()
707 dlfb->damage_x2 = max(x2, dlfb->damage_x2); in dlfb_offload_damage()
708 dlfb->damage_y = min(y, dlfb->damage_y); in dlfb_offload_damage()
709 dlfb->damage_y2 = max(y2, dlfb->damage_y2); in dlfb_offload_damage()
710 spin_unlock_irqrestore(&dlfb->damage_lock, flags); in dlfb_offload_damage()
712 schedule_work(&dlfb->damage_work); in dlfb_offload_damage()
718 * Not used by X Windows or text-mode console. But useful for testing.
725 struct dlfb_data *dlfb = info->par; in dlfb_ops_write()
731 int start = max((int)(offset / info->fix.line_length), 0); in dlfb_ops_write()
732 int lines = min((u32)((result / info->fix.line_length) + 1), in dlfb_ops_write()
733 (u32)info->var.yres); in dlfb_ops_write()
735 dlfb_handle_damage(dlfb, 0, start, info->var.xres, in dlfb_ops_write()
747 struct dlfb_data *dlfb = info->par; in dlfb_ops_copyarea()
751 dlfb_offload_damage(dlfb, area->dx, area->dy, in dlfb_ops_copyarea()
752 area->width, area->height); in dlfb_ops_copyarea()
758 struct dlfb_data *dlfb = info->par; in dlfb_ops_imageblit()
762 dlfb_offload_damage(dlfb, image->dx, image->dy, in dlfb_ops_imageblit()
763 image->width, image->height); in dlfb_ops_imageblit()
769 struct dlfb_data *dlfb = info->par; in dlfb_ops_fillrect()
773 dlfb_offload_damage(dlfb, rect->dx, rect->dy, rect->width, in dlfb_ops_fillrect()
774 rect->height); in dlfb_ops_fillrect()
778 * NOTE: fb_defio.c is holding info->fbdefio.mutex
787 struct fb_deferred_io *fbdefio = info->fbdefio; in dlfb_dpy_deferred_io()
788 struct dlfb_data *dlfb = info->par; in dlfb_dpy_deferred_io()
796 mutex_lock(&dlfb->render_mutex); in dlfb_dpy_deferred_io()
801 if (!atomic_read(&dlfb->usb_active)) in dlfb_dpy_deferred_io()
810 cmd = urb->transfer_buffer; in dlfb_dpy_deferred_io()
813 list_for_each_entry(cur, &fbdefio->pagelist, lru) { in dlfb_dpy_deferred_io()
815 if (dlfb_render_hline(dlfb, &urb, (char *) info->fix.smem_start, in dlfb_dpy_deferred_io()
816 &cmd, cur->index << PAGE_SHIFT, in dlfb_dpy_deferred_io()
822 if (cmd > (char *) urb->transfer_buffer) { in dlfb_dpy_deferred_io()
824 if (cmd < (char *) urb->transfer_buffer + urb->transfer_buffer_length) in dlfb_dpy_deferred_io()
827 len = cmd - (char *) urb->transfer_buffer; in dlfb_dpy_deferred_io()
834 atomic_add(bytes_sent, &dlfb->bytes_sent); in dlfb_dpy_deferred_io()
835 atomic_add(bytes_identical, &dlfb->bytes_identical); in dlfb_dpy_deferred_io()
836 atomic_add(bytes_rendered, &dlfb->bytes_rendered); in dlfb_dpy_deferred_io()
838 atomic_add(((unsigned int) ((end_cycles - start_cycles) in dlfb_dpy_deferred_io()
840 &dlfb->cpu_kcycles_used); in dlfb_dpy_deferred_io()
842 mutex_unlock(&dlfb->render_mutex); in dlfb_dpy_deferred_io()
855 ret = usb_control_msg(dlfb->udev, in dlfb_get_edid()
856 usb_rcvctrlpipe(dlfb->udev, 0), 0x02, in dlfb_get_edid()
860 dev_err(&dlfb->udev->dev, in dlfb_get_edid()
862 i--; in dlfb_get_edid()
877 struct dlfb_data *dlfb = info->par; in dlfb_ops_ioctl()
879 if (!atomic_read(&dlfb->usb_active)) in dlfb_ops_ioctl()
885 if (copy_to_user(edid, dlfb->edid, dlfb->edid_size)) in dlfb_ops_ioctl()
886 return -EFAULT; in dlfb_ops_ioctl()
896 return -EFAULT; in dlfb_ops_ioctl()
899 * If we have a damage-aware client, turn fb_defio "off" in dlfb_ops_ioctl()
905 if (info->fbdefio) in dlfb_ops_ioctl()
906 info->fbdefio->delay = DL_DEFIO_WRITE_DISABLE; in dlfb_ops_ioctl()
911 if (area.x > info->var.xres) in dlfb_ops_ioctl()
912 area.x = info->var.xres; in dlfb_ops_ioctl()
917 if (area.y > info->var.yres) in dlfb_ops_ioctl()
918 area.y = info->var.yres; in dlfb_ops_ioctl()
933 if (regno >= info->cmap.len) in dlfb_ops_setcolreg()
937 if (info->var.red.offset == 10) { in dlfb_ops_setcolreg()
939 ((u32 *) (info->pseudo_palette))[regno] = in dlfb_ops_setcolreg()
944 ((u32 *) (info->pseudo_palette))[regno] = in dlfb_ops_setcolreg()
956 * Assumes caller is holding info->lock (for open and release at least)
960 struct dlfb_data *dlfb = info->par; in dlfb_ops_open()
968 return -EBUSY; in dlfb_ops_open()
971 if (dlfb->virtualized) in dlfb_ops_open()
972 return -ENODEV; in dlfb_ops_open()
974 dlfb->fb_count++; in dlfb_ops_open()
976 if (fb_defio && (info->fbdefio == NULL)) { in dlfb_ops_open()
984 fbdefio->delay = DL_DEFIO_WRITE_DELAY; in dlfb_ops_open()
985 fbdefio->deferred_io = dlfb_dpy_deferred_io; in dlfb_ops_open()
988 info->fbdefio = fbdefio; in dlfb_ops_open()
992 dev_dbg(info->dev, "open, user=%d fb_info=%p count=%d\n", in dlfb_ops_open()
993 user, info, dlfb->fb_count); in dlfb_ops_open()
1000 struct dlfb_data *dlfb = info->par; in dlfb_ops_destroy()
1002 cancel_work_sync(&dlfb->damage_work); in dlfb_ops_destroy()
1004 mutex_destroy(&dlfb->render_mutex); in dlfb_ops_destroy()
1006 if (info->cmap.len != 0) in dlfb_ops_destroy()
1007 fb_dealloc_cmap(&info->cmap); in dlfb_ops_destroy()
1008 if (info->monspecs.modedb) in dlfb_ops_destroy()
1009 fb_destroy_modedb(info->monspecs.modedb); in dlfb_ops_destroy()
1010 vfree(info->screen_base); in dlfb_ops_destroy()
1012 fb_destroy_modelist(&info->modelist); in dlfb_ops_destroy()
1014 while (!list_empty(&dlfb->deferred_free)) { in dlfb_ops_destroy()
1015 …struct dlfb_deferred_free *d = list_entry(dlfb->deferred_free.next, struct dlfb_deferred_free, lis… in dlfb_ops_destroy()
1016 list_del(&d->list); in dlfb_ops_destroy()
1017 vfree(d->mem); in dlfb_ops_destroy()
1020 vfree(dlfb->backing_buffer); in dlfb_ops_destroy()
1021 kfree(dlfb->edid); in dlfb_ops_destroy()
1023 usb_put_dev(dlfb->udev); in dlfb_ops_destroy()
1031 * Assumes caller is holding info->lock mutex (for open and release at least)
1035 struct dlfb_data *dlfb = info->par; in dlfb_ops_release()
1037 dlfb->fb_count--; in dlfb_ops_release()
1039 if ((dlfb->fb_count == 0) && (info->fbdefio)) { in dlfb_ops_release()
1041 kfree(info->fbdefio); in dlfb_ops_release()
1042 info->fbdefio = NULL; in dlfb_ops_release()
1045 dev_dbg(info->dev, "release, user=%d count=%d\n", user, dlfb->fb_count); in dlfb_ops_release()
1051 * Check whether a video mode is supported by the DisplayLink chip
1054 static int dlfb_is_valid_mode(struct fb_videomode *mode, struct dlfb_data *dlfb) in dlfb_is_valid_mode() argument
1056 if (mode->xres * mode->yres > dlfb->sku_pixel_limit) in dlfb_is_valid_mode()
1068 var->bits_per_pixel = 16; in dlfb_var_color_format()
1069 var->red = red; in dlfb_var_color_format()
1070 var->green = green; in dlfb_var_color_format()
1071 var->blue = blue; in dlfb_var_color_format()
1077 struct fb_videomode mode; in dlfb_ops_check_var() local
1078 struct dlfb_data *dlfb = info->par; in dlfb_ops_check_var()
1080 /* set device-specific elements of var unrelated to mode */ in dlfb_ops_check_var()
1083 fb_var_to_videomode(&mode, var); in dlfb_ops_check_var()
1085 if (!dlfb_is_valid_mode(&mode, dlfb)) in dlfb_ops_check_var()
1086 return -EINVAL; in dlfb_ops_check_var()
1093 struct dlfb_data *dlfb = info->par; in dlfb_ops_set_par()
1098 u32 line_length = info->var.xres * (info->var.bits_per_pixel / 8); in dlfb_ops_set_par()
1101 fvs = info->var; in dlfb_ops_set_par()
1105 if (!memcmp(&dlfb->current_mode, &fvs, sizeof(struct fb_var_screeninfo))) in dlfb_ops_set_par()
1108 result = dlfb_realloc_framebuffer(dlfb, info, info->var.yres * line_length); in dlfb_ops_set_par()
1112 result = dlfb_set_video_mode(dlfb, &info->var); in dlfb_ops_set_par()
1117 dlfb->current_mode = fvs; in dlfb_ops_set_par()
1118 info->fix.line_length = line_length; in dlfb_ops_set_par()
1120 if (dlfb->fb_count == 0) { in dlfb_ops_set_par()
1124 pix_framebuffer = (u16 *) info->screen_base; in dlfb_ops_set_par()
1125 for (i = 0; i < info->fix.smem_len / 2; i++) in dlfb_ops_set_par()
1129 dlfb_handle_damage(dlfb, 0, 0, info->var.xres, info->var.yres); in dlfb_ops_set_par()
1150 * In order to come back from full DPMS off, we need to set the mode again
1154 struct dlfb_data *dlfb = info->par; in dlfb_ops_blank()
1158 dev_dbg(info->dev, "blank, mode %d --> %d\n", in dlfb_ops_blank()
1159 dlfb->blank_mode, blank_mode); in dlfb_ops_blank()
1161 if ((dlfb->blank_mode == FB_BLANK_POWERDOWN) && in dlfb_ops_blank()
1165 dlfb_set_video_mode(dlfb, &info->var); in dlfb_ops_blank()
1172 bufptr = (char *) urb->transfer_buffer; in dlfb_ops_blank()
1180 dlfb_submit_urb(dlfb, urb, bufptr - in dlfb_ops_blank()
1181 (char *) urb->transfer_buffer); in dlfb_ops_blank()
1183 dlfb->blank_mode = blank_mode; in dlfb_ops_blank()
1212 d->mem = mem; in dlfb_deferred_vfree()
1213 list_add(&d->list, &dlfb->deferred_free); in dlfb_deferred_vfree()
1217 * Assumes &info->lock held by caller
1222 u32 old_len = info->fix.smem_len; in dlfb_realloc_framebuffer()
1223 const void *old_fb = (const void __force *)info->screen_base; in dlfb_realloc_framebuffer()
1235 dev_err(info->dev, "Virtual framebuffer alloc failed\n"); in dlfb_realloc_framebuffer()
1236 return -ENOMEM; in dlfb_realloc_framebuffer()
1240 if (info->screen_base) { in dlfb_realloc_framebuffer()
1242 dlfb_deferred_vfree(dlfb, (void __force *)info->screen_base); in dlfb_realloc_framebuffer()
1245 info->screen_base = (char __iomem *)new_fb; in dlfb_realloc_framebuffer()
1246 info->fix.smem_len = new_len; in dlfb_realloc_framebuffer()
1247 info->fix.smem_start = (unsigned long) new_fb; in dlfb_realloc_framebuffer()
1248 info->flags = udlfb_info_flags; in dlfb_realloc_framebuffer()
1254 * that were, in fact, unchanged - wasting limited USB bandwidth in dlfb_realloc_framebuffer()
1259 dev_info(info->dev, in dlfb_realloc_framebuffer()
1262 dlfb_deferred_vfree(dlfb, dlfb->backing_buffer); in dlfb_realloc_framebuffer()
1263 dlfb->backing_buffer = new_back; in dlfb_realloc_framebuffer()
1272 * 3) Allocate virtual framebuffer memory to back highest res mode
1275 * fb_var_screeninfo contains the timing of the monitor's preferred mode
1280 * monspecs is NULL, and fb_var_screeninfo is set to safe VESA mode
1289 struct device *dev = info->device; in dlfb_setup_modes()
1290 struct fb_videomode *mode; in dlfb_setup_modes() local
1293 if (info->dev) { in dlfb_setup_modes()
1295 mutex_lock(&info->lock); in dlfb_setup_modes()
1297 dev = info->dev; in dlfb_setup_modes()
1302 result = -ENOMEM; in dlfb_setup_modes()
1306 fb_destroy_modelist(&info->modelist); in dlfb_setup_modes()
1307 memset(&info->monspecs, 0, sizeof(info->monspecs)); in dlfb_setup_modes()
1314 while (tries--) { in dlfb_setup_modes()
1319 fb_edid_to_monspecs(edid, &info->monspecs); in dlfb_setup_modes()
1321 if (info->monspecs.modedb_len > 0) { in dlfb_setup_modes()
1322 dlfb->edid = edid; in dlfb_setup_modes()
1323 dlfb->edid_size = i; in dlfb_setup_modes()
1329 if (info->monspecs.modedb_len == 0) { in dlfb_setup_modes()
1332 if (dlfb->edid) { in dlfb_setup_modes()
1333 fb_edid_to_monspecs(dlfb->edid, &info->monspecs); in dlfb_setup_modes()
1334 if (info->monspecs.modedb_len > 0) in dlfb_setup_modes()
1340 if (info->monspecs.modedb_len == 0) { in dlfb_setup_modes()
1342 fb_edid_to_monspecs(default_edid, &info->monspecs); in dlfb_setup_modes()
1343 if (info->monspecs.modedb_len > 0) { in dlfb_setup_modes()
1345 dlfb->edid = edid; in dlfb_setup_modes()
1346 dlfb->edid_size = default_edid_size; in dlfb_setup_modes()
1352 /* If we've got modes, let's pick a best default mode */ in dlfb_setup_modes()
1353 if (info->monspecs.modedb_len > 0) { in dlfb_setup_modes()
1355 for (i = 0; i < info->monspecs.modedb_len; i++) { in dlfb_setup_modes()
1356 mode = &info->monspecs.modedb[i]; in dlfb_setup_modes()
1357 if (dlfb_is_valid_mode(mode, dlfb)) { in dlfb_setup_modes()
1358 fb_add_videomode(mode, &info->modelist); in dlfb_setup_modes()
1360 dev_dbg(dev, "Specified mode %dx%d too big\n", in dlfb_setup_modes()
1361 mode->xres, mode->yres); in dlfb_setup_modes()
1363 /* if we've removed top/best mode */ in dlfb_setup_modes()
1364 info->monspecs.misc in dlfb_setup_modes()
1369 default_vmode = fb_find_best_display(&info->monspecs, in dlfb_setup_modes()
1370 &info->modelist); in dlfb_setup_modes()
1373 /* If everything else has failed, fall back to safe default mode */ in dlfb_setup_modes()
1385 mode = (struct fb_videomode *)&vesa_modes[i]; in dlfb_setup_modes()
1386 if (dlfb_is_valid_mode(mode, dlfb)) in dlfb_setup_modes()
1387 fb_add_videomode(mode, &info->modelist); in dlfb_setup_modes()
1389 dev_dbg(dev, "VESA mode %dx%d too big\n", in dlfb_setup_modes()
1390 mode->xres, mode->yres); in dlfb_setup_modes()
1401 &info->modelist); in dlfb_setup_modes()
1404 /* If we have good mode and no active clients*/ in dlfb_setup_modes()
1405 if ((default_vmode != NULL) && (dlfb->fb_count == 0)) { in dlfb_setup_modes()
1407 fb_videomode_to_var(&info->var, default_vmode); in dlfb_setup_modes()
1408 dlfb_var_color_format(&info->var); in dlfb_setup_modes()
1411 * with mode size info, we can now alloc our framebuffer. in dlfb_setup_modes()
1413 memcpy(&info->fix, &dlfb_fix, sizeof(dlfb_fix)); in dlfb_setup_modes()
1415 result = -EINVAL; in dlfb_setup_modes()
1418 if (edid && (dlfb->edid != edid)) in dlfb_setup_modes()
1421 if (info->dev) in dlfb_setup_modes()
1422 mutex_unlock(&info->lock); in dlfb_setup_modes()
1430 struct dlfb_data *dlfb = fb_info->par; in metrics_bytes_rendered_show()
1432 atomic_read(&dlfb->bytes_rendered)); in metrics_bytes_rendered_show()
1438 struct dlfb_data *dlfb = fb_info->par; in metrics_bytes_identical_show()
1440 atomic_read(&dlfb->bytes_identical)); in metrics_bytes_identical_show()
1446 struct dlfb_data *dlfb = fb_info->par; in metrics_bytes_sent_show()
1448 atomic_read(&dlfb->bytes_sent)); in metrics_bytes_sent_show()
1454 struct dlfb_data *dlfb = fb_info->par; in metrics_cpu_kcycles_used_show()
1456 atomic_read(&dlfb->cpu_kcycles_used)); in metrics_cpu_kcycles_used_show()
1465 struct dlfb_data *dlfb = fb_info->par; in edid_show()
1467 if (dlfb->edid == NULL) in edid_show()
1470 if ((off >= dlfb->edid_size) || (count > dlfb->edid_size)) in edid_show()
1473 if (off + count > dlfb->edid_size) in edid_show()
1474 count = dlfb->edid_size - off; in edid_show()
1476 memcpy(buf, dlfb->edid, count); in edid_show()
1487 struct dlfb_data *dlfb = fb_info->par; in edid_store()
1492 return -EINVAL; in edid_store()
1498 if (!dlfb->edid || memcmp(src, dlfb->edid, src_size)) in edid_store()
1499 return -EINVAL; in edid_store()
1513 struct dlfb_data *dlfb = fb_info->par; in metrics_reset_store()
1515 atomic_set(&dlfb->bytes_rendered, 0); in metrics_reset_store()
1516 atomic_set(&dlfb->bytes_identical, 0); in metrics_reset_store()
1517 atomic_set(&dlfb->bytes_sent, 0); in metrics_reset_store()
1518 atomic_set(&dlfb->cpu_kcycles_used, 0); in metrics_reset_store()
1525 .attr.mode = 0666,
1555 return -ENOMEM; in dlfb_select_std_channel()
1557 ret = usb_control_msg(dlfb->udev, usb_sndctrlpipe(dlfb->udev, 0), in dlfb_select_std_channel()
1586 if (0 == usb_get_extra_descriptor(intf->cur_altsetting, in dlfb_parse_vendor_descriptor()
1592 dev_info(&intf->dev, in dlfb_parse_vendor_descriptor()
1600 (desc[4] != total_len - 2)) /* length after type */ in dlfb_parse_vendor_descriptor()
1620 dev_warn(&intf->dev, in dlfb_parse_vendor_descriptor()
1623 dlfb->sku_pixel_limit = max_area; in dlfb_parse_vendor_descriptor()
1632 dev_info(&intf->dev, "vendor descriptor not available (%d)\n", in dlfb_parse_vendor_descriptor()
1640 dev_err(&intf->dev, "Unrecognized vendor firmware descriptor\n"); in dlfb_parse_vendor_descriptor()
1661 dev_err(&intf->dev, "%s: failed to allocate dlfb\n", __func__); in dlfb_usb_probe()
1662 return -ENOMEM; in dlfb_usb_probe()
1665 INIT_LIST_HEAD(&dlfb->deferred_free); in dlfb_usb_probe()
1667 dlfb->udev = usb_get_dev(usbdev); in dlfb_usb_probe()
1671 dev_err(&intf->dev, "Invalid DisplayLink device!\n"); in dlfb_usb_probe()
1672 retval = -EINVAL; in dlfb_usb_probe()
1676 dev_dbg(&intf->dev, "console enable=%d\n", console); in dlfb_usb_probe()
1677 dev_dbg(&intf->dev, "fb_defio enable=%d\n", fb_defio); in dlfb_usb_probe()
1678 dev_dbg(&intf->dev, "shadow enable=%d\n", shadow); in dlfb_usb_probe()
1680 dlfb->sku_pixel_limit = 2048 * 1152; /* default to maximum */ in dlfb_usb_probe()
1683 dev_err(&intf->dev, in dlfb_usb_probe()
1685 retval = -ENODEV; in dlfb_usb_probe()
1690 dev_warn(&intf->dev, in dlfb_usb_probe()
1692 dlfb->sku_pixel_limit, pixel_limit); in dlfb_usb_probe()
1693 dlfb->sku_pixel_limit = pixel_limit; in dlfb_usb_probe()
1698 info = framebuffer_alloc(0, &dlfb->udev->dev); in dlfb_usb_probe()
1700 retval = -ENOMEM; in dlfb_usb_probe()
1704 dlfb->info = info; in dlfb_usb_probe()
1705 info->par = dlfb; in dlfb_usb_probe()
1706 info->pseudo_palette = dlfb->pseudo_palette; in dlfb_usb_probe()
1707 dlfb->ops = dlfb_ops; in dlfb_usb_probe()
1708 info->fbops = &dlfb->ops; in dlfb_usb_probe()
1710 mutex_init(&dlfb->render_mutex); in dlfb_usb_probe()
1712 spin_lock_init(&dlfb->damage_lock); in dlfb_usb_probe()
1713 INIT_WORK(&dlfb->damage_work, dlfb_damage_work); in dlfb_usb_probe()
1715 INIT_LIST_HEAD(&info->modelist); in dlfb_usb_probe()
1718 retval = -ENOMEM; in dlfb_usb_probe()
1719 dev_err(&intf->dev, "unable to allocate urb list\n"); in dlfb_usb_probe()
1725 retval = fb_alloc_cmap(&info->cmap, 256, 0); in dlfb_usb_probe()
1727 dev_err(info->device, "cmap allocation failed: %d\n", retval); in dlfb_usb_probe()
1733 dev_err(info->device, in dlfb_usb_probe()
1734 "unable to find common mode for display and adapter\n"); in dlfb_usb_probe()
1740 atomic_set(&dlfb->usb_active, 1); in dlfb_usb_probe()
1743 dlfb_ops_check_var(&info->var, info); in dlfb_usb_probe()
1750 dev_err(info->device, "unable to register framebuffer: %d\n", in dlfb_usb_probe()
1757 retval = device_create_file(info->dev, attr); in dlfb_usb_probe()
1759 dev_warn(info->device, in dlfb_usb_probe()
1761 attr->attr.name, retval); in dlfb_usb_probe()
1764 retval = device_create_bin_file(info->dev, &edid_attr); in dlfb_usb_probe()
1766 dev_warn(info->device, "failed to create '%s' attribute: %d\n", in dlfb_usb_probe()
1769 dev_info(info->device, in dlfb_usb_probe()
1771 dev_name(info->dev), info->var.xres, info->var.yres, in dlfb_usb_probe()
1772 ((dlfb->backing_buffer) ? in dlfb_usb_probe()
1773 info->fix.smem_len * 2 : info->fix.smem_len) >> 10); in dlfb_usb_probe()
1777 if (dlfb->info) { in dlfb_usb_probe()
1778 dlfb_ops_destroy(dlfb->info); in dlfb_usb_probe()
1780 usb_put_dev(dlfb->udev); in dlfb_usb_probe()
1793 info = dlfb->info; in dlfb_usb_disconnect()
1795 dev_dbg(&intf->dev, "USB disconnect starting\n"); in dlfb_usb_disconnect()
1798 dlfb->virtualized = true; in dlfb_usb_disconnect()
1800 /* When non-active we'll update virtual framebuffer, but no new urbs */ in dlfb_usb_disconnect()
1801 atomic_set(&dlfb->usb_active, 0); in dlfb_usb_disconnect()
1803 /* this function will wait for all in-flight urbs to complete */ in dlfb_usb_disconnect()
1808 device_remove_file(info->dev, &fb_device_attrs[i]); in dlfb_usb_disconnect()
1809 device_remove_bin_file(info->dev, &edid_attr); in dlfb_usb_disconnect()
1825 struct urb_node *unode = urb->context; in dlfb_urb_completion()
1826 struct dlfb_data *dlfb = unode->dlfb; in dlfb_urb_completion()
1829 switch (urb->status) { in dlfb_urb_completion()
1833 case -ECONNRESET: in dlfb_urb_completion()
1834 case -ENOENT: in dlfb_urb_completion()
1835 case -ESHUTDOWN: in dlfb_urb_completion()
1839 dev_err(&dlfb->udev->dev, in dlfb_urb_completion()
1840 "%s - nonzero write bulk status received: %d\n", in dlfb_urb_completion()
1841 __func__, urb->status); in dlfb_urb_completion()
1842 atomic_set(&dlfb->lost_pixels, 1); in dlfb_urb_completion()
1846 urb->transfer_buffer_length = dlfb->urbs.size; /* reset to actual */ in dlfb_urb_completion()
1848 spin_lock_irqsave(&dlfb->urbs.lock, flags); in dlfb_urb_completion()
1849 list_add_tail(&unode->entry, &dlfb->urbs.list); in dlfb_urb_completion()
1850 dlfb->urbs.available++; in dlfb_urb_completion()
1851 spin_unlock_irqrestore(&dlfb->urbs.lock, flags); in dlfb_urb_completion()
1853 up(&dlfb->urbs.limit_sem); in dlfb_urb_completion()
1858 int count = dlfb->urbs.count; in dlfb_free_urb_list()
1864 while (count--) { in dlfb_free_urb_list()
1865 down(&dlfb->urbs.limit_sem); in dlfb_free_urb_list()
1867 spin_lock_irq(&dlfb->urbs.lock); in dlfb_free_urb_list()
1869 node = dlfb->urbs.list.next; /* have reserved one with sem */ in dlfb_free_urb_list()
1872 spin_unlock_irq(&dlfb->urbs.lock); in dlfb_free_urb_list()
1875 urb = unode->urb; in dlfb_free_urb_list()
1878 usb_free_coherent(urb->dev, dlfb->urbs.size, in dlfb_free_urb_list()
1879 urb->transfer_buffer, urb->transfer_dma); in dlfb_free_urb_list()
1884 dlfb->urbs.count = 0; in dlfb_free_urb_list()
1894 spin_lock_init(&dlfb->urbs.lock); in dlfb_alloc_urb_list()
1897 dlfb->urbs.size = size; in dlfb_alloc_urb_list()
1898 INIT_LIST_HEAD(&dlfb->urbs.list); in dlfb_alloc_urb_list()
1900 sema_init(&dlfb->urbs.limit_sem, 0); in dlfb_alloc_urb_list()
1901 dlfb->urbs.count = 0; in dlfb_alloc_urb_list()
1902 dlfb->urbs.available = 0; in dlfb_alloc_urb_list()
1904 while (dlfb->urbs.count * size < wanted_size) { in dlfb_alloc_urb_list()
1908 unode->dlfb = dlfb; in dlfb_alloc_urb_list()
1915 unode->urb = urb; in dlfb_alloc_urb_list()
1917 buf = usb_alloc_coherent(dlfb->udev, size, GFP_KERNEL, in dlfb_alloc_urb_list()
1918 &urb->transfer_dma); in dlfb_alloc_urb_list()
1930 /* urb->transfer_buffer_length set to actual before submit */ in dlfb_alloc_urb_list()
1931 usb_fill_bulk_urb(urb, dlfb->udev, in dlfb_alloc_urb_list()
1932 usb_sndbulkpipe(dlfb->udev, OUT_EP_NUM), in dlfb_alloc_urb_list()
1934 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in dlfb_alloc_urb_list()
1936 list_add_tail(&unode->entry, &dlfb->urbs.list); in dlfb_alloc_urb_list()
1938 up(&dlfb->urbs.limit_sem); in dlfb_alloc_urb_list()
1939 dlfb->urbs.count++; in dlfb_alloc_urb_list()
1940 dlfb->urbs.available++; in dlfb_alloc_urb_list()
1943 return dlfb->urbs.count; in dlfb_alloc_urb_list()
1952 /* Wait for an in-flight buffer to complete and get re-queued */ in dlfb_get_urb()
1953 ret = down_timeout(&dlfb->urbs.limit_sem, GET_URB_TIMEOUT); in dlfb_get_urb()
1955 atomic_set(&dlfb->lost_pixels, 1); in dlfb_get_urb()
1956 dev_warn(&dlfb->udev->dev, in dlfb_get_urb()
1958 ret, dlfb->urbs.available); in dlfb_get_urb()
1962 spin_lock_irq(&dlfb->urbs.lock); in dlfb_get_urb()
1964 BUG_ON(list_empty(&dlfb->urbs.list)); /* reserved one with limit_sem */ in dlfb_get_urb()
1965 entry = dlfb->urbs.list.next; in dlfb_get_urb()
1967 dlfb->urbs.available--; in dlfb_get_urb()
1969 spin_unlock_irq(&dlfb->urbs.lock); in dlfb_get_urb()
1972 return unode->urb; in dlfb_get_urb()
1979 BUG_ON(len > dlfb->urbs.size); in dlfb_submit_urb()
1981 urb->transfer_buffer_length = len; /* set to actual payload len */ in dlfb_submit_urb()
1985 atomic_set(&dlfb->lost_pixels, 1); in dlfb_submit_urb()
1986 dev_err(&dlfb->udev->dev, "submit urb error: %d\n", ret); in dlfb_submit_urb()
2001 MODULE_PARM_DESC(pixel_limit, "Force limit on max mode (in x*y pixels)");