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