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