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;
75
76
77static void dlfb_urb_completion(struct urb *urb);
78static struct urb *dlfb_get_urb(struct dlfb_data *dev);
79static int dlfb_submit_urb(struct dlfb_data *dev, struct urb * urb, size_t len);
80static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size);
81static void dlfb_free_urb_list(struct dlfb_data *dev);
82
83
84
85
86
87static char *dlfb_set_register(char *buf, u8 reg, u8 val)
88{
89 *buf++ = 0xAF;
90 *buf++ = 0x20;
91 *buf++ = reg;
92 *buf++ = val;
93 return buf;
94}
95
96static char *dlfb_vidreg_lock(char *buf)
97{
98 return dlfb_set_register(buf, 0xFF, 0x00);
99}
100
101static char *dlfb_vidreg_unlock(char *buf)
102{
103 return dlfb_set_register(buf, 0xFF, 0xFF);
104}
105
106
107
108
109
110
111
112
113
114
115
116static char *dlfb_blanking(char *buf, int fb_blank)
117{
118 u8 reg;
119
120 switch (fb_blank) {
121 case FB_BLANK_POWERDOWN:
122 reg = 0x07;
123 break;
124 case FB_BLANK_HSYNC_SUSPEND:
125 reg = 0x05;
126 break;
127 case FB_BLANK_VSYNC_SUSPEND:
128 reg = 0x03;
129 break;
130 case FB_BLANK_NORMAL:
131 reg = 0x01;
132 break;
133 default:
134 reg = 0x00;
135 }
136
137 buf = dlfb_set_register(buf, 0x1F, reg);
138
139 return buf;
140}
141
142static char *dlfb_set_color_depth(char *buf, u8 selection)
143{
144 return dlfb_set_register(buf, 0x00, selection);
145}
146
147static char *dlfb_set_base16bpp(char *wrptr, u32 base)
148{
149
150 wrptr = dlfb_set_register(wrptr, 0x20, base >> 16);
151 wrptr = dlfb_set_register(wrptr, 0x21, base >> 8);
152 return dlfb_set_register(wrptr, 0x22, base);
153}
154
155
156
157
158
159static char *dlfb_set_base8bpp(char *wrptr, u32 base)
160{
161 wrptr = dlfb_set_register(wrptr, 0x26, base >> 16);
162 wrptr = dlfb_set_register(wrptr, 0x27, base >> 8);
163 return dlfb_set_register(wrptr, 0x28, base);
164}
165
166static char *dlfb_set_register_16(char *wrptr, u8 reg, u16 value)
167{
168 wrptr = dlfb_set_register(wrptr, reg, value >> 8);
169 return dlfb_set_register(wrptr, reg+1, value);
170}
171
172
173
174
175
176static char *dlfb_set_register_16be(char *wrptr, u8 reg, u16 value)
177{
178 wrptr = dlfb_set_register(wrptr, reg, value);
179 return dlfb_set_register(wrptr, reg+1, value >> 8);
180}
181
182
183
184
185
186
187
188
189
190
191static u16 dlfb_lfsr16(u16 actual_count)
192{
193 u32 lv = 0xFFFF;
194
195 while (actual_count--) {
196 lv = ((lv << 1) |
197 (((lv >> 15) ^ (lv >> 4) ^ (lv >> 2) ^ (lv >> 1)) & 1))
198 & 0xFFFF;
199 }
200
201 return (u16) lv;
202}
203
204
205
206
207
208static char *dlfb_set_register_lfsr16(char *wrptr, u8 reg, u16 value)
209{
210 return dlfb_set_register_16(wrptr, reg, dlfb_lfsr16(value));
211}
212
213
214
215
216
217static char *dlfb_set_vid_cmds(char *wrptr, struct fb_var_screeninfo *var)
218{
219 u16 xds, yds;
220 u16 xde, yde;
221 u16 yec;
222
223
224 xds = var->left_margin + var->hsync_len;
225 wrptr = dlfb_set_register_lfsr16(wrptr, 0x01, xds);
226
227 xde = xds + var->xres;
228 wrptr = dlfb_set_register_lfsr16(wrptr, 0x03, xde);
229
230
231 yds = var->upper_margin + var->vsync_len;
232 wrptr = dlfb_set_register_lfsr16(wrptr, 0x05, yds);
233
234 yde = yds + var->yres;
235 wrptr = dlfb_set_register_lfsr16(wrptr, 0x07, yde);
236
237
238 wrptr = dlfb_set_register_lfsr16(wrptr, 0x09,
239 xde + var->right_margin - 1);
240
241
242 wrptr = dlfb_set_register_lfsr16(wrptr, 0x0B, 1);
243
244
245 wrptr = dlfb_set_register_lfsr16(wrptr, 0x0D, var->hsync_len + 1);
246
247
248 wrptr = dlfb_set_register_16(wrptr, 0x0F, var->xres);
249
250
251 yec = var->yres + var->upper_margin + var->lower_margin +
252 var->vsync_len;
253 wrptr = dlfb_set_register_lfsr16(wrptr, 0x11, yec);
254
255
256 wrptr = dlfb_set_register_lfsr16(wrptr, 0x13, 0);
257
258
259 wrptr = dlfb_set_register_lfsr16(wrptr, 0x15, var->vsync_len);
260
261
262 wrptr = dlfb_set_register_16(wrptr, 0x17, var->yres);
263
264
265 wrptr = dlfb_set_register_16be(wrptr, 0x1B,
266 200*1000*1000/var->pixclock);
267
268 return wrptr;
269}
270
271
272
273
274
275
276static int dlfb_set_video_mode(struct dlfb_data *dev,
277 struct fb_var_screeninfo *var)
278{
279 char *buf;
280 char *wrptr;
281 int retval = 0;
282 int writesize;
283 struct urb *urb;
284
285 if (!atomic_read(&dev->usb_active))
286 return -EPERM;
287
288 urb = dlfb_get_urb(dev);
289 if (!urb)
290 return -ENOMEM;
291
292 buf = (char *) urb->transfer_buffer;
293
294
295
296
297
298
299 wrptr = dlfb_vidreg_lock(buf);
300 wrptr = dlfb_set_color_depth(wrptr, 0x00);
301
302 wrptr = dlfb_set_base16bpp(wrptr, 0);
303
304 wrptr = dlfb_set_base8bpp(wrptr, dev->info->fix.smem_len);
305
306 wrptr = dlfb_set_vid_cmds(wrptr, var);
307 wrptr = dlfb_blanking(wrptr, FB_BLANK_UNBLANK);
308 wrptr = dlfb_vidreg_unlock(wrptr);
309
310 writesize = wrptr - buf;
311
312 retval = dlfb_submit_urb(dev, urb, writesize);
313
314 dev->blank_mode = FB_BLANK_UNBLANK;
315
316 return retval;
317}
318
319static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
320{
321 unsigned long start = vma->vm_start;
322 unsigned long size = vma->vm_end - vma->vm_start;
323 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
324 unsigned long page, pos;
325
326 if (offset + size > info->fix.smem_len)
327 return -EINVAL;
328
329 pos = (unsigned long)info->fix.smem_start + offset;
330
331 pr_notice("mmap() framebuffer addr:%lu size:%lu\n",
332 pos, size);
333
334 while (size > 0) {
335 page = vmalloc_to_pfn((void *)pos);
336 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
337 return -EAGAIN;
338
339 start += PAGE_SIZE;
340 pos += PAGE_SIZE;
341 if (size > PAGE_SIZE)
342 size -= PAGE_SIZE;
343 else
344 size = 0;
345 }
346
347 vma->vm_flags |= VM_RESERVED;
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) - 1, 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 = kmalloc(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
922 if (dev->urbs.count > 0)
923 dlfb_free_urb_list(dev);
924
925 if (dev->backing_buffer)
926 vfree(dev->backing_buffer);
927
928 kfree(dev->edid);
929
930 pr_warn("freeing dlfb_data %p\n", dev);
931
932 kfree(dev);
933}
934
935static void dlfb_release_urb_work(struct work_struct *work)
936{
937 struct urb_node *unode = container_of(work, struct urb_node,
938 release_urb_work.work);
939
940 up(&unode->dev->urbs.limit_sem);
941}
942
943static void dlfb_free_framebuffer_work(struct work_struct *work)
944{
945 struct dlfb_data *dev = container_of(work, struct dlfb_data,
946 free_framebuffer_work.work);
947 struct fb_info *info = dev->info;
948 int node = info->node;
949
950 unregister_framebuffer(info);
951
952 if (info->cmap.len != 0)
953 fb_dealloc_cmap(&info->cmap);
954 if (info->monspecs.modedb)
955 fb_destroy_modedb(info->monspecs.modedb);
956 if (info->screen_base)
957 vfree(info->screen_base);
958
959 fb_destroy_modelist(&info->modelist);
960
961 dev->info = 0;
962
963
964 framebuffer_release(info);
965
966 pr_warn("fb_info for /dev/fb%d has been freed\n", node);
967
968
969 kref_put(&dev->kref, dlfb_free);
970}
971
972
973
974
975static int dlfb_ops_release(struct fb_info *info, int user)
976{
977 struct dlfb_data *dev = info->par;
978
979 dev->fb_count--;
980
981
982 if (dev->virtualized && (dev->fb_count == 0))
983 schedule_delayed_work(&dev->free_framebuffer_work, HZ);
984
985 if ((dev->fb_count == 0) && (info->fbdefio)) {
986 fb_deferred_io_cleanup(info);
987 kfree(info->fbdefio);
988 info->fbdefio = NULL;
989 info->fbops->fb_mmap = dlfb_ops_mmap;
990 }
991
992 pr_warn("released /dev/fb%d user=%d count=%d\n",
993 info->node, user, dev->fb_count);
994
995 kref_put(&dev->kref, dlfb_free);
996
997 return 0;
998}
999
1000
1001
1002
1003
1004static int dlfb_is_valid_mode(struct fb_videomode *mode,
1005 struct fb_info *info)
1006{
1007 struct dlfb_data *dev = info->par;
1008
1009 if (mode->xres * mode->yres > dev->sku_pixel_limit) {
1010 pr_warn("%dx%d beyond chip capabilities\n",
1011 mode->xres, mode->yres);
1012 return 0;
1013 }
1014
1015 pr_info("%dx%d valid mode\n", mode->xres, mode->yres);
1016
1017 return 1;
1018}
1019
1020static void dlfb_var_color_format(struct fb_var_screeninfo *var)
1021{
1022 const struct fb_bitfield red = { 11, 5, 0 };
1023 const struct fb_bitfield green = { 5, 6, 0 };
1024 const struct fb_bitfield blue = { 0, 5, 0 };
1025
1026 var->bits_per_pixel = 16;
1027 var->red = red;
1028 var->green = green;
1029 var->blue = blue;
1030}
1031
1032static int dlfb_ops_check_var(struct fb_var_screeninfo *var,
1033 struct fb_info *info)
1034{
1035 struct fb_videomode mode;
1036
1037
1038 if ((var->xres * var->yres * 2) > info->fix.smem_len)
1039 return -EINVAL;
1040
1041
1042 dlfb_var_color_format(var);
1043
1044 fb_var_to_videomode(&mode, var);
1045
1046 if (!dlfb_is_valid_mode(&mode, info))
1047 return -EINVAL;
1048
1049 return 0;
1050}
1051
1052static int dlfb_ops_set_par(struct fb_info *info)
1053{
1054 struct dlfb_data *dev = info->par;
1055 int result;
1056 u16 *pix_framebuffer;
1057 int i;
1058
1059 pr_notice("set_par mode %dx%d\n", info->var.xres, info->var.yres);
1060
1061 result = dlfb_set_video_mode(dev, &info->var);
1062
1063 if ((result == 0) && (dev->fb_count == 0)) {
1064
1065
1066
1067 pix_framebuffer = (u16 *) info->screen_base;
1068 for (i = 0; i < info->fix.smem_len / 2; i++)
1069 pix_framebuffer[i] = 0x37e6;
1070
1071 dlfb_handle_damage(dev, 0, 0, info->var.xres, info->var.yres,
1072 info->screen_base);
1073 }
1074
1075 return result;
1076}
1077
1078
1079static char *dlfb_dummy_render(char *buf)
1080{
1081 *buf++ = 0xAF;
1082 *buf++ = 0x6A;
1083 *buf++ = 0x00;
1084 *buf++ = 0x00;
1085 *buf++ = 0x00;
1086 *buf++ = 0x01;
1087 *buf++ = 0x00;
1088 *buf++ = 0x00;
1089 *buf++ = 0x00;
1090 return buf;
1091}
1092
1093
1094
1095
1096static int dlfb_ops_blank(int blank_mode, struct fb_info *info)
1097{
1098 struct dlfb_data *dev = info->par;
1099 char *bufptr;
1100 struct urb *urb;
1101
1102 pr_info("/dev/fb%d FB_BLANK mode %d --> %d\n",
1103 info->node, dev->blank_mode, blank_mode);
1104
1105 if ((dev->blank_mode == FB_BLANK_POWERDOWN) &&
1106 (blank_mode != FB_BLANK_POWERDOWN)) {
1107
1108
1109 dlfb_set_video_mode(dev, &info->var);
1110 }
1111
1112 urb = dlfb_get_urb(dev);
1113 if (!urb)
1114 return 0;
1115
1116 bufptr = (char *) urb->transfer_buffer;
1117 bufptr = dlfb_vidreg_lock(bufptr);
1118 bufptr = dlfb_blanking(bufptr, blank_mode);
1119 bufptr = dlfb_vidreg_unlock(bufptr);
1120
1121
1122 bufptr = dlfb_dummy_render(bufptr);
1123
1124 dlfb_submit_urb(dev, urb, bufptr -
1125 (char *) urb->transfer_buffer);
1126
1127 dev->blank_mode = blank_mode;
1128
1129 return 0;
1130}
1131
1132static struct fb_ops dlfb_ops = {
1133 .owner = THIS_MODULE,
1134 .fb_read = fb_sys_read,
1135 .fb_write = dlfb_ops_write,
1136 .fb_setcolreg = dlfb_ops_setcolreg,
1137 .fb_fillrect = dlfb_ops_fillrect,
1138 .fb_copyarea = dlfb_ops_copyarea,
1139 .fb_imageblit = dlfb_ops_imageblit,
1140 .fb_mmap = dlfb_ops_mmap,
1141 .fb_ioctl = dlfb_ops_ioctl,
1142 .fb_open = dlfb_ops_open,
1143 .fb_release = dlfb_ops_release,
1144 .fb_blank = dlfb_ops_blank,
1145 .fb_check_var = dlfb_ops_check_var,
1146 .fb_set_par = dlfb_ops_set_par,
1147};
1148
1149
1150
1151
1152
1153
1154static int dlfb_realloc_framebuffer(struct dlfb_data *dev, struct fb_info *info)
1155{
1156 int retval = -ENOMEM;
1157 int old_len = info->fix.smem_len;
1158 int new_len;
1159 unsigned char *old_fb = info->screen_base;
1160 unsigned char *new_fb;
1161 unsigned char *new_back = 0;
1162
1163 pr_warn("Reallocating framebuffer. Addresses will change!\n");
1164
1165 new_len = info->fix.line_length * info->var.yres;
1166
1167 if (PAGE_ALIGN(new_len) > old_len) {
1168
1169
1170
1171 new_fb = vmalloc(new_len);
1172 if (!new_fb) {
1173 pr_err("Virtual framebuffer alloc failed\n");
1174 goto error;
1175 }
1176
1177 if (info->screen_base) {
1178 memcpy(new_fb, old_fb, old_len);
1179 vfree(info->screen_base);
1180 }
1181
1182 info->screen_base = new_fb;
1183 info->fix.smem_len = PAGE_ALIGN(new_len);
1184 info->fix.smem_start = (unsigned long) new_fb;
1185 info->flags = udlfb_info_flags;
1186
1187
1188
1189
1190
1191
1192
1193 if (shadow)
1194 new_back = vzalloc(new_len);
1195 if (!new_back)
1196 pr_info("No shadow/backing buffer allocated\n");
1197 else {
1198 if (dev->backing_buffer)
1199 vfree(dev->backing_buffer);
1200 dev->backing_buffer = new_back;
1201 }
1202 }
1203
1204 retval = 0;
1205
1206error:
1207 return retval;
1208}
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224static int dlfb_setup_modes(struct dlfb_data *dev,
1225 struct fb_info *info,
1226 char *default_edid, size_t default_edid_size)
1227{
1228 int i;
1229 const struct fb_videomode *default_vmode = NULL;
1230 int result = 0;
1231 char *edid;
1232 int tries = 3;
1233
1234 if (info->dev)
1235 mutex_lock(&info->lock);
1236
1237 edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
1238 if (!edid) {
1239 result = -ENOMEM;
1240 goto error;
1241 }
1242
1243 fb_destroy_modelist(&info->modelist);
1244 memset(&info->monspecs, 0, sizeof(info->monspecs));
1245
1246
1247
1248
1249
1250
1251 while (tries--) {
1252
1253 i = dlfb_get_edid(dev, edid, EDID_LENGTH);
1254
1255 if (i >= EDID_LENGTH)
1256 fb_edid_to_monspecs(edid, &info->monspecs);
1257
1258 if (info->monspecs.modedb_len > 0) {
1259 dev->edid = edid;
1260 dev->edid_size = i;
1261 break;
1262 }
1263 }
1264
1265
1266 if (info->monspecs.modedb_len == 0) {
1267
1268 pr_err("Unable to get valid EDID from device/display\n");
1269
1270 if (dev->edid) {
1271 fb_edid_to_monspecs(dev->edid, &info->monspecs);
1272 if (info->monspecs.modedb_len > 0)
1273 pr_err("Using previously queried EDID\n");
1274 }
1275 }
1276
1277
1278 if (info->monspecs.modedb_len == 0) {
1279 if (default_edid_size >= EDID_LENGTH) {
1280 fb_edid_to_monspecs(default_edid, &info->monspecs);
1281 if (info->monspecs.modedb_len > 0) {
1282 memcpy(edid, default_edid, default_edid_size);
1283 dev->edid = edid;
1284 dev->edid_size = default_edid_size;
1285 pr_err("Using default/backup EDID\n");
1286 }
1287 }
1288 }
1289
1290
1291 if (info->monspecs.modedb_len > 0) {
1292
1293 for (i = 0; i < info->monspecs.modedb_len; i++) {
1294 if (dlfb_is_valid_mode(&info->monspecs.modedb[i], info))
1295 fb_add_videomode(&info->monspecs.modedb[i],
1296 &info->modelist);
1297 else {
1298 if (i == 0)
1299
1300 info->monspecs.misc
1301 &= ~FB_MISC_1ST_DETAIL;
1302 }
1303 }
1304
1305 default_vmode = fb_find_best_display(&info->monspecs,
1306 &info->modelist);
1307 }
1308
1309
1310 if (default_vmode == NULL) {
1311
1312 struct fb_videomode fb_vmode = {0};
1313
1314
1315
1316
1317
1318
1319
1320 for (i = 0; i < VESA_MODEDB_SIZE; i++) {
1321 if (dlfb_is_valid_mode((struct fb_videomode *)
1322 &vesa_modes[i], info))
1323 fb_add_videomode(&vesa_modes[i],
1324 &info->modelist);
1325 }
1326
1327
1328
1329
1330
1331 fb_vmode.xres = 800;
1332 fb_vmode.yres = 600;
1333 fb_vmode.refresh = 60;
1334 default_vmode = fb_find_nearest_mode(&fb_vmode,
1335 &info->modelist);
1336 }
1337
1338
1339 if ((default_vmode != NULL) && (dev->fb_count == 0)) {
1340
1341 fb_videomode_to_var(&info->var, default_vmode);
1342 dlfb_var_color_format(&info->var);
1343
1344
1345
1346
1347 memcpy(&info->fix, &dlfb_fix, sizeof(dlfb_fix));
1348 info->fix.line_length = info->var.xres *
1349 (info->var.bits_per_pixel / 8);
1350
1351 result = dlfb_realloc_framebuffer(dev, info);
1352
1353 } else
1354 result = -EINVAL;
1355
1356error:
1357 if (edid && (dev->edid != edid))
1358 kfree(edid);
1359
1360 if (info->dev)
1361 mutex_unlock(&info->lock);
1362
1363 return result;
1364}
1365
1366static ssize_t metrics_bytes_rendered_show(struct device *fbdev,
1367 struct device_attribute *a, char *buf) {
1368 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1369 struct dlfb_data *dev = fb_info->par;
1370 return snprintf(buf, PAGE_SIZE, "%u\n",
1371 atomic_read(&dev->bytes_rendered));
1372}
1373
1374static ssize_t metrics_bytes_identical_show(struct device *fbdev,
1375 struct device_attribute *a, char *buf) {
1376 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1377 struct dlfb_data *dev = fb_info->par;
1378 return snprintf(buf, PAGE_SIZE, "%u\n",
1379 atomic_read(&dev->bytes_identical));
1380}
1381
1382static ssize_t metrics_bytes_sent_show(struct device *fbdev,
1383 struct device_attribute *a, char *buf) {
1384 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1385 struct dlfb_data *dev = fb_info->par;
1386 return snprintf(buf, PAGE_SIZE, "%u\n",
1387 atomic_read(&dev->bytes_sent));
1388}
1389
1390static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev,
1391 struct device_attribute *a, char *buf) {
1392 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1393 struct dlfb_data *dev = fb_info->par;
1394 return snprintf(buf, PAGE_SIZE, "%u\n",
1395 atomic_read(&dev->cpu_kcycles_used));
1396}
1397
1398static ssize_t edid_show(
1399 struct file *filp,
1400 struct kobject *kobj, struct bin_attribute *a,
1401 char *buf, loff_t off, size_t count) {
1402 struct device *fbdev = container_of(kobj, struct device, kobj);
1403 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1404 struct dlfb_data *dev = fb_info->par;
1405
1406 if (dev->edid == NULL)
1407 return 0;
1408
1409 if ((off >= dev->edid_size) || (count > dev->edid_size))
1410 return 0;
1411
1412 if (off + count > dev->edid_size)
1413 count = dev->edid_size - off;
1414
1415 pr_info("sysfs edid copy %p to %p, %d bytes\n",
1416 dev->edid, buf, (int) count);
1417
1418 memcpy(buf, dev->edid, count);
1419
1420 return count;
1421}
1422
1423static ssize_t edid_store(
1424 struct file *filp,
1425 struct kobject *kobj, struct bin_attribute *a,
1426 char *src, loff_t src_off, size_t src_size) {
1427 struct device *fbdev = container_of(kobj, struct device, kobj);
1428 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1429 struct dlfb_data *dev = fb_info->par;
1430
1431
1432 if ((src_size != EDID_LENGTH) || (src_off != 0))
1433 return 0;
1434
1435 dlfb_setup_modes(dev, fb_info, src, src_size);
1436
1437 if (dev->edid && (memcmp(src, dev->edid, src_size) == 0)) {
1438 pr_info("sysfs written EDID is new default\n");
1439 dlfb_ops_set_par(fb_info);
1440 return src_size;
1441 } else
1442 return 0;
1443}
1444
1445static ssize_t metrics_reset_store(struct device *fbdev,
1446 struct device_attribute *attr,
1447 const char *buf, size_t count)
1448{
1449 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1450 struct dlfb_data *dev = fb_info->par;
1451
1452 atomic_set(&dev->bytes_rendered, 0);
1453 atomic_set(&dev->bytes_identical, 0);
1454 atomic_set(&dev->bytes_sent, 0);
1455 atomic_set(&dev->cpu_kcycles_used, 0);
1456
1457 return count;
1458}
1459
1460static struct bin_attribute edid_attr = {
1461 .attr.name = "edid",
1462 .attr.mode = 0666,
1463 .size = EDID_LENGTH,
1464 .read = edid_show,
1465 .write = edid_store
1466};
1467
1468static struct device_attribute fb_device_attrs[] = {
1469 __ATTR_RO(metrics_bytes_rendered),
1470 __ATTR_RO(metrics_bytes_identical),
1471 __ATTR_RO(metrics_bytes_sent),
1472 __ATTR_RO(metrics_cpu_kcycles_used),
1473 __ATTR(metrics_reset, S_IWUSR, NULL, metrics_reset_store),
1474};
1475
1476
1477
1478
1479static int dlfb_select_std_channel(struct dlfb_data *dev)
1480{
1481 int ret;
1482 u8 set_def_chn[] = { 0x57, 0xCD, 0xDC, 0xA7,
1483 0x1C, 0x88, 0x5E, 0x15,
1484 0x60, 0xFE, 0xC6, 0x97,
1485 0x16, 0x3D, 0x47, 0xF2 };
1486
1487 ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1488 NR_USB_REQUEST_CHANNEL,
1489 (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
1490 set_def_chn, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT);
1491 return ret;
1492}
1493
1494static int dlfb_parse_vendor_descriptor(struct dlfb_data *dev,
1495 struct usb_interface *interface)
1496{
1497 char *desc;
1498 char *buf;
1499 char *desc_end;
1500
1501 int total_len = 0;
1502
1503 buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
1504 if (!buf)
1505 return false;
1506 desc = buf;
1507
1508 total_len = usb_get_descriptor(interface_to_usbdev(interface),
1509 0x5f,
1510 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE);
1511
1512
1513 if (total_len < 0) {
1514 if (0 == usb_get_extra_descriptor(interface->cur_altsetting,
1515 0x5f, &desc))
1516 total_len = (int) desc[0];
1517 }
1518
1519 if (total_len > 5) {
1520 pr_info("vendor descriptor length:%x data:%02x %02x %02x %02x" \
1521 "%02x %02x %02x %02x %02x %02x %02x\n",
1522 total_len, desc[0],
1523 desc[1], desc[2], desc[3], desc[4], desc[5], desc[6],
1524 desc[7], desc[8], desc[9], desc[10]);
1525
1526 if ((desc[0] != total_len) ||
1527 (desc[1] != 0x5f) ||
1528 (desc[2] != 0x01) ||
1529 (desc[3] != 0x00) ||
1530 (desc[4] != total_len - 2))
1531 goto unrecognized;
1532
1533 desc_end = desc + total_len;
1534 desc += 5;
1535
1536 while (desc < desc_end) {
1537 u8 length;
1538 u16 key;
1539
1540 key = *((u16 *) desc);
1541 desc += sizeof(u16);
1542 length = *desc;
1543 desc++;
1544
1545 switch (key) {
1546 case 0x0200: {
1547 u32 max_area;
1548 max_area = le32_to_cpu(*((u32 *)desc));
1549 pr_warn("DL chip limited to %d pixel modes\n",
1550 max_area);
1551 dev->sku_pixel_limit = max_area;
1552 break;
1553 }
1554 default:
1555 break;
1556 }
1557 desc += length;
1558 }
1559 } else {
1560 pr_info("vendor descriptor not available (%d)\n", total_len);
1561 }
1562
1563 goto success;
1564
1565unrecognized:
1566
1567 pr_err("Unrecognized vendor firmware descriptor\n");
1568
1569success:
1570 kfree(buf);
1571 return true;
1572}
1573static int dlfb_usb_probe(struct usb_interface *interface,
1574 const struct usb_device_id *id)
1575{
1576 struct usb_device *usbdev;
1577 struct dlfb_data *dev = 0;
1578 struct fb_info *info = 0;
1579 int retval = -ENOMEM;
1580 int i;
1581
1582
1583
1584 usbdev = interface_to_usbdev(interface);
1585
1586 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1587 if (dev == NULL) {
1588 err("dlfb_usb_probe: failed alloc of dev struct\n");
1589 goto error;
1590 }
1591
1592
1593 kref_init(&dev->kref);
1594 kref_get(&dev->kref);
1595
1596 dev->udev = usbdev;
1597 dev->gdev = &usbdev->dev;
1598 usb_set_intfdata(interface, dev);
1599
1600 pr_info("%s %s - serial #%s\n",
1601 usbdev->manufacturer, usbdev->product, usbdev->serial);
1602 pr_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n",
1603 usbdev->descriptor.idVendor, usbdev->descriptor.idProduct,
1604 usbdev->descriptor.bcdDevice, dev);
1605 pr_info("console enable=%d\n", console);
1606 pr_info("fb_defio enable=%d\n", fb_defio);
1607 pr_info("shadow enable=%d\n", shadow);
1608
1609 dev->sku_pixel_limit = 2048 * 1152;
1610
1611 if (!dlfb_parse_vendor_descriptor(dev, interface)) {
1612 pr_err("firmware not recognized. Assume incompatible device\n");
1613 goto error;
1614 }
1615
1616 if (!dlfb_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
1617 retval = -ENOMEM;
1618 pr_err("dlfb_alloc_urb_list failed\n");
1619 goto error;
1620 }
1621
1622
1623
1624
1625 info = framebuffer_alloc(0, &interface->dev);
1626 if (!info) {
1627 retval = -ENOMEM;
1628 pr_err("framebuffer_alloc failed\n");
1629 goto error;
1630 }
1631
1632 dev->info = info;
1633 info->par = dev;
1634 info->pseudo_palette = dev->pseudo_palette;
1635 info->fbops = &dlfb_ops;
1636
1637 retval = fb_alloc_cmap(&info->cmap, 256, 0);
1638 if (retval < 0) {
1639 pr_err("fb_alloc_cmap failed %x\n", retval);
1640 goto error;
1641 }
1642
1643 INIT_DELAYED_WORK(&dev->free_framebuffer_work,
1644 dlfb_free_framebuffer_work);
1645
1646 INIT_LIST_HEAD(&info->modelist);
1647
1648 retval = dlfb_setup_modes(dev, info, NULL, 0);
1649 if (retval != 0) {
1650 pr_err("unable to find common mode for display and adapter\n");
1651 goto error;
1652 }
1653
1654
1655
1656 atomic_set(&dev->usb_active, 1);
1657 dlfb_select_std_channel(dev);
1658
1659 dlfb_ops_check_var(&info->var, info);
1660 dlfb_ops_set_par(info);
1661
1662 retval = register_framebuffer(info);
1663 if (retval < 0) {
1664 pr_err("register_framebuffer failed %d\n", retval);
1665 goto error;
1666 }
1667
1668 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) {
1669 retval = device_create_file(info->dev, &fb_device_attrs[i]);
1670 if (retval) {
1671 pr_err("device_create_file failed %d\n", retval);
1672 goto err_del_attrs;
1673 }
1674 }
1675
1676 retval = device_create_bin_file(info->dev, &edid_attr);
1677 if (retval) {
1678 pr_err("device_create_bin_file failed %d\n", retval);
1679 goto err_del_attrs;
1680 }
1681
1682 pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution."
1683 " Using %dK framebuffer memory\n", info->node,
1684 info->var.xres, info->var.yres,
1685 ((dev->backing_buffer) ?
1686 info->fix.smem_len * 2 : info->fix.smem_len) >> 10);
1687 return 0;
1688
1689err_del_attrs:
1690 for (i -= 1; i >= 0; i--)
1691 device_remove_file(info->dev, &fb_device_attrs[i]);
1692
1693error:
1694 if (dev) {
1695
1696 if (info) {
1697 if (info->cmap.len != 0)
1698 fb_dealloc_cmap(&info->cmap);
1699 if (info->monspecs.modedb)
1700 fb_destroy_modedb(info->monspecs.modedb);
1701 if (info->screen_base)
1702 vfree(info->screen_base);
1703
1704 fb_destroy_modelist(&info->modelist);
1705
1706 framebuffer_release(info);
1707 }
1708
1709 if (dev->backing_buffer)
1710 vfree(dev->backing_buffer);
1711
1712 kref_put(&dev->kref, dlfb_free);
1713 kref_put(&dev->kref, dlfb_free);
1714
1715
1716 }
1717
1718 return retval;
1719}
1720
1721static void dlfb_usb_disconnect(struct usb_interface *interface)
1722{
1723 struct dlfb_data *dev;
1724 struct fb_info *info;
1725 int i;
1726
1727 dev = usb_get_intfdata(interface);
1728 info = dev->info;
1729
1730 pr_info("USB disconnect starting\n");
1731
1732
1733 dev->virtualized = true;
1734
1735
1736 atomic_set(&dev->usb_active, 0);
1737
1738
1739 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
1740 device_remove_file(info->dev, &fb_device_attrs[i]);
1741 device_remove_bin_file(info->dev, &edid_attr);
1742
1743 usb_set_intfdata(interface, NULL);
1744
1745
1746 if (dev->fb_count == 0)
1747 schedule_delayed_work(&dev->free_framebuffer_work, 0);
1748
1749
1750 kref_put(&dev->kref, dlfb_free);
1751
1752
1753
1754 return;
1755}
1756
1757static struct usb_driver dlfb_driver = {
1758 .name = "udlfb",
1759 .probe = dlfb_usb_probe,
1760 .disconnect = dlfb_usb_disconnect,
1761 .id_table = id_table,
1762};
1763
1764module_usb_driver(dlfb_driver);
1765
1766static void dlfb_urb_completion(struct urb *urb)
1767{
1768 struct urb_node *unode = urb->context;
1769 struct dlfb_data *dev = unode->dev;
1770 unsigned long flags;
1771
1772
1773 if (urb->status) {
1774 if (!(urb->status == -ENOENT ||
1775 urb->status == -ECONNRESET ||
1776 urb->status == -ESHUTDOWN)) {
1777 pr_err("%s - nonzero write bulk status received: %d\n",
1778 __func__, urb->status);
1779 atomic_set(&dev->lost_pixels, 1);
1780 }
1781 }
1782
1783 urb->transfer_buffer_length = dev->urbs.size;
1784
1785 spin_lock_irqsave(&dev->urbs.lock, flags);
1786 list_add_tail(&unode->entry, &dev->urbs.list);
1787 dev->urbs.available++;
1788 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1789
1790
1791
1792
1793
1794 if (fb_defio)
1795 schedule_delayed_work(&unode->release_urb_work, 0);
1796 else
1797 up(&dev->urbs.limit_sem);
1798}
1799
1800static void dlfb_free_urb_list(struct dlfb_data *dev)
1801{
1802 int count = dev->urbs.count;
1803 struct list_head *node;
1804 struct urb_node *unode;
1805 struct urb *urb;
1806 int ret;
1807 unsigned long flags;
1808
1809 pr_notice("Waiting for completes and freeing all render urbs\n");
1810
1811
1812 while (count--) {
1813
1814
1815 ret = down_interruptible(&dev->urbs.limit_sem);
1816 if (ret)
1817 break;
1818
1819 spin_lock_irqsave(&dev->urbs.lock, flags);
1820
1821 node = dev->urbs.list.next;
1822 list_del_init(node);
1823
1824 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1825
1826 unode = list_entry(node, struct urb_node, entry);
1827 urb = unode->urb;
1828
1829
1830 usb_free_coherent(urb->dev, dev->urbs.size,
1831 urb->transfer_buffer, urb->transfer_dma);
1832 usb_free_urb(urb);
1833 kfree(node);
1834 }
1835
1836}
1837
1838static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size)
1839{
1840 int i = 0;
1841 struct urb *urb;
1842 struct urb_node *unode;
1843 char *buf;
1844
1845 spin_lock_init(&dev->urbs.lock);
1846
1847 dev->urbs.size = size;
1848 INIT_LIST_HEAD(&dev->urbs.list);
1849
1850 while (i < count) {
1851 unode = kzalloc(sizeof(struct urb_node), GFP_KERNEL);
1852 if (!unode)
1853 break;
1854 unode->dev = dev;
1855
1856 INIT_DELAYED_WORK(&unode->release_urb_work,
1857 dlfb_release_urb_work);
1858
1859 urb = usb_alloc_urb(0, GFP_KERNEL);
1860 if (!urb) {
1861 kfree(unode);
1862 break;
1863 }
1864 unode->urb = urb;
1865
1866 buf = usb_alloc_coherent(dev->udev, MAX_TRANSFER, GFP_KERNEL,
1867 &urb->transfer_dma);
1868 if (!buf) {
1869 kfree(unode);
1870 usb_free_urb(urb);
1871 break;
1872 }
1873
1874
1875 usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, 1),
1876 buf, size, dlfb_urb_completion, unode);
1877 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1878
1879 list_add_tail(&unode->entry, &dev->urbs.list);
1880
1881 i++;
1882 }
1883
1884 sema_init(&dev->urbs.limit_sem, i);
1885 dev->urbs.count = i;
1886 dev->urbs.available = i;
1887
1888 pr_notice("allocated %d %d byte urbs\n", i, (int) size);
1889
1890 return i;
1891}
1892
1893static struct urb *dlfb_get_urb(struct dlfb_data *dev)
1894{
1895 int ret = 0;
1896 struct list_head *entry;
1897 struct urb_node *unode;
1898 struct urb *urb = NULL;
1899 unsigned long flags;
1900
1901
1902 ret = down_timeout(&dev->urbs.limit_sem, GET_URB_TIMEOUT);
1903 if (ret) {
1904 atomic_set(&dev->lost_pixels, 1);
1905 pr_warn("wait for urb interrupted: %x available: %d\n",
1906 ret, dev->urbs.available);
1907 goto error;
1908 }
1909
1910 spin_lock_irqsave(&dev->urbs.lock, flags);
1911
1912 BUG_ON(list_empty(&dev->urbs.list));
1913 entry = dev->urbs.list.next;
1914 list_del_init(entry);
1915 dev->urbs.available--;
1916
1917 spin_unlock_irqrestore(&dev->urbs.lock, flags);
1918
1919 unode = list_entry(entry, struct urb_node, entry);
1920 urb = unode->urb;
1921
1922error:
1923 return urb;
1924}
1925
1926static int dlfb_submit_urb(struct dlfb_data *dev, struct urb *urb, size_t len)
1927{
1928 int ret;
1929
1930 BUG_ON(len > dev->urbs.size);
1931
1932 urb->transfer_buffer_length = len;
1933 ret = usb_submit_urb(urb, GFP_KERNEL);
1934 if (ret) {
1935 dlfb_urb_completion(urb);
1936 atomic_set(&dev->lost_pixels, 1);
1937 pr_err("usb_submit_urb error %x\n", ret);
1938 }
1939 return ret;
1940}
1941
1942module_param(console, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1943MODULE_PARM_DESC(console, "Allow fbcon to open framebuffer");
1944
1945module_param(fb_defio, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1946MODULE_PARM_DESC(fb_defio, "Page fault detection of mmap writes");
1947
1948module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1949MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");
1950
1951MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>, "
1952 "Jaya Kumar <jayakumar.lkml@gmail.com>, "
1953 "Bernie Thompson <bernie@plugable.com>");
1954MODULE_DESCRIPTION("DisplayLink kernel framebuffer driver");
1955MODULE_LICENSE("GPL");
1956
1957