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