This source file includes following definitions.
- dlfb_set_register
- dlfb_vidreg_lock
- dlfb_vidreg_unlock
- dlfb_blanking
- dlfb_set_color_depth
- dlfb_set_base16bpp
- dlfb_set_base8bpp
- dlfb_set_register_16
- dlfb_set_register_16be
- dlfb_lfsr16
- dlfb_set_register_lfsr16
- dlfb_set_vid_cmds
- dlfb_set_video_mode
- dlfb_ops_mmap
- dlfb_trim_hline
- dlfb_compress_hline
- dlfb_render_hline
- dlfb_handle_damage
- dlfb_init_damage
- dlfb_damage_work
- dlfb_offload_damage
- dlfb_ops_write
- dlfb_ops_copyarea
- dlfb_ops_imageblit
- dlfb_ops_fillrect
- dlfb_dpy_deferred_io
- dlfb_get_edid
- dlfb_ops_ioctl
- dlfb_ops_setcolreg
- dlfb_ops_open
- dlfb_ops_destroy
- dlfb_ops_release
- dlfb_is_valid_mode
- dlfb_var_color_format
- dlfb_ops_check_var
- dlfb_ops_set_par
- dlfb_dummy_render
- dlfb_ops_blank
- dlfb_deferred_vfree
- dlfb_realloc_framebuffer
- dlfb_setup_modes
- metrics_bytes_rendered_show
- metrics_bytes_identical_show
- metrics_bytes_sent_show
- metrics_cpu_kcycles_used_show
- edid_show
- edid_store
- metrics_reset_store
- dlfb_select_std_channel
- dlfb_parse_vendor_descriptor
- dlfb_usb_probe
- dlfb_usb_disconnect
- dlfb_urb_completion
- dlfb_free_urb_list
- dlfb_alloc_urb_list
- dlfb_get_urb
- dlfb_submit_urb
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
30 static 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
40 static 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
52 static 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 };
64 MODULE_DEVICE_TABLE(usb, id_table);
65
66
67 static bool console = 1;
68 static bool fb_defio = 1;
69 static bool shadow = 1;
70 static int pixel_limit;
71
72 struct dlfb_deferred_free {
73 struct list_head list;
74 void *mem;
75 };
76
77 static int dlfb_realloc_framebuffer(struct dlfb_data *dlfb, struct fb_info *info, u32 new_len);
78
79
80 static void dlfb_urb_completion(struct urb *urb);
81 static struct urb *dlfb_get_urb(struct dlfb_data *dlfb);
82 static int dlfb_submit_urb(struct dlfb_data *dlfb, struct urb * urb, size_t len);
83 static int dlfb_alloc_urb_list(struct dlfb_data *dlfb, int count, size_t size);
84 static void dlfb_free_urb_list(struct dlfb_data *dlfb);
85
86
87
88
89
90 static 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
99 static char *dlfb_vidreg_lock(char *buf)
100 {
101 return dlfb_set_register(buf, 0xFF, 0x00);
102 }
103
104 static 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
119 static 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
145 static char *dlfb_set_color_depth(char *buf, u8 selection)
146 {
147 return dlfb_set_register(buf, 0x00, selection);
148 }
149
150 static 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
162 static 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
169 static 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
179 static 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
194 static 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
211 static 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
220 static 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
279 static 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
322 static 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
364 static 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
422 static 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
535 static 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
594 static 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
653 error:
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
664 unlock_ret:
665 mutex_unlock(&dlfb->render_mutex);
666 return ret;
667 }
668
669 static 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
677 static 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
694 static 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
719 static 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
741 static 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
753 static 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
764 static 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
781 static 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
831 error:
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);
839 unlock_ret:
840 mutex_unlock(&dlfb->render_mutex);
841 }
842
843 static 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
871 static 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
925 static int
926 dlfb_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
956 static 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
996 static 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
1030 static 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 info->fbops->fb_mmap = dlfb_ops_mmap;
1041 }
1042
1043 dev_dbg(info->dev, "release, user=%d count=%d\n", user, dlfb->fb_count);
1044
1045 return 0;
1046 }
1047
1048
1049
1050
1051
1052 static int dlfb_is_valid_mode(struct fb_videomode *mode, struct dlfb_data *dlfb)
1053 {
1054 if (mode->xres * mode->yres > dlfb->sku_pixel_limit)
1055 return 0;
1056
1057 return 1;
1058 }
1059
1060 static void dlfb_var_color_format(struct fb_var_screeninfo *var)
1061 {
1062 const struct fb_bitfield red = { 11, 5, 0 };
1063 const struct fb_bitfield green = { 5, 6, 0 };
1064 const struct fb_bitfield blue = { 0, 5, 0 };
1065
1066 var->bits_per_pixel = 16;
1067 var->red = red;
1068 var->green = green;
1069 var->blue = blue;
1070 }
1071
1072 static int dlfb_ops_check_var(struct fb_var_screeninfo *var,
1073 struct fb_info *info)
1074 {
1075 struct fb_videomode mode;
1076 struct dlfb_data *dlfb = info->par;
1077
1078
1079 dlfb_var_color_format(var);
1080
1081 fb_var_to_videomode(&mode, var);
1082
1083 if (!dlfb_is_valid_mode(&mode, dlfb))
1084 return -EINVAL;
1085
1086 return 0;
1087 }
1088
1089 static int dlfb_ops_set_par(struct fb_info *info)
1090 {
1091 struct dlfb_data *dlfb = info->par;
1092 int result;
1093 u16 *pix_framebuffer;
1094 int i;
1095 struct fb_var_screeninfo fvs;
1096 u32 line_length = info->var.xres * (info->var.bits_per_pixel / 8);
1097
1098
1099 fvs = info->var;
1100 fvs.activate = 0;
1101 fvs.vmode &= ~FB_VMODE_SMOOTH_XPAN;
1102
1103 if (!memcmp(&dlfb->current_mode, &fvs, sizeof(struct fb_var_screeninfo)))
1104 return 0;
1105
1106 result = dlfb_realloc_framebuffer(dlfb, info, info->var.yres * line_length);
1107 if (result)
1108 return result;
1109
1110 result = dlfb_set_video_mode(dlfb, &info->var);
1111
1112 if (result)
1113 return result;
1114
1115 dlfb->current_mode = fvs;
1116 info->fix.line_length = line_length;
1117
1118 if (dlfb->fb_count == 0) {
1119
1120
1121
1122 pix_framebuffer = (u16 *) info->screen_base;
1123 for (i = 0; i < info->fix.smem_len / 2; i++)
1124 pix_framebuffer[i] = 0x37e6;
1125 }
1126
1127 dlfb_handle_damage(dlfb, 0, 0, info->var.xres, info->var.yres);
1128
1129 return 0;
1130 }
1131
1132
1133 static char *dlfb_dummy_render(char *buf)
1134 {
1135 *buf++ = 0xAF;
1136 *buf++ = 0x6A;
1137 *buf++ = 0x00;
1138 *buf++ = 0x00;
1139 *buf++ = 0x00;
1140 *buf++ = 0x01;
1141 *buf++ = 0x00;
1142 *buf++ = 0x00;
1143 *buf++ = 0x00;
1144 return buf;
1145 }
1146
1147
1148
1149
1150 static int dlfb_ops_blank(int blank_mode, struct fb_info *info)
1151 {
1152 struct dlfb_data *dlfb = info->par;
1153 char *bufptr;
1154 struct urb *urb;
1155
1156 dev_dbg(info->dev, "blank, mode %d --> %d\n",
1157 dlfb->blank_mode, blank_mode);
1158
1159 if ((dlfb->blank_mode == FB_BLANK_POWERDOWN) &&
1160 (blank_mode != FB_BLANK_POWERDOWN)) {
1161
1162
1163 dlfb_set_video_mode(dlfb, &info->var);
1164 }
1165
1166 urb = dlfb_get_urb(dlfb);
1167 if (!urb)
1168 return 0;
1169
1170 bufptr = (char *) urb->transfer_buffer;
1171 bufptr = dlfb_vidreg_lock(bufptr);
1172 bufptr = dlfb_blanking(bufptr, blank_mode);
1173 bufptr = dlfb_vidreg_unlock(bufptr);
1174
1175
1176 bufptr = dlfb_dummy_render(bufptr);
1177
1178 dlfb_submit_urb(dlfb, urb, bufptr -
1179 (char *) urb->transfer_buffer);
1180
1181 dlfb->blank_mode = blank_mode;
1182
1183 return 0;
1184 }
1185
1186 static const struct fb_ops dlfb_ops = {
1187 .owner = THIS_MODULE,
1188 .fb_read = fb_sys_read,
1189 .fb_write = dlfb_ops_write,
1190 .fb_setcolreg = dlfb_ops_setcolreg,
1191 .fb_fillrect = dlfb_ops_fillrect,
1192 .fb_copyarea = dlfb_ops_copyarea,
1193 .fb_imageblit = dlfb_ops_imageblit,
1194 .fb_mmap = dlfb_ops_mmap,
1195 .fb_ioctl = dlfb_ops_ioctl,
1196 .fb_open = dlfb_ops_open,
1197 .fb_release = dlfb_ops_release,
1198 .fb_blank = dlfb_ops_blank,
1199 .fb_check_var = dlfb_ops_check_var,
1200 .fb_set_par = dlfb_ops_set_par,
1201 .fb_destroy = dlfb_ops_destroy,
1202 };
1203
1204
1205 static void dlfb_deferred_vfree(struct dlfb_data *dlfb, void *mem)
1206 {
1207 struct dlfb_deferred_free *d = kmalloc(sizeof(struct dlfb_deferred_free), GFP_KERNEL);
1208 if (!d)
1209 return;
1210 d->mem = mem;
1211 list_add(&d->list, &dlfb->deferred_free);
1212 }
1213
1214
1215
1216
1217
1218 static int dlfb_realloc_framebuffer(struct dlfb_data *dlfb, struct fb_info *info, u32 new_len)
1219 {
1220 u32 old_len = info->fix.smem_len;
1221 const void *old_fb = (const void __force *)info->screen_base;
1222 unsigned char *new_fb;
1223 unsigned char *new_back = NULL;
1224
1225 new_len = PAGE_ALIGN(new_len);
1226
1227 if (new_len > old_len) {
1228
1229
1230
1231 new_fb = vmalloc(new_len);
1232 if (!new_fb) {
1233 dev_err(info->dev, "Virtual framebuffer alloc failed\n");
1234 return -ENOMEM;
1235 }
1236 memset(new_fb, 0xff, new_len);
1237
1238 if (info->screen_base) {
1239 memcpy(new_fb, old_fb, old_len);
1240 dlfb_deferred_vfree(dlfb, (void __force *)info->screen_base);
1241 }
1242
1243 info->screen_base = (char __iomem *)new_fb;
1244 info->fix.smem_len = new_len;
1245 info->fix.smem_start = (unsigned long) new_fb;
1246 info->flags = udlfb_info_flags;
1247
1248
1249
1250
1251
1252
1253
1254 if (shadow)
1255 new_back = vzalloc(new_len);
1256 if (!new_back)
1257 dev_info(info->dev,
1258 "No shadow/backing buffer allocated\n");
1259 else {
1260 dlfb_deferred_vfree(dlfb, dlfb->backing_buffer);
1261 dlfb->backing_buffer = new_back;
1262 }
1263 }
1264 return 0;
1265 }
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281 static int dlfb_setup_modes(struct dlfb_data *dlfb,
1282 struct fb_info *info,
1283 char *default_edid, size_t default_edid_size)
1284 {
1285 char *edid;
1286 int i, result = 0, tries = 3;
1287 struct device *dev = info->device;
1288 struct fb_videomode *mode;
1289 const struct fb_videomode *default_vmode = NULL;
1290
1291 if (info->dev) {
1292
1293 mutex_lock(&info->lock);
1294
1295 dev = info->dev;
1296 }
1297
1298 edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
1299 if (!edid) {
1300 result = -ENOMEM;
1301 goto error;
1302 }
1303
1304 fb_destroy_modelist(&info->modelist);
1305 memset(&info->monspecs, 0, sizeof(info->monspecs));
1306
1307
1308
1309
1310
1311
1312 while (tries--) {
1313
1314 i = dlfb_get_edid(dlfb, edid, EDID_LENGTH);
1315
1316 if (i >= EDID_LENGTH)
1317 fb_edid_to_monspecs(edid, &info->monspecs);
1318
1319 if (info->monspecs.modedb_len > 0) {
1320 dlfb->edid = edid;
1321 dlfb->edid_size = i;
1322 break;
1323 }
1324 }
1325
1326
1327 if (info->monspecs.modedb_len == 0) {
1328 dev_err(dev, "Unable to get valid EDID from device/display\n");
1329
1330 if (dlfb->edid) {
1331 fb_edid_to_monspecs(dlfb->edid, &info->monspecs);
1332 if (info->monspecs.modedb_len > 0)
1333 dev_err(dev, "Using previously queried EDID\n");
1334 }
1335 }
1336
1337
1338 if (info->monspecs.modedb_len == 0) {
1339 if (default_edid_size >= EDID_LENGTH) {
1340 fb_edid_to_monspecs(default_edid, &info->monspecs);
1341 if (info->monspecs.modedb_len > 0) {
1342 memcpy(edid, default_edid, default_edid_size);
1343 dlfb->edid = edid;
1344 dlfb->edid_size = default_edid_size;
1345 dev_err(dev, "Using default/backup EDID\n");
1346 }
1347 }
1348 }
1349
1350
1351 if (info->monspecs.modedb_len > 0) {
1352
1353 for (i = 0; i < info->monspecs.modedb_len; i++) {
1354 mode = &info->monspecs.modedb[i];
1355 if (dlfb_is_valid_mode(mode, dlfb)) {
1356 fb_add_videomode(mode, &info->modelist);
1357 } else {
1358 dev_dbg(dev, "Specified mode %dx%d too big\n",
1359 mode->xres, mode->yres);
1360 if (i == 0)
1361
1362 info->monspecs.misc
1363 &= ~FB_MISC_1ST_DETAIL;
1364 }
1365 }
1366
1367 default_vmode = fb_find_best_display(&info->monspecs,
1368 &info->modelist);
1369 }
1370
1371
1372 if (default_vmode == NULL) {
1373
1374 struct fb_videomode fb_vmode = {0};
1375
1376
1377
1378
1379
1380
1381
1382 for (i = 0; i < VESA_MODEDB_SIZE; i++) {
1383 mode = (struct fb_videomode *)&vesa_modes[i];
1384 if (dlfb_is_valid_mode(mode, dlfb))
1385 fb_add_videomode(mode, &info->modelist);
1386 else
1387 dev_dbg(dev, "VESA mode %dx%d too big\n",
1388 mode->xres, mode->yres);
1389 }
1390
1391
1392
1393
1394
1395 fb_vmode.xres = 800;
1396 fb_vmode.yres = 600;
1397 fb_vmode.refresh = 60;
1398 default_vmode = fb_find_nearest_mode(&fb_vmode,
1399 &info->modelist);
1400 }
1401
1402
1403 if ((default_vmode != NULL) && (dlfb->fb_count == 0)) {
1404
1405 fb_videomode_to_var(&info->var, default_vmode);
1406 dlfb_var_color_format(&info->var);
1407
1408
1409
1410
1411 memcpy(&info->fix, &dlfb_fix, sizeof(dlfb_fix));
1412 } else
1413 result = -EINVAL;
1414
1415 error:
1416 if (edid && (dlfb->edid != edid))
1417 kfree(edid);
1418
1419 if (info->dev)
1420 mutex_unlock(&info->lock);
1421
1422 return result;
1423 }
1424
1425 static ssize_t metrics_bytes_rendered_show(struct device *fbdev,
1426 struct device_attribute *a, char *buf) {
1427 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1428 struct dlfb_data *dlfb = fb_info->par;
1429 return snprintf(buf, PAGE_SIZE, "%u\n",
1430 atomic_read(&dlfb->bytes_rendered));
1431 }
1432
1433 static ssize_t metrics_bytes_identical_show(struct device *fbdev,
1434 struct device_attribute *a, char *buf) {
1435 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1436 struct dlfb_data *dlfb = fb_info->par;
1437 return snprintf(buf, PAGE_SIZE, "%u\n",
1438 atomic_read(&dlfb->bytes_identical));
1439 }
1440
1441 static ssize_t metrics_bytes_sent_show(struct device *fbdev,
1442 struct device_attribute *a, char *buf) {
1443 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1444 struct dlfb_data *dlfb = fb_info->par;
1445 return snprintf(buf, PAGE_SIZE, "%u\n",
1446 atomic_read(&dlfb->bytes_sent));
1447 }
1448
1449 static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev,
1450 struct device_attribute *a, char *buf) {
1451 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1452 struct dlfb_data *dlfb = fb_info->par;
1453 return snprintf(buf, PAGE_SIZE, "%u\n",
1454 atomic_read(&dlfb->cpu_kcycles_used));
1455 }
1456
1457 static ssize_t edid_show(
1458 struct file *filp,
1459 struct kobject *kobj, struct bin_attribute *a,
1460 char *buf, loff_t off, size_t count) {
1461 struct device *fbdev = container_of(kobj, struct device, kobj);
1462 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1463 struct dlfb_data *dlfb = fb_info->par;
1464
1465 if (dlfb->edid == NULL)
1466 return 0;
1467
1468 if ((off >= dlfb->edid_size) || (count > dlfb->edid_size))
1469 return 0;
1470
1471 if (off + count > dlfb->edid_size)
1472 count = dlfb->edid_size - off;
1473
1474 memcpy(buf, dlfb->edid, count);
1475
1476 return count;
1477 }
1478
1479 static ssize_t edid_store(
1480 struct file *filp,
1481 struct kobject *kobj, struct bin_attribute *a,
1482 char *src, loff_t src_off, size_t src_size) {
1483 struct device *fbdev = container_of(kobj, struct device, kobj);
1484 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1485 struct dlfb_data *dlfb = fb_info->par;
1486 int ret;
1487
1488
1489 if ((src_size != EDID_LENGTH) || (src_off != 0))
1490 return -EINVAL;
1491
1492 ret = dlfb_setup_modes(dlfb, fb_info, src, src_size);
1493 if (ret)
1494 return ret;
1495
1496 if (!dlfb->edid || memcmp(src, dlfb->edid, src_size))
1497 return -EINVAL;
1498
1499 ret = dlfb_ops_set_par(fb_info);
1500 if (ret)
1501 return ret;
1502
1503 return src_size;
1504 }
1505
1506 static ssize_t metrics_reset_store(struct device *fbdev,
1507 struct device_attribute *attr,
1508 const char *buf, size_t count)
1509 {
1510 struct fb_info *fb_info = dev_get_drvdata(fbdev);
1511 struct dlfb_data *dlfb = fb_info->par;
1512
1513 atomic_set(&dlfb->bytes_rendered, 0);
1514 atomic_set(&dlfb->bytes_identical, 0);
1515 atomic_set(&dlfb->bytes_sent, 0);
1516 atomic_set(&dlfb->cpu_kcycles_used, 0);
1517
1518 return count;
1519 }
1520
1521 static const struct bin_attribute edid_attr = {
1522 .attr.name = "edid",
1523 .attr.mode = 0666,
1524 .size = EDID_LENGTH,
1525 .read = edid_show,
1526 .write = edid_store
1527 };
1528
1529 static const struct device_attribute fb_device_attrs[] = {
1530 __ATTR_RO(metrics_bytes_rendered),
1531 __ATTR_RO(metrics_bytes_identical),
1532 __ATTR_RO(metrics_bytes_sent),
1533 __ATTR_RO(metrics_cpu_kcycles_used),
1534 __ATTR(metrics_reset, S_IWUSR, NULL, metrics_reset_store),
1535 };
1536
1537
1538
1539
1540 static int dlfb_select_std_channel(struct dlfb_data *dlfb)
1541 {
1542 int ret;
1543 void *buf;
1544 static const u8 set_def_chn[] = {
1545 0x57, 0xCD, 0xDC, 0xA7,
1546 0x1C, 0x88, 0x5E, 0x15,
1547 0x60, 0xFE, 0xC6, 0x97,
1548 0x16, 0x3D, 0x47, 0xF2 };
1549
1550 buf = kmemdup(set_def_chn, sizeof(set_def_chn), GFP_KERNEL);
1551
1552 if (!buf)
1553 return -ENOMEM;
1554
1555 ret = usb_control_msg(dlfb->udev, usb_sndctrlpipe(dlfb->udev, 0),
1556 NR_USB_REQUEST_CHANNEL,
1557 (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
1558 buf, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT);
1559
1560 kfree(buf);
1561
1562 return ret;
1563 }
1564
1565 static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb,
1566 struct usb_interface *intf)
1567 {
1568 char *desc;
1569 char *buf;
1570 char *desc_end;
1571 int total_len;
1572
1573 buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
1574 if (!buf)
1575 return false;
1576 desc = buf;
1577
1578 total_len = usb_get_descriptor(interface_to_usbdev(intf),
1579 0x5f,
1580 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE);
1581
1582
1583 if (total_len < 0) {
1584 if (0 == usb_get_extra_descriptor(intf->cur_altsetting,
1585 0x5f, &desc))
1586 total_len = (int) desc[0];
1587 }
1588
1589 if (total_len > 5) {
1590 dev_info(&intf->dev,
1591 "vendor descriptor length: %d data: %11ph\n",
1592 total_len, desc);
1593
1594 if ((desc[0] != total_len) ||
1595 (desc[1] != 0x5f) ||
1596 (desc[2] != 0x01) ||
1597 (desc[3] != 0x00) ||
1598 (desc[4] != total_len - 2))
1599 goto unrecognized;
1600
1601 desc_end = desc + total_len;
1602 desc += 5;
1603
1604 while (desc < desc_end) {
1605 u8 length;
1606 u16 key;
1607
1608 key = *desc++;
1609 key |= (u16)*desc++ << 8;
1610 length = *desc++;
1611
1612 switch (key) {
1613 case 0x0200: {
1614 u32 max_area = *desc++;
1615 max_area |= (u32)*desc++ << 8;
1616 max_area |= (u32)*desc++ << 16;
1617 max_area |= (u32)*desc++ << 24;
1618 dev_warn(&intf->dev,
1619 "DL chip limited to %d pixel modes\n",
1620 max_area);
1621 dlfb->sku_pixel_limit = max_area;
1622 break;
1623 }
1624 default:
1625 break;
1626 }
1627 desc += length;
1628 }
1629 } else {
1630 dev_info(&intf->dev, "vendor descriptor not available (%d)\n",
1631 total_len);
1632 }
1633
1634 goto success;
1635
1636 unrecognized:
1637
1638 dev_err(&intf->dev, "Unrecognized vendor firmware descriptor\n");
1639
1640 success:
1641 kfree(buf);
1642 return true;
1643 }
1644
1645 static int dlfb_usb_probe(struct usb_interface *intf,
1646 const struct usb_device_id *id)
1647 {
1648 int i;
1649 const struct device_attribute *attr;
1650 struct dlfb_data *dlfb;
1651 struct fb_info *info;
1652 int retval = -ENOMEM;
1653 struct usb_device *usbdev = interface_to_usbdev(intf);
1654
1655
1656 dlfb = kzalloc(sizeof(*dlfb), GFP_KERNEL);
1657 if (!dlfb) {
1658 dev_err(&intf->dev, "%s: failed to allocate dlfb\n", __func__);
1659 return -ENOMEM;
1660 }
1661
1662 INIT_LIST_HEAD(&dlfb->deferred_free);
1663
1664 dlfb->udev = usb_get_dev(usbdev);
1665 usb_set_intfdata(intf, dlfb);
1666
1667 dev_dbg(&intf->dev, "console enable=%d\n", console);
1668 dev_dbg(&intf->dev, "fb_defio enable=%d\n", fb_defio);
1669 dev_dbg(&intf->dev, "shadow enable=%d\n", shadow);
1670
1671 dlfb->sku_pixel_limit = 2048 * 1152;
1672
1673 if (!dlfb_parse_vendor_descriptor(dlfb, intf)) {
1674 dev_err(&intf->dev,
1675 "firmware not recognized, incompatible device?\n");
1676 goto error;
1677 }
1678
1679 if (pixel_limit) {
1680 dev_warn(&intf->dev,
1681 "DL chip limit of %d overridden to %d\n",
1682 dlfb->sku_pixel_limit, pixel_limit);
1683 dlfb->sku_pixel_limit = pixel_limit;
1684 }
1685
1686
1687
1688 info = framebuffer_alloc(0, &dlfb->udev->dev);
1689 if (!info)
1690 goto error;
1691
1692 dlfb->info = info;
1693 info->par = dlfb;
1694 info->pseudo_palette = dlfb->pseudo_palette;
1695 dlfb->ops = dlfb_ops;
1696 info->fbops = &dlfb->ops;
1697
1698 mutex_init(&dlfb->render_mutex);
1699 dlfb_init_damage(dlfb);
1700 spin_lock_init(&dlfb->damage_lock);
1701 INIT_WORK(&dlfb->damage_work, dlfb_damage_work);
1702
1703 INIT_LIST_HEAD(&info->modelist);
1704
1705 if (!dlfb_alloc_urb_list(dlfb, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
1706 retval = -ENOMEM;
1707 dev_err(&intf->dev, "unable to allocate urb list\n");
1708 goto error;
1709 }
1710
1711
1712
1713 retval = fb_alloc_cmap(&info->cmap, 256, 0);
1714 if (retval < 0) {
1715 dev_err(info->device, "cmap allocation failed: %d\n", retval);
1716 goto error;
1717 }
1718
1719 retval = dlfb_setup_modes(dlfb, info, NULL, 0);
1720 if (retval != 0) {
1721 dev_err(info->device,
1722 "unable to find common mode for display and adapter\n");
1723 goto error;
1724 }
1725
1726
1727
1728 atomic_set(&dlfb->usb_active, 1);
1729 dlfb_select_std_channel(dlfb);
1730
1731 dlfb_ops_check_var(&info->var, info);
1732 retval = dlfb_ops_set_par(info);
1733 if (retval)
1734 goto error;
1735
1736 retval = register_framebuffer(info);
1737 if (retval < 0) {
1738 dev_err(info->device, "unable to register framebuffer: %d\n",
1739 retval);
1740 goto error;
1741 }
1742
1743 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) {
1744 attr = &fb_device_attrs[i];
1745 retval = device_create_file(info->dev, attr);
1746 if (retval)
1747 dev_warn(info->device,
1748 "failed to create '%s' attribute: %d\n",
1749 attr->attr.name, retval);
1750 }
1751
1752 retval = device_create_bin_file(info->dev, &edid_attr);
1753 if (retval)
1754 dev_warn(info->device, "failed to create '%s' attribute: %d\n",
1755 edid_attr.attr.name, retval);
1756
1757 dev_info(info->device,
1758 "%s is DisplayLink USB device (%dx%d, %dK framebuffer memory)\n",
1759 dev_name(info->dev), info->var.xres, info->var.yres,
1760 ((dlfb->backing_buffer) ?
1761 info->fix.smem_len * 2 : info->fix.smem_len) >> 10);
1762 return 0;
1763
1764 error:
1765 if (dlfb->info) {
1766 dlfb_ops_destroy(dlfb->info);
1767 } else {
1768 usb_put_dev(dlfb->udev);
1769 kfree(dlfb);
1770 }
1771 return retval;
1772 }
1773
1774 static void dlfb_usb_disconnect(struct usb_interface *intf)
1775 {
1776 struct dlfb_data *dlfb;
1777 struct fb_info *info;
1778 int i;
1779
1780 dlfb = usb_get_intfdata(intf);
1781 info = dlfb->info;
1782
1783 dev_dbg(&intf->dev, "USB disconnect starting\n");
1784
1785
1786 dlfb->virtualized = true;
1787
1788
1789 atomic_set(&dlfb->usb_active, 0);
1790
1791
1792 dlfb_free_urb_list(dlfb);
1793
1794
1795 for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
1796 device_remove_file(info->dev, &fb_device_attrs[i]);
1797 device_remove_bin_file(info->dev, &edid_attr);
1798
1799 unregister_framebuffer(info);
1800 }
1801
1802 static struct usb_driver dlfb_driver = {
1803 .name = "udlfb",
1804 .probe = dlfb_usb_probe,
1805 .disconnect = dlfb_usb_disconnect,
1806 .id_table = id_table,
1807 };
1808
1809 module_usb_driver(dlfb_driver);
1810
1811 static void dlfb_urb_completion(struct urb *urb)
1812 {
1813 struct urb_node *unode = urb->context;
1814 struct dlfb_data *dlfb = unode->dlfb;
1815 unsigned long flags;
1816
1817 switch (urb->status) {
1818 case 0:
1819
1820 break;
1821 case -ECONNRESET:
1822 case -ENOENT:
1823 case -ESHUTDOWN:
1824
1825 break;
1826 default:
1827 dev_err(&dlfb->udev->dev,
1828 "%s - nonzero write bulk status received: %d\n",
1829 __func__, urb->status);
1830 atomic_set(&dlfb->lost_pixels, 1);
1831 break;
1832 }
1833
1834 urb->transfer_buffer_length = dlfb->urbs.size;
1835
1836 spin_lock_irqsave(&dlfb->urbs.lock, flags);
1837 list_add_tail(&unode->entry, &dlfb->urbs.list);
1838 dlfb->urbs.available++;
1839 spin_unlock_irqrestore(&dlfb->urbs.lock, flags);
1840
1841 up(&dlfb->urbs.limit_sem);
1842 }
1843
1844 static void dlfb_free_urb_list(struct dlfb_data *dlfb)
1845 {
1846 int count = dlfb->urbs.count;
1847 struct list_head *node;
1848 struct urb_node *unode;
1849 struct urb *urb;
1850
1851
1852 while (count--) {
1853 down(&dlfb->urbs.limit_sem);
1854
1855 spin_lock_irq(&dlfb->urbs.lock);
1856
1857 node = dlfb->urbs.list.next;
1858 list_del_init(node);
1859
1860 spin_unlock_irq(&dlfb->urbs.lock);
1861
1862 unode = list_entry(node, struct urb_node, entry);
1863 urb = unode->urb;
1864
1865
1866 usb_free_coherent(urb->dev, dlfb->urbs.size,
1867 urb->transfer_buffer, urb->transfer_dma);
1868 usb_free_urb(urb);
1869 kfree(node);
1870 }
1871
1872 dlfb->urbs.count = 0;
1873 }
1874
1875 static int dlfb_alloc_urb_list(struct dlfb_data *dlfb, int count, size_t size)
1876 {
1877 struct urb *urb;
1878 struct urb_node *unode;
1879 char *buf;
1880 size_t wanted_size = count * size;
1881
1882 spin_lock_init(&dlfb->urbs.lock);
1883
1884 retry:
1885 dlfb->urbs.size = size;
1886 INIT_LIST_HEAD(&dlfb->urbs.list);
1887
1888 sema_init(&dlfb->urbs.limit_sem, 0);
1889 dlfb->urbs.count = 0;
1890 dlfb->urbs.available = 0;
1891
1892 while (dlfb->urbs.count * size < wanted_size) {
1893 unode = kzalloc(sizeof(*unode), GFP_KERNEL);
1894 if (!unode)
1895 break;
1896 unode->dlfb = dlfb;
1897
1898 urb = usb_alloc_urb(0, GFP_KERNEL);
1899 if (!urb) {
1900 kfree(unode);
1901 break;
1902 }
1903 unode->urb = urb;
1904
1905 buf = usb_alloc_coherent(dlfb->udev, size, GFP_KERNEL,
1906 &urb->transfer_dma);
1907 if (!buf) {
1908 kfree(unode);
1909 usb_free_urb(urb);
1910 if (size > PAGE_SIZE) {
1911 size /= 2;
1912 dlfb_free_urb_list(dlfb);
1913 goto retry;
1914 }
1915 break;
1916 }
1917
1918
1919 usb_fill_bulk_urb(urb, dlfb->udev, usb_sndbulkpipe(dlfb->udev, 1),
1920 buf, size, dlfb_urb_completion, unode);
1921 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1922
1923 list_add_tail(&unode->entry, &dlfb->urbs.list);
1924
1925 up(&dlfb->urbs.limit_sem);
1926 dlfb->urbs.count++;
1927 dlfb->urbs.available++;
1928 }
1929
1930 return dlfb->urbs.count;
1931 }
1932
1933 static struct urb *dlfb_get_urb(struct dlfb_data *dlfb)
1934 {
1935 int ret;
1936 struct list_head *entry;
1937 struct urb_node *unode;
1938
1939
1940 ret = down_timeout(&dlfb->urbs.limit_sem, GET_URB_TIMEOUT);
1941 if (ret) {
1942 atomic_set(&dlfb->lost_pixels, 1);
1943 dev_warn(&dlfb->udev->dev,
1944 "wait for urb interrupted: %d available: %d\n",
1945 ret, dlfb->urbs.available);
1946 return NULL;
1947 }
1948
1949 spin_lock_irq(&dlfb->urbs.lock);
1950
1951 BUG_ON(list_empty(&dlfb->urbs.list));
1952 entry = dlfb->urbs.list.next;
1953 list_del_init(entry);
1954 dlfb->urbs.available--;
1955
1956 spin_unlock_irq(&dlfb->urbs.lock);
1957
1958 unode = list_entry(entry, struct urb_node, entry);
1959 return unode->urb;
1960 }
1961
1962 static int dlfb_submit_urb(struct dlfb_data *dlfb, struct urb *urb, size_t len)
1963 {
1964 int ret;
1965
1966 BUG_ON(len > dlfb->urbs.size);
1967
1968 urb->transfer_buffer_length = len;
1969 ret = usb_submit_urb(urb, GFP_KERNEL);
1970 if (ret) {
1971 dlfb_urb_completion(urb);
1972 atomic_set(&dlfb->lost_pixels, 1);
1973 dev_err(&dlfb->udev->dev, "submit urb error: %d\n", ret);
1974 }
1975 return ret;
1976 }
1977
1978 module_param(console, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1979 MODULE_PARM_DESC(console, "Allow fbcon to open framebuffer");
1980
1981 module_param(fb_defio, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1982 MODULE_PARM_DESC(fb_defio, "Page fault detection of mmap writes");
1983
1984 module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1985 MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");
1986
1987 module_param(pixel_limit, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1988 MODULE_PARM_DESC(pixel_limit, "Force limit on max mode (in x*y pixels)");
1989
1990 MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>, "
1991 "Jaya Kumar <jayakumar.lkml@gmail.com>, "
1992 "Bernie Thompson <bernie@plugable.com>");
1993 MODULE_DESCRIPTION("DisplayLink kernel framebuffer driver");
1994 MODULE_LICENSE("GPL");
1995