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