1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21#include <linux/module.h>
22#include <linux/kernel.h>
23#include <linux/init.h>
24#include <linux/usb.h>
25#include <linux/uaccess.h>
26#include <linux/mm.h>
27#include <linux/fb.h>
28#include <linux/vmalloc.h>
29#include <linux/slab.h>
30#include <linux/prefetch.h>
31#include <linux/delay.h>
32#include <video/udlfb.h>
33#include "edid.h"
34
35static struct fb_fix_screeninfo dlfb_fix = {
36 .id = "udlfb",
37 .type = FB_TYPE_PACKED_PIXELS,
38 .visual = FB_VISUAL_TRUECOLOR,
39 .xpanstep = 0,
40 .ypanstep = 0,
41 .ywrapstep = 0,
42 .accel = FB_ACCEL_NONE,
43};
44
45static const u32 udlfb_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST |
46 FBINFO_VIRTFB |
47 FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT |
48 FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR;
49
50
51
52
53
54
55
56
57static struct usb_device_id id_table[] = {
58 {.idVendor = 0x17e9,
59 .bInterfaceClass = 0xff,
60 .bInterfaceSubClass = 0x00,
61 .bInterfaceProtocol = 0x00,
62 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
63 USB_DEVICE_ID_MATCH_INT_CLASS |
64 USB_DEVICE_ID_MATCH_INT_SUBCLASS |
65 USB_DEVICE_ID_MATCH_INT_PROTOCOL,
66 },
67 {},
68};
69MODULE_DEVICE_TABLE(usb, id_table);
70
71
72static bool console = 1;
73static bool fb_defio = 1;
74static bool shadow = 1;
75static int pixel_limit;
76
77
78static void dlfb_urb_completion(struct urb *urb);
79static struct urb *dlfb_get_urb(struct dlfb_data *dev);
80static int dlfb_submit_urb(struct dlfb_data *dev, struct urb * urb, size_t len);
81static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size);
82static void dlfb_free_urb_list(struct dlfb_data *dev);
83
84
85
86
87
88static char *dlfb_set_register(char *buf, u8 reg, u8 val)
89{
90 *buf++ = 0xAF;
91 *buf++ = 0x20;
92 *buf++ = reg;
93 *buf++ = val;
94 return buf;
95}
96
97static char *dlfb_vidreg_lock(char *buf)
98{
99 return dlfb_set_register(buf, 0xFF, 0x00);
100}
101
102static char *dlfb_vidreg_unlock(char *buf)
103{
104 return dlfb_set_register(buf, 0xFF, 0xFF);
105}
106
107
108
109
110
111
112
113
114
115
116
117static char *dlfb_blanking(char *buf, int fb_blank)
118{
119 u8 reg;
120
121 switch (fb_blank) {
122 case FB_BLANK_POWERDOWN:
123 reg = 0x07;
124 break;
125 case FB_BLANK_HSYNC_SUSPEND:
126 reg = 0x05;
127 break;
128 case FB_BLANK_VSYNC_SUSPEND:
129 reg = 0x03;
130 break;
131 case FB_BLANK_NORMAL:
132 reg = 0x01;
133 break;
134 default:
135 reg = 0x00;
136 }
137
138 buf = dlfb_set_register(buf, 0x1F, reg);
139
140 return buf;
141}
142
143static char *dlfb_set_color_depth(char *buf, u8 selection)
144{
145 return dlfb_set_register(buf, 0x00, selection);
146}
147
148static char *dlfb_set_base16bpp(char *wrptr, u32 base)
149{
150
151 wrptr = dlfb_set_register(wrptr, 0x20, base >> 16);
152 wrptr = dlfb_set_register(wrptr, 0x21, base >> 8);
153 return dlfb_set_register(wrptr, 0x22, base);
154}
155
156
157
158
159
160static char *dlfb_set_base8bpp(char *wrptr, u32 base)
161{
162 wrptr = dlfb_set_register(wrptr, 0x26, base >> 16);
163 wrptr = dlfb_set_register(wrptr, 0x27, base >> 8);
164 return dlfb_set_register(wrptr, 0x28, base);
165}
166
167static char *dlfb_set_register_16(char *wrptr, u8 reg, u16 value)
168{
169 wrptr = dlfb_set_register(wrptr, reg, value >> 8);
170 return dlfb_set_register(wrptr, reg+1, value);
171}
172
173
174
175
176
177static char *dlfb_set_register_16be(char *wrptr, u8 reg, u16 value)
178{
179 wrptr = dlfb_set_register(wrptr, reg, value);
180 return dlfb_set_register(wrptr, reg+1, value >> 8);
181}
182
183
184
185
186
187
188
189
190
191
192static u16 dlfb_lfsr16(u16 actual_count)
193{
194 u32 lv = 0xFFFF;
195
196 while (actual_count--) {
197 lv = ((lv << 1) |
198 (((lv >> 15) ^ (lv >> 4) ^ (lv >> 2) ^ (lv >> 1)) & 1))
199 & 0xFFFF;
200 }
201
202 return (u16) lv;
203}
204
205
206
207
208
209static char *dlfb_set_register_lfsr16(char *wrptr, u8 reg, u16 value)
210{
211 return dlfb_set_register_16(wrptr, reg, dlfb_lfsr16(value));
212}
213
214
215
216
217
218static char *dlfb_set_vid_cmds(char *wrptr, struct fb_var_screeninfo *var)
219{
220 u16 xds, yds;
221 u16 xde, yde;
222 u16 yec;
223
224
225 xds = var->left_margin + var->hsync_len;
226 wrptr = dlfb_set_register_lfsr16(wrptr, 0x01, xds);
227
228 xde = xds + var->xres;
229 wrptr = dlfb_set_register_lfsr16(wrptr, 0x03, xde);
230
231
232 yds = var->upper_margin + var->vsync_len;
233 wrptr = dlfb_set_register_lfsr16(wrptr, 0x05, yds);
234
235 yde = yds + var->yres;
236 wrptr = dlfb_set_register_lfsr16(wrptr, 0x07, yde);
237
238
239 wrptr = dlfb_set_register_lfsr16(wrptr, 0x09,
240 xde + var->right_margin - 1);
241
242
243 wrptr = dlfb_set_register_lfsr16(wrptr, 0x0B, 1);
244
245
246 wrptr = dlfb_set_register_lfsr16(wrptr, 0x0D, var->hsync_len + 1);
247
248
249 wrptr = dlfb_set_register_16(wrptr, 0x0F, var->xres);
250
251
252 yec = var->yres + var->upper_margin + var->lower_margin +
253 var->vsync_len;
254 wrptr = dlfb_set_register_lfsr16(wrptr, 0x11, yec);
255
256
257 wrptr = dlfb_set_register_lfsr16(wrptr, 0x13, 0);
258
259
260 wrptr = dlfb_set_register_lfsr16(wrptr, 0x15, var->vsync_len);
261
262
263 wrptr = dlfb_set_register_16(wrptr, 0x17, var->yres);
264
265
266 wrptr = dlfb_set_register_16be(wrptr, 0x1B,
267 200*1000*1000/var->pixclock);
268
269 return wrptr;
270}
271
272
273
274
275
276
277static int dlfb_set_video_mode(struct dlfb_data *dev,
278 struct fb_var_screeninfo *var)
279{
280 char *buf;
281 char *wrptr;
282 int retval = 0;
283 int writesize;
284 struct urb *urb;
285
286 if (!atomic_read(&dev->usb_active))
287 return -EPERM;
288
289 urb = dlfb_get_urb(dev);
290 if (!urb)
291 return -ENOMEM;
292
293 buf = (char *) urb->transfer_buffer;
294
295
296
297
298
299
300 wrptr = dlfb_vidreg_lock(buf);
301 wrptr = dlfb_set_color_depth(wrptr, 0x00);
302
303 wrptr = dlfb_set_base16bpp(wrptr, 0);
304
305 wrptr = dlfb_set_base8bpp(wrptr, dev->info->fix.smem_len);
306
307 wrptr = dlfb_set_vid_cmds(wrptr, var);
308 wrptr = dlfb_blanking(wrptr, FB_BLANK_UNBLANK);
309 wrptr = dlfb_vidreg_unlock(wrptr);
310
311 writesize = wrptr - buf;
312
313 retval = dlfb_submit_urb(dev, urb, writesize);
314
315 dev->blank_mode = FB_BLANK_UNBLANK;
316
317 return retval;
318}
319
320static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
321{
322 unsigned long start = vma->vm_start;
323 unsigned long size = vma->vm_end - vma->vm_start;
324 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
325 unsigned long page, pos;
326
327 if (offset + size > info->fix.smem_len)
328 return -EINVAL;
329
330 pos = (unsigned long)info->fix.smem_start + offset;
331
332 pr_notice("mmap() framebuffer addr:%lu size:%lu\n",
333 pos, size);
334
335 while (size > 0) {
336 page = vmalloc_to_pfn((void *)pos);
337 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
338 return -EAGAIN;
339
340 start += PAGE_SIZE;
341 pos += PAGE_SIZE;
342 if (size > PAGE_SIZE)
343 size -= PAGE_SIZE;
344 else
345 size = 0;
346 }
347
348 return 0;
349}
350
351
352
353
354
355
356
357
358static int dlfb_trim_hline(const u8 *bback, const u8 **bfront, int *width_bytes)
359{
360 int j, k;
361 const unsigned long *back = (const unsigned long *) bback;
362 const unsigned long *front = (const unsigned long *) *bfront;
363 const int width = *width_bytes / sizeof(unsigned long);
364 int identical = width;
365 int start = width;
366 int end = width;
367
368 prefetch((void *) front);
369 prefetch((void *) back);
370
371 for (j = 0; j < width; j++) {
372 if (back[j] != front[j]) {
373 start = j;
374 break;
375 }
376 }
377
378 for (k = width - 1; k > j; k--) {
379 if (back[k] != front[k]) {
380 end = k+1;
381 break;
382 }
383 }
384
385 identical = start + (width - end);
386 *bfront = (u8 *) &front[start];
387 *width_bytes = (end - start) * sizeof(unsigned long);
388
389 return identical * sizeof(unsigned long);
390}
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419static void dlfb_compress_hline(
420 const uint16_t **pixel_start_ptr,
421 const uint16_t *const pixel_end,
422 uint32_t *device_address_ptr,
423 uint8_t **command_buffer_ptr,
424 const uint8_t *const cmd_buffer_end)
425{
426 const uint16_t *pixel = *pixel_start_ptr;
427 uint32_t dev_addr = *device_address_ptr;
428 uint8_t *cmd = *command_buffer_ptr;
429 const int bpp = 2;
430
431 while ((pixel_end > pixel) &&
432 (cmd_buffer_end - MIN_RLX_CMD_BYTES > cmd)) {
433 uint8_t *raw_pixels_count_byte = 0;
434 uint8_t *cmd_pixels_count_byte = 0;
435 const uint16_t *raw_pixel_start = 0;
436 const uint16_t *cmd_pixel_start, *cmd_pixel_end = 0;
437
438 prefetchw((void *) cmd);
439
440 *cmd++ = 0xAF;
441 *cmd++ = 0x6B;
442 *cmd++ = (uint8_t) ((dev_addr >> 16) & 0xFF);
443 *cmd++ = (uint8_t) ((dev_addr >> 8) & 0xFF);
444 *cmd++ = (uint8_t) ((dev_addr) & 0xFF);
445
446 cmd_pixels_count_byte = cmd++;
447 cmd_pixel_start = pixel;
448
449 raw_pixels_count_byte = cmd++;
450 raw_pixel_start = pixel;
451
452 cmd_pixel_end = pixel + min(MAX_CMD_PIXELS + 1,
453 min((int)(pixel_end - pixel),
454 (int)(cmd_buffer_end - cmd) / bpp));
455
456 prefetch_range((void *) pixel, (cmd_pixel_end - pixel) * bpp);
457
458 while (pixel < cmd_pixel_end) {
459 const uint16_t * const repeating_pixel = pixel;
460
461 *(uint16_t *)cmd = cpu_to_be16p(pixel);
462 cmd += 2;
463 pixel++;
464
465 if (unlikely((pixel < cmd_pixel_end) &&
466 (*pixel == *repeating_pixel))) {
467
468 *raw_pixels_count_byte = ((repeating_pixel -
469 raw_pixel_start) + 1) & 0xFF;
470
471 while ((pixel < cmd_pixel_end)
472 && (*pixel == *repeating_pixel)) {
473 pixel++;
474 }
475
476
477 *cmd++ = ((pixel - repeating_pixel) - 1) & 0xFF;
478
479
480 raw_pixel_start = pixel;
481 raw_pixels_count_byte = cmd++;
482 }
483 }
484
485 if (pixel > raw_pixel_start) {
486
487 *raw_pixels_count_byte = (pixel-raw_pixel_start) & 0xFF;
488 }
489
490 *cmd_pixels_count_byte = (pixel - cmd_pixel_start) & 0xFF;
491 dev_addr += (pixel - cmd_pixel_start) * bpp;
492 }
493
494 if (cmd_buffer_end <= MIN_RLX_CMD_BYTES + cmd) {
495
496 if (cmd_buffer_end > cmd)
497 memset(cmd, 0xAF, cmd_buffer_end - cmd);
498 cmd = (uint8_t *) cmd_buffer_end;
499 }
500
501 *command_buffer_ptr = cmd;
502 *pixel_start_ptr = pixel;
503 *device_address_ptr = dev_addr;
504
505 return;
506}
507
508
509
510
511
512
513
514static int dlfb_render_hline(struct dlfb_data *dev, struct urb **urb_ptr,
515 const char *front, char **urb_buf_ptr,
516 u32 byte_offset, u32 byte_width,
517 int *ident_ptr, int *sent_ptr)
518{
519 const u8 *line_start, *line_end, *next_pixel;
520 u32 dev_addr = dev->base16 + byte_offset;
521 struct urb *urb = *urb_ptr;
522 u8 *cmd = *urb_buf_ptr;
523 u8 *cmd_end = (u8 *) urb->transfer_buffer + urb->transfer_buffer_length;
524
525 line_start = (u8 *) (front + byte_offset);
526 next_pixel = line_start;
527 line_end = next_pixel + byte_width;
528
529 if (dev->backing_buffer) {
530 int offset;
531 const u8 *back_start = (u8 *) (dev->backing_buffer
532 + byte_offset);
533
534 *ident_ptr += dlfb_trim_hline(back_start, &next_pixel,
535 &byte_width);
536
537 offset = next_pixel - line_start;
538 line_end = next_pixel + byte_width;
539 dev_addr += offset;
540 back_start += offset;
541 line_start += offset;
542
543 memcpy((char *)back_start, (char *) line_start,
544 byte_width);
545 }
546
547 while (next_pixel < line_end) {
548
549 dlfb_compress_hline((const uint16_t **) &next_pixel,
550 (const uint16_t *) line_end, &dev_addr,
551 (u8 **) &cmd, (u8 *) cmd_end);
552
553 if (cmd >= cmd_end) {
554 int len = cmd - (u8 *) urb->transfer_buffer;
555 if (dlfb_submit_urb(dev, urb, len))
556 return 1;
557 *sent_ptr += len;
558 urb = dlfb_get_urb(dev);
559 if (!urb)
560 return 1;
561 *urb_ptr = urb;
562 cmd = urb->transfer_buffer;
563 cmd_end = &cmd[urb->transfer_buffer_length];
564 }
565 }
566
567 *urb_buf_ptr = cmd;
568
569 return 0;
570}
571
572int dlfb_handle_damage(struct dlfb_data *dev, int x, int y,
573 int width, int height, char *data)
574{
575 int i, ret;
576 char *cmd;
577 cycles_t start_cycles, end_cycles;
578 int bytes_sent = 0;
579 int bytes_identical = 0;
580 struct urb *urb;
581 int aligned_x;
582
583 start_cycles = get_cycles();
584
585 aligned_x = DL_ALIGN_DOWN(x, sizeof(unsigned long));
586 width = DL_ALIGN_UP(width + (x-aligned_x), sizeof(unsigned long));
587 x = aligned_x;
588
589 if ((width <= 0) ||
590 (x + width > dev->info->var.xres) ||
591 (y + height > dev->info->var.yres))
592 return -EINVAL;
593
594 if (!atomic_read(&dev->usb_active))
595 return 0;
596
597 urb = dlfb_get_urb(dev);
598 if (!urb)
599 return 0;
600 cmd = urb->transfer_buffer;
601
602 for (i = y; i < y + height ; i++) {
603 const int line_offset = dev->info->fix.line_length * i;
604 const int byte_offset = line_offset + (x * BPP);
605
606 if (dlfb_render_hline(dev, &urb,
607 (char *) dev->info->fix.smem_start,
608 &cmd, byte_offset, width * BPP,
609 &bytes_identical, &bytes_sent))
610 goto error;
611 }
612
613 if (cmd > (char *) urb->transfer_buffer) {
614
615 int len = cmd - (char *) urb->transfer_buffer;
616 ret = dlfb_submit_urb(dev, urb, len);
617 bytes_sent += len;
618 } else
619 dlfb_urb_completion(urb);
620
621error:
622 atomic_add(bytes_sent, &dev->bytes_sent);
623 atomic_add(bytes_identical, &dev->bytes_identical);
624 atomic_add(width*height*2, &dev->bytes_rendered);
625 end_cycles = get_cycles();
626 atomic_add(((unsigned int) ((end_cycles - start_cycles)
627 >> 10)),
628 &dev->cpu_kcycles_used);
629
630 return 0;
631}
632
633
634
635
636
637
638
639static ssize_t dlfb_ops_write(struct fb_info *info, const char __user *buf,
640 size_t count, loff_t *ppos)
641{
642 ssize_t result;
643 struct dlfb_data *dev = info->par;
644 u32 offset = (u32) *ppos;
645
646 result = fb_sys_write(info, buf, count, ppos);
647
648 if (result > 0) {
649 int start = max((int)(offset / info->fix.line_length), 0);
650 int lines = min((u32)((result / info->fix.line_length) + 1),
651 (u32)info->var.yres);
652
653 dlfb_handle_damage(dev, 0, start, info->var.xres,
654 lines, info->screen_base);
655 }
656
657 return result;
658}
659
660
661static void dlfb_ops_copyarea(struct fb_info *info,
662 const struct fb_copyarea *area)
663{
664
665 struct dlfb_data *dev = info->par;
666
667 sys_copyarea(info, area);
668
669 dlfb_handle_damage(dev, area->dx, area->dy,
670 area->width, area->height, info->screen_base);
671}
672
673static void dlfb_ops_imageblit(struct fb_info *info,
674 const struct fb_image *image)
675{
676 struct dlfb_data *dev = info->par;
677
678 sys_imageblit(info, image);
679
680 dlfb_handle_damage(dev, image->dx, image->dy,
681 image->width, image->height, info->screen_base);
682}
683
684static void dlfb_ops_fillrect(struct fb_info *info,
685 const struct fb_fillrect *rect)
686{
687 struct dlfb_data *dev = info->par;
688
689 sys_fillrect(info, rect);
690
691 dlfb_handle_damage(dev, rect->dx, rect->dy, rect->width,
692 rect->height, info->screen_base);
693}
694
695
696
697
698
699
700
701static void dlfb_dpy_deferred_io(struct fb_info *info,
702 struct list_head *pagelist)
703{
704 struct page *cur;
705 struct fb_deferred_io *fbdefio = info->fbdefio;
706 struct dlfb_data *dev = info->par;
707 struct urb *urb;
708 char *cmd;
709 cycles_t start_cycles, end_cycles;
710 int bytes_sent = 0;
711 int bytes_identical = 0;
712 int bytes_rendered = 0;
713
714 if (!fb_defio)
715 return;
716
717 if (!atomic_read(&dev->usb_active))
718 return;
719
720 start_cycles = get_cycles();
721
722 urb = dlfb_get_urb(dev);
723 if (!urb)
724 return;
725
726 cmd = urb->transfer_buffer;
727
728
729 list_for_each_entry(cur, &fbdefio->pagelist, lru) {
730
731 if (dlfb_render_hline(dev, &urb, (char *) info->fix.smem_start,
732 &cmd, cur->index << PAGE_SHIFT,
733 PAGE_SIZE, &bytes_identical, &bytes_sent))
734 goto error;
735 bytes_rendered += PAGE_SIZE;
736 }
737
738 if (cmd > (char *) urb->transfer_buffer) {
739
740 int len = cmd - (char *) urb->transfer_buffer;
741 dlfb_submit_urb(dev, urb, len);
742 bytes_sent += len;
743 } else
744 dlfb_urb_completion(urb);
745
746error:
747 atomic_add(bytes_sent, &dev->bytes_sent);
748 atomic_add(bytes_identical, &dev->bytes_identical);
749 atomic_add(bytes_rendered, &dev->bytes_rendered);
750 end_cycles = get_cycles();
751 atomic_add(((unsigned int) ((end_cycles - start_cycles)
752 >> 10)),
753 &dev->cpu_kcycles_used);
754}
755
756static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len)
757{
758 int i;
759 int ret;
760 char *rbuf;
761
762 rbuf = kmalloc(2, GFP_KERNEL);
763 if (!rbuf)
764 return 0;
765
766 for (i = 0; i < len; i++) {
767 ret = usb_control_msg(dev->udev,
768 usb_rcvctrlpipe(dev->udev, 0), (0x02),
769 (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
770 HZ);
771 if (ret < 1) {
772 pr_err("Read EDID byte %d failed err %x\n", i, ret);
773 i--;
774 break;
775 }
776 edid[i] = rbuf[1];
777 }
778
779 kfree(rbuf);
780
781 return i;
782}
783
784static int dlfb_ops_ioctl(struct fb_info *info, unsigned int cmd,
785 unsigned long arg)
786{
787
788 struct dlfb_data *dev = info->par;
789
790 if (!atomic_read(&dev->usb_active))
791 return 0;
792
793
794 if (cmd == DLFB_IOCTL_RETURN_EDID) {
795 void __user *edid = (void __user *)arg;
796 if (copy_to_user(edid, dev->edid, dev->edid_size))
797 return -EFAULT;
798 return 0;
799 }
800
801
802 if (cmd == DLFB_IOCTL_REPORT_DAMAGE) {
803 struct dloarea area;
804
805 if (copy_from_user(&area, (void __user *)arg,
806 sizeof(struct dloarea)))
807 return -EFAULT;
808
809
810
811
812
813
814
815
816 if (info->fbdefio)
817 info->fbdefio->delay = DL_DEFIO_WRITE_DISABLE;
818
819 if (area.x < 0)
820 area.x = 0;
821
822 if (area.x > info->var.xres)
823 area.x = info->var.xres;
824
825 if (area.y < 0)
826 area.y = 0;
827
828 if (area.y > info->var.yres)
829 area.y = info->var.yres;
830
831 dlfb_handle_damage(dev, area.x, area.y, area.w, area.h,
832 info->screen_base);
833 }
834
835 return 0;
836}
837
838
839static int
840dlfb_ops_setcolreg(unsigned regno, unsigned red, unsigned green,
841 unsigned blue, unsigned transp, struct fb_info *info)
842{
843 int err = 0;
844
845 if (regno >= info->cmap.len)
846 return 1;
847
848 if (regno < 16) {
849 if (info->var.red.offset == 10) {
850
851 ((u32 *) (info->pseudo_palette))[regno] =
852 ((red & 0xf800) >> 1) |
853 ((green & 0xf800) >> 6) | ((blue & 0xf800) >> 11);
854 } else {
855
856 ((u32 *) (info->pseudo_palette))[regno] =
857 ((red & 0xf800)) |
858 ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
859 }
860 }
861
862 return err;
863}
864
865
866
867
868
869
870static int dlfb_ops_open(struct fb_info *info, int user)
871{
872 struct dlfb_data *dev = info->par;
873
874
875
876
877
878
879 if ((user == 0) && (!console))
880 return -EBUSY;
881
882
883 if (dev->virtualized)
884 return -ENODEV;
885
886 dev->fb_count++;
887
888 kref_get(&dev->kref);
889
890 if (fb_defio && (info->fbdefio == NULL)) {
891
892
893 struct fb_deferred_io *fbdefio;
894
895 fbdefio = kzalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
896
897 if (fbdefio) {
898 fbdefio->delay = DL_DEFIO_WRITE_DELAY;
899 fbdefio->deferred_io = dlfb_dpy_deferred_io;
900 }
901
902 info->fbdefio = fbdefio;
903 fb_deferred_io_init(info);
904 }
905
906 pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n",
907 info->node, user, info, dev->fb_count);
908
909 return 0;
910}
911
912
913
914
915
916
917static void dlfb_free(struct kref *kref)
918{
919 struct dlfb_data *dev = container_of(kref, struct dlfb_data, kref);
920
921 if (dev->backing_buffer)
922 vfree(dev->backing_buffer);
923
924 kfree(dev->edid);
925
926 pr_warn("freeing dlfb_data %p\n", dev);
927
928 kfree(dev);
929}
930
931static void dlfb_release_urb_work(struct work_struct *work)
932{
933 struct urb_node *unode = container_of(work, struct urb_node,
934 release_urb_work.work);
935
936 up(&unode->dev->urbs.limit_sem);
937}
938
939static void dlfb_free_framebuffer(struct dlfb_data *dev)
940{
941 struct fb_info *info = dev->info;
942
943 if (info) {
944 int node = info->node;
945
946 unregister_framebuffer(info);
947
948 if (info->cmap.len != 0)
949 fb_dealloc_cmap(&info->cmap);
950 if (info->monspecs.modedb)
951 fb_destroy_modedb(info->monspecs.modedb);
952 if (info->screen_base)
953 vfree(info->screen_base);
954
955 fb_destroy_modelist(&info->modelist);
956
957 dev->info = NULL;
958
959
960 framebuffer_release(info);
961
962 pr_warn("fb_info for /dev/fb%d has been freed\n", node);
963 }
964
965
966 kref_put(&dev->kref, dlfb_free);
967}
968
969static void dlfb_free_framebuffer_work(struct work_struct *work)
970{
971 struct dlfb_data *dev = container_of(work, struct dlfb_data,
972 free_framebuffer_work.work);
973 dlfb_free_framebuffer(dev);
974}
975
976
977
978static int dlfb_ops_release(struct fb_info *info, int user)
979{
980 struct dlfb_data *dev = info->par;
981
982 dev->fb_count--;
983
984
985 if (dev->virtualized && (dev->fb_count == 0))
986 schedule_delayed_work(&dev->free_framebuffer_work, HZ);
987
988 if ((dev->fb_count == 0) && (info->fbdefio)) {
989 fb_deferred_io_cleanup(info);
990 kfree(info->fbdefio);
991 info->fbdefio = NULL;
992 info->fbops->fb_mmap = dlfb_ops_mmap;
993 }
994
995 pr_warn("released /dev/fb%d user=%d count=%d\n",
996 info->node, user, dev->fb_count);
997
998 kref_put(&dev->kref, dlfb_free);
999
1000 return 0;
1001}
1002
1003
1004
1005
1006
1007static int dlfb_is_valid_mode(struct fb_videomode *mode,
1008 struct fb_info *info)
1009{
1010 struct dlfb_data *dev = info->par;
1011
1012 if (mode->xres * mode->yres > dev->sku_pixel_limit) {
1013 pr_warn("%dx%d beyond chip capabilities\n",
1014 mode->xres, mode->yres);
1015 return 0;
1016 }
1017
1018 pr_info("%dx%d @ %d Hz valid mode\n", mode->xres, mode->yres,
1019 mode->refresh);
1020
1021 return 1;
1022}
1023
1024static void dlfb_var_color_format(struct fb_var_screeninfo *var)
1025{
1026 const struct fb_bitfield red = { 11, 5, 0 };
1027 const struct fb_bitfield green = { 5, 6, 0 };
1028 const struct fb_bitfield blue = { 0, 5, 0 };
1029
1030 var->bits_per_pixel = 16;
1031 var->red = red;
1032 var->green = green;
1033 var->blue = blue;
1034}
1035
1036static int dlfb_ops_check_var(struct fb_var_screeninfo *var,
1037 struct fb_info *info)
1038{
1039 struct fb_videomode mode;
1040
1041
1042 if ((var->xres * var->yres * 2) > info->fix.smem_len)
1043 return -EINVAL;
1044
1045
1046 dlfb_var_color_format(var);
1047
1048 fb_var_to_videomode(&mode, var);
1049
1050 if (!dlfb_is_valid_mode(&mode, info))
1051 return -EINVAL;
1052
1053 return 0;
1054}
1055
1056static int dlfb_ops_set_par(struct fb_info *info)
1057{
1058 struct dlfb_data *dev = info->par;
1059 int result;
1060 u16 *pix_framebuffer;
1061 int i;
1062
1063 pr_notice("set_par mode %dx%d\n", info->var.xres, info->var.yres);
1064
1065 result = dlfb_set_video_mode(dev, &info->var);
1066
1067 if ((result == 0) && (dev->fb_count == 0)) {
1068
1069
1070
1071 pix_framebuffer = (u16 *) info->screen_base;
1072 for (i = 0; i < info->fix.smem_len / 2; i++)
1073 pix_framebuffer[i] = 0x37e6;
1074
1075 dlfb_handle_damage(dev, 0, 0, info->var.xres, info->var.yres,
1076 info->screen_base);
1077 }
1078
1079 return result;
1080}
1081
1082
1083static char *dlfb_dummy_render(char *buf)
1084{
1085 *buf++ = 0xAF;
1086 *buf++ = 0x6A;
1087 *buf++ = 0x00;
1088 *buf++ = 0x00;
1089 *buf++ = 0x00;
1090 *buf++ = 0x01;
1091 *buf++ = 0x00;
1092 *buf++ = 0x00;
1093 *buf++ = 0x00;
1094 return buf;
1095}
1096
1097
1098
1099
1100static int dlfb_ops_blank(int blank_mode, struct fb_info *info)
1101{
1102 struct dlfb_data *dev = info->par;
1103 char *bufptr;
1104 struct urb *urb;
1105
1106 pr_info("/dev/fb%d FB_BLANK mode %d --> %d\n",
1107 info->node, dev->blank_mode, blank_mode);
1108
1109 if ((dev->blank_mode == FB_BLANK_POWERDOWN) &&
1110 (blank_mode != FB_BLANK_POWERDOWN)) {
1111
1112
1113 dlfb_set_video_mode(dev, &info->var);
1114 }
1115
1116 urb = dlfb_get_urb(dev);
1117 if (!urb)
1118 return 0;
1119
1120 bufptr = (char *) urb->transfer_buffer;
1121 bufptr = dlfb_vidreg_lock(bufptr);
1122 bufptr = dlfb_blanking(bufptr, blank_mode);
1123 bufptr = dlfb_vidreg_unlock(bufptr);
1124
1125
1126 bufptr = dlfb_dummy_render(bufptr);
1127
1128 dlfb_submit_urb(dev, urb, bufptr -
1129 (char *) urb->transfer_buffer);
1130
1131 dev->blank_mode = blank_mode;
1132
1133 return 0;
1134}
1135
1136static struct fb_ops dlfb_ops = {
1137 .owner = THIS_MODULE,
1138 .fb_read = fb_sys_read,
1139 .fb_write = dlfb_ops_write,
1140 .fb_setcolreg = dlfb_ops_setcolreg,
1141 .fb_fillrect = dlfb_ops_fillrect,
1142 .fb_copyarea = dlfb_ops_copyarea,
1143 .fb_imageblit = dlfb_ops_imageblit,
1144 .fb_mmap = dlfb_ops_mmap,
1145 .fb_ioctl = dlfb_ops_ioctl,
1146 .fb_open = dlfb_ops_open,
1147 .fb_release = dlfb_ops_release,
1148 .fb_blank = dlfb_ops_blank,
1149 .fb_check_var = dlfb_ops_check_var,
1150 .fb_set_par = dlfb_ops_set_par,
1151};
1152
1153
1154
1155
1156
1157
1158static int dlfb_realloc_framebuffer(struct dlfb_data *dev, struct fb_info *info)
1159{
1160 int retval = -ENOMEM;
1161 int old_len = info->fix.smem_len;
1162 int new_len;
1163 unsigned char *old_fb = info->screen_base;
1164 unsigned char *new_fb;
1165 unsigned char *new_back = 0;
1166
1167 pr_warn("Reallocating framebuffer. Addresses will change!\n");
1168
1169 new_len = info->fix.line_length * info->var.yres;
1170
1171 if (PAGE_ALIGN(new_len) > old_len) {
1172
1173
1174
1175 new_fb = vmalloc(new_len);
1176 if (!new_fb) {
1177 pr_err("Virtual framebuffer alloc failed\n");
1178 goto error;
1179 }
1180
1181 if (info->screen_base) {
1182 memcpy(new_fb, old_fb, old_len);
1183 vfree(info->screen_base);
1184 }
1185
1186 info->screen_base = new_fb;
1187 info->fix.smem_len = PAGE_ALIGN(new_len);
1188 info->fix.smem_start = (unsigned long) new_fb;
1189 info->flags = udlfb_info_flags;
1190
1191
1192
1193
1194
1195
1196
1197 if (shadow)
1198 new_back = vzalloc(new_len);
1199 if (!new_back)
1200 pr_info("No shadow/backing buffer allocated\n");
1201 else {
1202 if (dev->backing_buffer)
1203 vfree(dev->backing_buffer);
1204 dev->backing_buffer = new_back;
1205 }
1206 }
1207
1208 retval = 0;
1209
1210error:
1211 return retval;
1212}
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228static int dlfb_setup_modes(struct dlfb_data *dev,
1229 struct fb_info *info,
1230 char *default_edid, size_t default_edid_size)
1231{
1232 int i;
1233 const struct fb_videomode *default_vmode = NULL;
1234 int result = 0;
1235 char *edid;
1236 int tries = 3;
1237
1238 if (info->dev)
1239 mutex_lock(&info->lock);
1240
1241 edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
1242 if (!edid) {
1243 result = -ENOMEM;
1244 goto error;
1245 }
1246
1247 fb_destroy_modelist(&info->modelist);
1248 memset(&info->monspecs, 0, sizeof(info->monspecs));
1249
1250
1251
1252
1253
1254
1255 while (tries--) {
1256
1257 i = dlfb_get_edid(dev, edid, EDID_LENGTH);
1258
1259 if (i >= EDID_LENGTH)
1260 fb_edid_to_monspecs(edid, &info->monspecs);
1261
1262 if (info->monspecs.modedb_len > 0) {
1263 dev->edid = edid;
1264 dev->edid_size = i;
1265 break;
1266 }
1267 }
1268
1269
1270 if (info->monspecs.modedb_len == 0) {
1271
1272 pr_err("Unable to get valid EDID from device/display\n");
1273
1274 if (dev->edid) {
1275 fb_edid_to_monspecs(dev->edid, &info->monspecs);
1276 if (info->monspecs.modedb_len > 0)
1277 pr_err("Using previously queried EDID\n");
1278 }
1279 }
1280
1281
1282 if (info->monspecs.modedb_len == 0) {
1283 if (default_edid_size >= EDID_LENGTH) {
1284 fb_edid_to_monspecs(default_edid, &info->monspecs);
1285 if (info->monspecs.modedb_len > 0) {
1286 memcpy(edid, default_edid, default_edid_size);
1287 dev->edid = edid;
1288 dev->edid_size = default_edid_size;
1289 pr_err("Using default/backup EDID\n");
1290 }
1291 }
1292 }
1293
1294
1295 if (info->monspecs.modedb_len > 0) {
1296
1297 for (i = 0; i < info->monspecs.modedb_len; i++) {
1298 if (dlfb_is_valid_mode(&info->monspecs.modedb[i], info))
1299 fb_add_videomode(&info->monspecs.modedb[i],
1300 &info->modelist);
1301 else {
1302 if (i == 0)
1303
1304 info->monspecs.misc
1305 &= ~FB_MISC_1ST_DETAIL;
1306 }
1307 }
1308
1309 default_vmode = fb_find_best_display(&info->monspecs,
1310 &info->modelist);
1311 }
1312
1313
1314 if (default_vmode == NULL) {
1315
1316 struct fb_videomode fb_vmode = {0};
1317
1318
1319
1320
1321
1322
1323
1324 for (i = 0; i < VESA_MODEDB_SIZE; i++) {
1325 if (dlfb_is_valid_mode((struct fb_videomode *)
1326 &vesa_modes[i], info))
1327 fb_add_videomode(&vesa_modes[i],
1328 &info->modelist);
1329 }
1330
1331
1332
1333
1334
1335 fb_vmode.xres = 800;
1336 fb_vmode.yres = 600;
1337 fb_vmode.refresh = 60;
1338 default_vmode = fb_find_nearest_mode(&fb_vmode,
1339 &info->modelist);
1340 }
1341
1342
1343 if ((default_vmode != NULL) && (dev->fb_count == 0)) {
1344
1345 fb_videomode_to_var(&info->var, default_vmode);
1346 dlfb_var_color_format(&info->var);
1347
1348
1349
1350
1351 memcpy(&info->fix, &dlfb_fix, sizeof(dlfb_fix));
1352 info->fix.line_length = info->var.xres *
1353 (info->var.bits_per_pixel / 8);
1354
1355 result = dlfb_realloc_framebuffer(dev, info);
1356
1357 } else
1358 result = -EINVAL;
1359
1360error:
1361 if (edid && (dev->edid != edid))
1362 kfree(edid);
1363
1364 if (info->dev)
1365 mutex_unlock(&info->lock);
1366
1367 return result;
1368}
1369
1370static ssize_t metrics_bytes_rendered_show(struct device *fbdev,
1371 struct device_attribute *a, char *buf) {
1372 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1373 struct dlfb_data *dev = fb_info->par;
1374 return snprintf(buf, PAGE_SIZE, "%u\n",
1375 atomic_read(&dev->bytes_rendered));
1376}
1377
1378static ssize_t metrics_bytes_identical_show(struct device *fbdev,
1379 struct device_attribute *a, char *buf) {
1380 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1381 struct dlfb_data *dev = fb_info->par;
1382 return snprintf(buf, PAGE_SIZE, "%u\n",
1383 atomic_read(&dev->bytes_identical));
1384}
1385
1386static ssize_t metrics_bytes_sent_show(struct device *fbdev,
1387 struct device_attribute *a, char *buf) {
1388 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1389 struct dlfb_data *dev = fb_info->par;
1390 return snprintf(buf, PAGE_SIZE, "%u\n",
1391 atomic_read(&dev->bytes_sent));
1392}
1393
1394static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev,
1395 struct device_attribute *a, char *buf) {
1396 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1397 struct dlfb_data *dev = fb_info->par;
1398 return snprintf(buf, PAGE_SIZE, "%u\n",
1399 atomic_read(&dev->cpu_kcycles_used));
1400}
1401
1402static ssize_t edid_show(
1403 struct file *filp,
1404 struct kobject *kobj, struct bin_attribute *a,
1405 char *buf, loff_t off, size_t count) {
1406 struct device *fbdev = container_of(kobj, struct device, kobj);
1407 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1408 struct dlfb_data *dev = fb_info->par;
1409
1410 if (dev->edid == NULL)
1411 return 0;
1412
1413 if ((off >= dev->edid_size) || (count > dev->edid_size))
1414 return 0;
1415
1416 if (off + count > dev->edid_size)
1417 count = dev->edid_size - off;
1418
1419 pr_info("sysfs edid copy %p to %p, %d bytes\n",
1420 dev->edid, buf, (int) count);
1421
1422 memcpy(buf, dev->edid, count);
1423
1424 return count;
1425}
1426
1427static ssize_t edid_store(
1428 struct file *filp,
1429 struct kobject *kobj, struct bin_attribute *a,
1430 char *src, loff_t src_off, size_t src_size) {
1431 struct device *fbdev = container_of(kobj, struct device, kobj);
1432 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1433 struct dlfb_data *dev = fb_info->par;
1434 int ret;
1435
1436
1437 if ((src_size != EDID_LENGTH) || (src_off != 0))
1438 return -EINVAL;
1439
1440 ret = dlfb_setup_modes(dev, fb_info, src, src_size);
1441 if (ret)
1442 return ret;
1443
1444 if (!dev->edid || memcmp(src, dev->edid, src_size))
1445 return -EINVAL;
1446
1447 pr_info("sysfs written EDID is new default\n");
1448 dlfb_ops_set_par(fb_info);
1449 return src_size;
1450}
1451
1452static ssize_t metrics_reset_store(struct device *fbdev,
1453 struct device_attribute *attr,
1454 const char *buf, size_t count)
1455{
1456 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1457 struct dlfb_data *dev = fb_info->par;
1458
1459 atomic_set(&dev->bytes_rendered, 0);
1460 atomic_set(&dev->bytes_identical, 0);
1461 atomic_set(&dev->bytes_sent, 0);
1462 atomic_set(&dev->cpu_kcycles_used, 0);
1463
1464 return count;
1465}
1466
1467static struct bin_attribute edid_attr = {
1468 .attr.name = "edid",
1469 .attr.mode = 0666,
1470 .size = EDID_LENGTH,
1471 .read = edid_show,
1472 .write = edid_store
1473};
1474
1475static struct device_attribute fb_device_attrs[] = {
1476 __ATTR_RO(metrics_bytes_rendered),
1477 __ATTR_RO(metrics_bytes_identical),
1478 __ATTR_RO(metrics_bytes_sent),
1479 __ATTR_RO(metrics_cpu_kcycles_used),
1480 __ATTR(metrics_reset, S_IWUSR, NULL, metrics_reset_store),
1481};
1482
1483
1484
1485
1486static int dlfb_select_std_channel(struct dlfb_data *dev)
1487{
1488 int ret;
1489 u8 set_def_chn[] = { 0x57, 0xCD, 0xDC, 0xA7,
1490 0x1C, 0x88, 0x5E, 0x15,
1491 0x60, 0xFE, 0xC6, 0x97,
1492 0x16, 0x3D, 0x47, 0xF2 };
1493
1494 ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1495 NR_USB_REQUEST_CHANNEL,
1496 (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
1497 set_def_chn, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT);
1498 return ret;
1499}
1500
1501static int dlfb_parse_vendor_descriptor(struct dlfb_data *dev,
1502 struct usb_interface *interface)
1503{
1504 char *desc;
1505 char *buf;
1506 char *desc_end;
1507
1508 int total_len = 0;
1509
1510 buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
1511 if (!buf)
1512 return false;
1513 desc = buf;
1514
1515 total_len = usb_get_descriptor(interface_to_usbdev(interface),
1516 0x5f,
1517 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE);
1518
1519
1520 if (total_len < 0) {
1521 if (0 == usb_get_extra_descriptor(interface->cur_altsetting,
1522 0x5f, &desc))
1523 total_len = (int) desc[0];
1524 }
1525
1526 if (total_len > 5) {
1527 pr_info("vendor descriptor length:%x data:%02x %02x %02x %02x" \
1528 "%02x %02x %02x %02x %02x %02x %02x\n",
1529 total_len, desc[0],
1530 desc[1], desc[2], desc[3], desc[4], desc[5], desc[6],
1531 desc[7], desc[8], desc[9], desc[10]);
1532
1533 if ((desc[0] != total_len) ||
1534 (desc[1] != 0x5f) ||
1535 (desc[2] != 0x01) ||
1536 (desc[3] != 0x00) ||
1537 (desc[4] != total_len - 2))
1538 goto unrecognized;
1539
1540 desc_end = desc + total_len;
1541 desc += 5;
1542
1543 while (desc < desc_end) {
1544 u8 length;
1545 u16 key;
1546
1547 key = le16_to_cpu(*((u16 *) desc));
1548 desc += sizeof(u16);
1549 length = *desc;
1550 desc++;
1551
1552 switch (key) {
1553 case 0x0200: {
1554 u32 max_area;
1555 max_area = le32_to_cpu(*((u32 *)desc));
1556 pr_warn("DL chip limited to %d pixel modes\n",
1557 max_area);
1558 dev->sku_pixel_limit = max_area;
1559 break;
1560 }
1561 default:
1562 break;
1563 }
1564 desc += length;
1565 }
1566 } else {
1567 pr_info("vendor descriptor not available (%d)\n", total_len);
1568 }
1569
1570 goto success;
1571
1572unrecognized:
1573
1574 pr_err("Unrecognized vendor firmware descriptor\n");
1575
1576success:
1577 kfree(buf);
1578 return true;
1579}
1580
1581static void dlfb_init_framebuffer_work(struct work_struct *work);
1582
1583static int dlfb_usb_probe(struct usb_interface *interface,
1584 const struct usb_device_id *id)
1585{
1586 struct usb_device *usbdev;
1587 struct dlfb_data *dev = 0;
1588 int retval = -ENOMEM;
1589
1590
1591
1592 usbdev = interface_to_usbdev(interface);
1593
1594 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1595 if (dev == NULL) {
1596 dev_err(&interface->dev, "dlfb_usb_probe: failed alloc of dev struct\n");
1597 goto error;
1598 }
1599
1600 kref_init(&dev->kref);
1601
1602 dev->udev = usbdev;
1603 dev->gdev = &usbdev->dev;
1604 usb_set_intfdata(interface, dev);
1605
1606 pr_info("%s %s - serial #%s\n",
1607 usbdev->manufacturer, usbdev->product, usbdev->serial);
1608 pr_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n",
1609 usbdev->descriptor.idVendor, usbdev->descriptor.idProduct,
1610 usbdev->descriptor.bcdDevice, dev);
1611 pr_info("console enable=%d\n", console);
1612 pr_info("fb_defio enable=%d\n", fb_defio);
1613 pr_info("shadow enable=%d\n", shadow);
1614
1615 dev->sku_pixel_limit = 2048 * 1152;
1616
1617 if (!dlfb_parse_vendor_descriptor(dev, interface)) {
1618 pr_err("firmware not recognized. Assume incompatible device\n");
1619 goto error;
1620 }
1621
1622 if (pixel_limit) {
1623 pr_warn("DL chip limit of %d overriden"
1624 " by module param to %d\n",
1625 dev->sku_pixel_limit, pixel_limit);
1626 dev->sku_pixel_limit = pixel_limit;
1627 }
1628
1629
1630 if (!dlfb_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
1631 retval = -ENOMEM;
1632 pr_err("dlfb_alloc_urb_list failed\n");
1633 goto error;
1634 }
1635
1636 kref_get(&dev->kref);
1637
1638
1639
1640
1641 INIT_DELAYED_WORK(&dev->init_framebuffer_work,
1642 dlfb_init_framebuffer_work);
1643 schedule_delayed_work(&dev->init_framebuffer_work, 0);
1644
1645 return 0;
1646
1647error:
1648 if (dev) {
1649
1650 kref_put(&dev->kref, dlfb_free);
1651 kref_put(&dev->kref, dlfb_free);
1652
1653
1654 }
1655
1656 return retval;
1657}
1658
1659static void dlfb_init_framebuffer_work(struct work_struct *work)
1660{
1661 struct dlfb_data *dev = container_of(work, struct dlfb_data,
1662 init_framebuffer_work.work);
1663 struct fb_info *info;
1664 int retval;
1665 int i;
1666
1667
1668 info = framebuffer_alloc(0, dev->gdev);
1669 if (!info) {
1670 retval = -ENOMEM;
1671 pr_err("framebuffer_alloc failed\n");
1672 goto error;
1673 }
1674
1675 dev->info = info;
1676 info->par = dev;
1677 info->pseudo_palette = dev->pseudo_palette;
1678 info->fbops = &dlfb_ops;
1679
1680 retval = fb_alloc_cmap(&info->cmap, 256, 0);
1681 if (retval < 0) {
1682 pr_err("fb_alloc_cmap failed %x\n", retval);
1683 goto error;
1684 }
1685
1686 INIT_DELAYED_WORK(&dev->free_framebuffer_work,
1687 dlfb_free_framebuffer_work);
1688
1689 INIT_LIST_HEAD(&info->modelist);
1690
1691 retval = dlfb_setup_modes(dev, info, NULL, 0);
1692 if (retval != 0) {
1693 pr_err("unable to find common mode for display and adapter\n");
1694 goto error;
1695 }
1696
1697
1698
1699 atomic_set(&dev->usb_active, 1);
1700 dlfb_select_std_channel(dev);
1701
1702 dlfb_ops_check_var(&info->var, info);
1703 dlfb_ops_set_par(info);
1704
1705 retval = register_framebuffer(info);
1706 if (retval < 0) {
1707 pr_err("register_framebuffer failed %d\n", retval);
1708 goto error;
1709 }
1710
1711 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) {
1712 retval = device_create_file(info->dev, &fb_device_attrs[i]);
1713 if (retval) {
1714 pr_warn("device_create_file failed %d\n", retval);
1715 }
1716 }
1717
1718 retval = device_create_bin_file(info->dev, &edid_attr);
1719 if (retval) {
1720 pr_warn("device_create_bin_file failed %d\n", retval);
1721 }
1722
1723 pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution."
1724 " Using %dK framebuffer memory\n", info->node,
1725 info->var.xres, info->var.yres,
1726 ((dev->backing_buffer) ?
1727 info->fix.smem_len * 2 : info->fix.smem_len) >> 10);
1728 return;
1729
1730error:
1731 dlfb_free_framebuffer(dev);
1732}
1733
1734static void dlfb_usb_disconnect(struct usb_interface *interface)
1735{
1736 struct dlfb_data *dev;
1737 struct fb_info *info;
1738 int i;
1739
1740 dev = usb_get_intfdata(interface);
1741 info = dev->info;
1742
1743 pr_info("USB disconnect starting\n");
1744
1745
1746 dev->virtualized = true;
1747
1748
1749 atomic_set(&dev->usb_active, 0);
1750
1751
1752 dlfb_free_urb_list(dev);
1753
1754 if (info) {
1755
1756 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
1757 device_remove_file(info->dev, &fb_device_attrs[i]);
1758 device_remove_bin_file(info->dev, &edid_attr);
1759 unlink_framebuffer(info);
1760 }
1761
1762 usb_set_intfdata(interface, NULL);
1763 dev->udev = NULL;
1764 dev->gdev = NULL;
1765
1766
1767 if (dev->fb_count == 0)
1768 schedule_delayed_work(&dev->free_framebuffer_work, 0);
1769
1770
1771 kref_put(&dev->kref, dlfb_free);
1772
1773
1774
1775 return;
1776}
1777
1778static struct usb_driver dlfb_driver = {
1779 .name = "udlfb",
1780 .probe = dlfb_usb_probe,
1781 .disconnect = dlfb_usb_disconnect,
1782 .id_table = id_table,
1783};
1784
1785module_usb_driver(dlfb_driver);
1786
1787static void dlfb_urb_completion(struct urb *urb)
1788{
1789 struct urb_node *unode = urb->context;
1790 struct dlfb_data *dev = unode->dev;
1791 unsigned long flags;
1792
1793
1794 if (urb->status) {
1795 if (!(urb->status == -ENOENT ||
1796 urb->status == -ECONNRESET ||
1797 urb->status == -ESHUTDOWN)) {
1798 pr_err("%s - nonzero write bulk status received: %d\n",
1799 __func__, urb->status);
1800 atomic_set(&dev->lost_pixels, 1);
1801 }
1802 }
1803
1804 urb->transfer_buffer_length = dev->urbs.size;
1805
1806 spin_lock_irqsave(&dev->urbs.lock, flags);
1807 list_add_tail(&unode->entry, &dev->urbs.list);
1808 dev->urbs.available++;
1809 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1810
1811
1812
1813
1814
1815 if (fb_defio)
1816 schedule_delayed_work(&unode->release_urb_work, 0);
1817 else
1818 up(&dev->urbs.limit_sem);
1819}
1820
1821static void dlfb_free_urb_list(struct dlfb_data *dev)
1822{
1823 int count = dev->urbs.count;
1824 struct list_head *node;
1825 struct urb_node *unode;
1826 struct urb *urb;
1827 int ret;
1828 unsigned long flags;
1829
1830 pr_notice("Freeing all render urbs\n");
1831
1832
1833 while (count--) {
1834
1835
1836 ret = down_interruptible(&dev->urbs.limit_sem);
1837 if (ret)
1838 break;
1839
1840 spin_lock_irqsave(&dev->urbs.lock, flags);
1841
1842 node = dev->urbs.list.next;
1843 list_del_init(node);
1844
1845 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1846
1847 unode = list_entry(node, struct urb_node, entry);
1848 urb = unode->urb;
1849
1850
1851 usb_free_coherent(urb->dev, dev->urbs.size,
1852 urb->transfer_buffer, urb->transfer_dma);
1853 usb_free_urb(urb);
1854 kfree(node);
1855 }
1856
1857 dev->urbs.count = 0;
1858}
1859
1860static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size)
1861{
1862 int i = 0;
1863 struct urb *urb;
1864 struct urb_node *unode;
1865 char *buf;
1866
1867 spin_lock_init(&dev->urbs.lock);
1868
1869 dev->urbs.size = size;
1870 INIT_LIST_HEAD(&dev->urbs.list);
1871
1872 while (i < count) {
1873 unode = kzalloc(sizeof(struct urb_node), GFP_KERNEL);
1874 if (!unode)
1875 break;
1876 unode->dev = dev;
1877
1878 INIT_DELAYED_WORK(&unode->release_urb_work,
1879 dlfb_release_urb_work);
1880
1881 urb = usb_alloc_urb(0, GFP_KERNEL);
1882 if (!urb) {
1883 kfree(unode);
1884 break;
1885 }
1886 unode->urb = urb;
1887
1888 buf = usb_alloc_coherent(dev->udev, MAX_TRANSFER, GFP_KERNEL,
1889 &urb->transfer_dma);
1890 if (!buf) {
1891 kfree(unode);
1892 usb_free_urb(urb);
1893 break;
1894 }
1895
1896
1897 usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, 1),
1898 buf, size, dlfb_urb_completion, unode);
1899 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1900
1901 list_add_tail(&unode->entry, &dev->urbs.list);
1902
1903 i++;
1904 }
1905
1906 sema_init(&dev->urbs.limit_sem, i);
1907 dev->urbs.count = i;
1908 dev->urbs.available = i;
1909
1910 pr_notice("allocated %d %d byte urbs\n", i, (int) size);
1911
1912 return i;
1913}
1914
1915static struct urb *dlfb_get_urb(struct dlfb_data *dev)
1916{
1917 int ret = 0;
1918 struct list_head *entry;
1919 struct urb_node *unode;
1920 struct urb *urb = NULL;
1921 unsigned long flags;
1922
1923
1924 ret = down_timeout(&dev->urbs.limit_sem, GET_URB_TIMEOUT);
1925 if (ret) {
1926 atomic_set(&dev->lost_pixels, 1);
1927 pr_warn("wait for urb interrupted: %x available: %d\n",
1928 ret, dev->urbs.available);
1929 goto error;
1930 }
1931
1932 spin_lock_irqsave(&dev->urbs.lock, flags);
1933
1934 BUG_ON(list_empty(&dev->urbs.list));
1935 entry = dev->urbs.list.next;
1936 list_del_init(entry);
1937 dev->urbs.available--;
1938
1939 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1940
1941 unode = list_entry(entry, struct urb_node, entry);
1942 urb = unode->urb;
1943
1944error:
1945 return urb;
1946}
1947
1948static int dlfb_submit_urb(struct dlfb_data *dev, struct urb *urb, size_t len)
1949{
1950 int ret;
1951
1952 BUG_ON(len > dev->urbs.size);
1953
1954 urb->transfer_buffer_length = len;
1955 ret = usb_submit_urb(urb, GFP_KERNEL);
1956 if (ret) {
1957 dlfb_urb_completion(urb);
1958 atomic_set(&dev->lost_pixels, 1);
1959 pr_err("usb_submit_urb error %x\n", ret);
1960 }
1961 return ret;
1962}
1963
1964module_param(console, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1965MODULE_PARM_DESC(console, "Allow fbcon to open framebuffer");
1966
1967module_param(fb_defio, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1968MODULE_PARM_DESC(fb_defio, "Page fault detection of mmap writes");
1969
1970module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1971MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");
1972
1973module_param(pixel_limit, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1974MODULE_PARM_DESC(pixel_limit, "Force limit on max mode (in x*y pixels)");
1975
1976MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>, "
1977 "Jaya Kumar <jayakumar.lkml@gmail.com>, "
1978 "Bernie Thompson <bernie@plugable.com>");
1979MODULE_DESCRIPTION("DisplayLink kernel framebuffer driver");
1980MODULE_LICENSE("GPL");
1981
1982