udlfb.c 51.3 KB
Newer Older
1 2 3 4 5
/*
 * udlfb.c -- Framebuffer driver for DisplayLink USB controller
 *
 * Copyright (C) 2009 Roberto De Ioris <roberto@unbit.it>
 * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com>
6
 * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
7 8 9 10 11 12 13 14 15 16 17
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License v2. See the file COPYING in the main directory of this archive for
 * more details.
 *
 * Layout is based on skeletonfb by James Simmons and Geert Uytterhoeven,
 * usb-skeleton by GregKH.
 *
 * Device-specific portions based on information from Displaylink, with work
 * from Florian Echtler, Henrik Bjerregaard Pedersen, and others.
 */
R
Roberto De Ioris 已提交
18

19 20
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

R
Roberto De Ioris 已提交
21 22 23 24 25 26 27
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/uaccess.h>
#include <linux/mm.h>
#include <linux/fb.h>
28
#include <linux/vmalloc.h>
29
#include <linux/slab.h>
30
#include <linux/prefetch.h>
31
#include <linux/delay.h>
P
Paul Mundt 已提交
32
#include <video/udlfb.h>
33
#include "edid.h"
R
Roberto De Ioris 已提交
34

35
static struct fb_fix_screeninfo dlfb_fix = {
36
	.id =           "udlfb",
37 38 39 40 41 42
	.type =         FB_TYPE_PACKED_PIXELS,
	.visual =       FB_VISUAL_TRUECOLOR,
	.xpanstep =     0,
	.ypanstep =     0,
	.ywrapstep =    0,
	.accel =        FB_ACCEL_NONE,
43
};
R
Roberto De Ioris 已提交
44

45 46 47 48 49
static const u32 udlfb_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST |
		FBINFO_VIRTFB |
		FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT |
		FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR;

50
/*
51 52 53 54 55
 * There are many DisplayLink-based graphics products, all with unique PIDs.
 * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
 * We also require a match on SubClass (0x00) and Protocol (0x00),
 * which is compatible with all known USB 2.0 era graphics chips and firmware,
 * but allows DisplayLink to increment those for any future incompatible chips
56 57
 */
static struct usb_device_id id_table[] = {
58 59 60 61 62 63 64 65 66
	{.idVendor = 0x17e9,
	 .bInterfaceClass = 0xff,
	 .bInterfaceSubClass = 0x00,
	 .bInterfaceProtocol = 0x00,
	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
		USB_DEVICE_ID_MATCH_INT_CLASS |
		USB_DEVICE_ID_MATCH_INT_SUBCLASS |
		USB_DEVICE_ID_MATCH_INT_PROTOCOL,
	},
67 68 69
	{},
};
MODULE_DEVICE_TABLE(usb, id_table);
R
Roberto De Ioris 已提交
70

71
/* module options */
72 73 74
static bool console = 1; /* Allow fbcon to open framebuffer */
static bool fb_defio = 1;  /* Detect mmap writes using page faults */
static bool shadow = 1; /* Optionally disable shadow framebuffer */
75
static int pixel_limit; /* Optionally force a pixel resolution limit */
76

77 78 79 80 81 82 83
/* dlfb keeps a list of urbs for efficient bulk transfers */
static void dlfb_urb_completion(struct urb *urb);
static struct urb *dlfb_get_urb(struct dlfb_data *dev);
static int dlfb_submit_urb(struct dlfb_data *dev, struct urb * urb, size_t len);
static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size);
static void dlfb_free_urb_list(struct dlfb_data *dev);

84
/*
85 86
 * All DisplayLink bulk operations start with 0xAF, followed by specific code
 * All operations are written to buffers which then later get sent to device
87
 */
88
static char *dlfb_set_register(char *buf, u8 reg, u8 val)
R
Roberto De Ioris 已提交
89
{
90 91 92 93 94
	*buf++ = 0xAF;
	*buf++ = 0x20;
	*buf++ = reg;
	*buf++ = val;
	return buf;
95
}
R
Roberto De Ioris 已提交
96

97
static char *dlfb_vidreg_lock(char *buf)
98
{
99
	return dlfb_set_register(buf, 0xFF, 0x00);
100
}
R
Roberto De Ioris 已提交
101

102
static char *dlfb_vidreg_unlock(char *buf)
103
{
104
	return dlfb_set_register(buf, 0xFF, 0xFF);
105 106 107
}

/*
108 109 110 111 112 113 114 115
 * Map FB_BLANK_* to DisplayLink register
 * DLReg FB_BLANK_*
 * ----- -----------------------------
 *  0x00 FB_BLANK_UNBLANK (0)
 *  0x01 FB_BLANK (1)
 *  0x03 FB_BLANK_VSYNC_SUSPEND (2)
 *  0x05 FB_BLANK_HSYNC_SUSPEND (3)
 *  0x07 FB_BLANK_POWERDOWN (4) Note: requires modeset to come back
116
 */
117
static char *dlfb_blanking(char *buf, int fb_blank)
118
{
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
	u8 reg;

	switch (fb_blank) {
	case FB_BLANK_POWERDOWN:
		reg = 0x07;
		break;
	case FB_BLANK_HSYNC_SUSPEND:
		reg = 0x05;
		break;
	case FB_BLANK_VSYNC_SUSPEND:
		reg = 0x03;
		break;
	case FB_BLANK_NORMAL:
		reg = 0x01;
		break;
	default:
		reg = 0x00;
	}

	buf = dlfb_set_register(buf, 0x1F, reg);

	return buf;
141 142
}

143
static char *dlfb_set_color_depth(char *buf, u8 selection)
144
{
145
	return dlfb_set_register(buf, 0x00, selection);
146 147
}

148
static char *dlfb_set_base16bpp(char *wrptr, u32 base)
149
{
150
	/* the base pointer is 16 bits wide, 0x20 is hi byte. */
151 152 153
	wrptr = dlfb_set_register(wrptr, 0x20, base >> 16);
	wrptr = dlfb_set_register(wrptr, 0x21, base >> 8);
	return dlfb_set_register(wrptr, 0x22, base);
154 155
}

156 157 158 159
/*
 * DisplayLink HW has separate 16bpp and 8bpp framebuffers.
 * In 24bpp modes, the low 323 RGB bits go in the 8bpp framebuffer
 */
160
static char *dlfb_set_base8bpp(char *wrptr, u32 base)
161
{
162 163 164
	wrptr = dlfb_set_register(wrptr, 0x26, base >> 16);
	wrptr = dlfb_set_register(wrptr, 0x27, base >> 8);
	return dlfb_set_register(wrptr, 0x28, base);
165 166
}

167
static char *dlfb_set_register_16(char *wrptr, u8 reg, u16 value)
168
{
169 170
	wrptr = dlfb_set_register(wrptr, reg, value >> 8);
	return dlfb_set_register(wrptr, reg+1, value);
171 172 173 174 175 176
}

/*
 * This is kind of weird because the controller takes some
 * register values in a different byte order than other registers.
 */
177
static char *dlfb_set_register_16be(char *wrptr, u8 reg, u16 value)
178
{
179 180
	wrptr = dlfb_set_register(wrptr, reg, value);
	return dlfb_set_register(wrptr, reg+1, value >> 8);
181 182 183 184 185 186 187 188 189 190 191
}

/*
 * LFSR is linear feedback shift register. The reason we have this is
 * because the display controller needs to minimize the clock depth of
 * various counters used in the display path. So this code reverses the
 * provided value into the lfsr16 value by counting backwards to get
 * the value that needs to be set in the hardware comparator to get the
 * same actual count. This makes sense once you read above a couple of
 * times and think about it from a hardware perspective.
 */
192
static u16 dlfb_lfsr16(u16 actual_count)
193 194 195 196 197 198 199
{
	u32 lv = 0xFFFF; /* This is the lfsr value that the hw starts with */

	while (actual_count--) {
		lv =	 ((lv << 1) |
			(((lv >> 15) ^ (lv >> 4) ^ (lv >> 2) ^ (lv >> 1)) & 1))
			& 0xFFFF;
R
Roberto De Ioris 已提交
200 201
	}

202 203 204 205 206 207 208
	return (u16) lv;
}

/*
 * This does LFSR conversion on the value that is to be written.
 * See LFSR explanation above for more detail.
 */
209
static char *dlfb_set_register_lfsr16(char *wrptr, u8 reg, u16 value)
210
{
211
	return dlfb_set_register_16(wrptr, reg, dlfb_lfsr16(value));
R
Roberto De Ioris 已提交
212 213
}

214 215 216 217
/*
 * This takes a standard fbdev screeninfo struct and all of its monitor mode
 * details and converts them into the DisplayLink equivalent register commands.
 */
218
static char *dlfb_set_vid_cmds(char *wrptr, struct fb_var_screeninfo *var)
R
Roberto De Ioris 已提交
219
{
220 221 222 223 224 225
	u16 xds, yds;
	u16 xde, yde;
	u16 yec;

	/* x display start */
	xds = var->left_margin + var->hsync_len;
226
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x01, xds);
227 228
	/* x display end */
	xde = xds + var->xres;
229
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x03, xde);
230 231 232

	/* y display start */
	yds = var->upper_margin + var->vsync_len;
233
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x05, yds);
234 235
	/* y display end */
	yde = yds + var->yres;
236
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x07, yde);
237 238

	/* x end count is active + blanking - 1 */
239 240
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x09,
			xde + var->right_margin - 1);
241 242

	/* libdlo hardcodes hsync start to 1 */
243
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x0B, 1);
244 245

	/* hsync end is width of sync pulse + 1 */
246
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x0D, var->hsync_len + 1);
247 248

	/* hpixels is active pixels */
249
	wrptr = dlfb_set_register_16(wrptr, 0x0F, var->xres);
R
Roberto De Ioris 已提交
250

251 252 253
	/* yendcount is vertical active + vertical blanking */
	yec = var->yres + var->upper_margin + var->lower_margin +
			var->vsync_len;
254
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x11, yec);
R
Roberto De Ioris 已提交
255

256
	/* libdlo hardcodes vsync start to 0 */
257
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x13, 0);
258 259

	/* vsync end is width of vsync pulse */
260
	wrptr = dlfb_set_register_lfsr16(wrptr, 0x15, var->vsync_len);
261 262

	/* vpixels is active pixels */
263
	wrptr = dlfb_set_register_16(wrptr, 0x17, var->yres);
264 265

	/* convert picoseconds to 5kHz multiple for pclk5k = x * 1E12/5k */
266 267
	wrptr = dlfb_set_register_16be(wrptr, 0x1B,
			200*1000*1000/var->pixclock);
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283

	return wrptr;
}

/*
 * This takes a standard fbdev screeninfo struct that was fetched or prepared
 * and then generates the appropriate command sequence that then drives the
 * display controller.
 */
static int dlfb_set_video_mode(struct dlfb_data *dev,
				struct fb_var_screeninfo *var)
{
	char *buf;
	char *wrptr;
	int retval = 0;
	int writesize;
284 285 286 287
	struct urb *urb;

	if (!atomic_read(&dev->usb_active))
		return -EPERM;
288

289 290 291
	urb = dlfb_get_urb(dev);
	if (!urb)
		return -ENOMEM;
292

293
	buf = (char *) urb->transfer_buffer;
294 295 296 297 298 299

	/*
	* This first section has to do with setting the base address on the
	* controller * associated with the display. There are 2 base
	* pointers, currently, we only * use the 16 bpp segment.
	*/
300 301
	wrptr = dlfb_vidreg_lock(buf);
	wrptr = dlfb_set_color_depth(wrptr, 0x00);
302
	/* set base for 16bpp segment to 0 */
303
	wrptr = dlfb_set_base16bpp(wrptr, 0);
304
	/* set base for 8bpp segment to end of fb */
305
	wrptr = dlfb_set_base8bpp(wrptr, dev->info->fix.smem_len);
306

307
	wrptr = dlfb_set_vid_cmds(wrptr, var);
308
	wrptr = dlfb_blanking(wrptr, FB_BLANK_UNBLANK);
309
	wrptr = dlfb_vidreg_unlock(wrptr);
310 311 312

	writesize = wrptr - buf;

313
	retval = dlfb_submit_urb(dev, urb, writesize);
314

315 316
	dev->blank_mode = FB_BLANK_UNBLANK;

317 318 319
	return retval;
}

320
static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma)
R
Roberto De Ioris 已提交
321 322 323 324 325 326
{
	unsigned long start = vma->vm_start;
	unsigned long size = vma->vm_end - vma->vm_start;
	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
	unsigned long page, pos;

327 328 329 330 331
	if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
		return -EINVAL;
	if (size > info->fix.smem_len)
		return -EINVAL;
	if (offset > info->fix.smem_len - size)
R
Roberto De Ioris 已提交
332 333 334 335
		return -EINVAL;

	pos = (unsigned long)info->fix.smem_start + offset;

336
	pr_notice("mmap() framebuffer addr:%lu size:%lu\n",
337 338
		  pos, size);

R
Roberto De Ioris 已提交
339 340
	while (size > 0) {
		page = vmalloc_to_pfn((void *)pos);
341
		if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
R
Roberto De Ioris 已提交
342
			return -EAGAIN;
343

R
Roberto De Ioris 已提交
344 345 346 347 348 349 350 351 352 353 354
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		if (size > PAGE_SIZE)
			size -= PAGE_SIZE;
		else
			size = 0;
	}

	return 0;
}

355 356 357 358 359 360 361 362
/*
 * Trims identical data from front and back of line
 * Sets new front buffer address and width
 * And returns byte count of identical pixels
 * Assumes CPU natural alignment (unsigned long)
 * for back and front buffer ptrs and width
 */
static int dlfb_trim_hline(const u8 *bback, const u8 **bfront, int *width_bytes)
363
{
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
	int j, k;
	const unsigned long *back = (const unsigned long *) bback;
	const unsigned long *front = (const unsigned long *) *bfront;
	const int width = *width_bytes / sizeof(unsigned long);
	int identical = width;
	int start = width;
	int end = width;

	prefetch((void *) front);
	prefetch((void *) back);

	for (j = 0; j < width; j++) {
		if (back[j] != front[j]) {
			start = j;
			break;
		}
	}
381

382 383 384 385 386
	for (k = width - 1; k > j; k--) {
		if (back[k] != front[k]) {
			end = k+1;
			break;
		}
387 388
	}

389 390 391 392 393
	identical = start + (width - end);
	*bfront = (u8 *) &front[start];
	*width_bytes = (end - start) * sizeof(unsigned long);

	return identical * sizeof(unsigned long);
394 395 396
}

/*
P
Pavel Machek 已提交
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
 * Render a command stream for an encoded horizontal line segment of pixels.
 *
 * A command buffer holds several commands.
 * It always begins with a fresh command header
 * (the protocol doesn't require this, but we enforce it to allow
 * multiple buffers to be potentially encoded and sent in parallel).
 * A single command encodes one contiguous horizontal line of pixels
 *
 * The function relies on the client to do all allocation, so that
 * rendering can be done directly to output buffers (e.g. USB URBs).
 * The function fills the supplied command buffer, providing information
 * on where it left off, so the client may call in again with additional
 * buffers if the line will take several buffers to complete.
 *
 * A single command can transmit a maximum of 256 pixels,
 * regardless of the compression ratio (protocol design limit).
 * To the hardware, 0 for a size byte means 256
414
 *
P
Pavel Machek 已提交
415 416 417 418 419
 * Rather than 256 pixel commands which are either rl or raw encoded,
 * the rlx command simply assumes alternating raw and rl spans within one cmd.
 * This has a slightly larger header overhead, but produces more even results.
 * It also processes all data (read and write) in a single pass.
 * Performance benchmarks of common cases show it having just slightly better
420
 * compression than 256 pixel raw or rle commands, with similar CPU consumpion.
P
Pavel Machek 已提交
421 422
 * But for very rl friendly data, will compress not quite as well.
 */
423 424 425 426 427 428
static void dlfb_compress_hline(
	const uint16_t **pixel_start_ptr,
	const uint16_t *const pixel_end,
	uint32_t *device_address_ptr,
	uint8_t **command_buffer_ptr,
	const uint8_t *const cmd_buffer_end)
R
Roberto De Ioris 已提交
429
{
430 431 432 433 434 435 436
	const uint16_t *pixel = *pixel_start_ptr;
	uint32_t dev_addr  = *device_address_ptr;
	uint8_t *cmd = *command_buffer_ptr;
	const int bpp = 2;

	while ((pixel_end > pixel) &&
	       (cmd_buffer_end - MIN_RLX_CMD_BYTES > cmd)) {
437 438 439 440
		uint8_t *raw_pixels_count_byte = NULL;
		uint8_t *cmd_pixels_count_byte = NULL;
		const uint16_t *raw_pixel_start = NULL;
		const uint16_t *cmd_pixel_start, *cmd_pixel_end = NULL;
441 442 443 444 445

		prefetchw((void *) cmd); /* pull in one cache line at least */

		*cmd++ = 0xAF;
		*cmd++ = 0x6B;
446 447 448
		*cmd++ = (uint8_t) ((dev_addr >> 16) & 0xFF);
		*cmd++ = (uint8_t) ((dev_addr >> 8) & 0xFF);
		*cmd++ = (uint8_t) ((dev_addr) & 0xFF);
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477

		cmd_pixels_count_byte = cmd++; /*  we'll know this later */
		cmd_pixel_start = pixel;

		raw_pixels_count_byte = cmd++; /*  we'll know this later */
		raw_pixel_start = pixel;

		cmd_pixel_end = pixel + min(MAX_CMD_PIXELS + 1,
			min((int)(pixel_end - pixel),
			    (int)(cmd_buffer_end - cmd) / bpp));

		prefetch_range((void *) pixel, (cmd_pixel_end - pixel) * bpp);

		while (pixel < cmd_pixel_end) {
			const uint16_t * const repeating_pixel = pixel;

			*(uint16_t *)cmd = cpu_to_be16p(pixel);
			cmd += 2;
			pixel++;

			if (unlikely((pixel < cmd_pixel_end) &&
				     (*pixel == *repeating_pixel))) {
				/* go back and fill in raw pixel count */
				*raw_pixels_count_byte = ((repeating_pixel -
						raw_pixel_start) + 1) & 0xFF;

				while ((pixel < cmd_pixel_end)
				       && (*pixel == *repeating_pixel)) {
					pixel++;
R
Roberto De Ioris 已提交
478
				}
479

480 481
				/* immediately after raw data is repeat byte */
				*cmd++ = ((pixel - repeating_pixel) - 1) & 0xFF;
482

483 484 485
				/* Then start another raw pixel span */
				raw_pixel_start = pixel;
				raw_pixels_count_byte = cmd++;
486
			}
R
Roberto De Ioris 已提交
487 488
		}

489 490 491 492
		if (pixel > raw_pixel_start) {
			/* finalize last RAW span */
			*raw_pixels_count_byte = (pixel-raw_pixel_start) & 0xFF;
		}
R
Roberto De Ioris 已提交
493

494 495
		*cmd_pixels_count_byte = (pixel - cmd_pixel_start) & 0xFF;
		dev_addr += (pixel - cmd_pixel_start) * bpp;
R
Roberto De Ioris 已提交
496 497
	}

498 499 500 501 502
	if (cmd_buffer_end <= MIN_RLX_CMD_BYTES + cmd) {
		/* Fill leftover bytes with no-ops */
		if (cmd_buffer_end > cmd)
			memset(cmd, 0xAF, cmd_buffer_end - cmd);
		cmd = (uint8_t *) cmd_buffer_end;
503
	}
R
Roberto De Ioris 已提交
504

505 506 507
	*command_buffer_ptr = cmd;
	*pixel_start_ptr = pixel;
	*device_address_ptr = dev_addr;
R
Roberto De Ioris 已提交
508

509
	return;
R
Roberto De Ioris 已提交
510 511
}

512 513 514 515 516 517
/*
 * There are 3 copies of every pixel: The front buffer that the fbdev
 * client renders to, the actual framebuffer across the USB bus in hardware
 * (that we can only write to, slowly, and can never read), and (optionally)
 * our shadow copy that tracks what's been sent to that hardware buffer.
 */
518
static int dlfb_render_hline(struct dlfb_data *dev, struct urb **urb_ptr,
519 520 521
			      const char *front, char **urb_buf_ptr,
			      u32 byte_offset, u32 byte_width,
			      int *ident_ptr, int *sent_ptr)
R
Roberto De Ioris 已提交
522
{
523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
	const u8 *line_start, *line_end, *next_pixel;
	u32 dev_addr = dev->base16 + byte_offset;
	struct urb *urb = *urb_ptr;
	u8 *cmd = *urb_buf_ptr;
	u8 *cmd_end = (u8 *) urb->transfer_buffer + urb->transfer_buffer_length;

	line_start = (u8 *) (front + byte_offset);
	next_pixel = line_start;
	line_end = next_pixel + byte_width;

	if (dev->backing_buffer) {
		int offset;
		const u8 *back_start = (u8 *) (dev->backing_buffer
						+ byte_offset);

		*ident_ptr += dlfb_trim_hline(back_start, &next_pixel,
			&byte_width);

		offset = next_pixel - line_start;
		line_end = next_pixel + byte_width;
		dev_addr += offset;
		back_start += offset;
		line_start += offset;

		memcpy((char *)back_start, (char *) line_start,
		       byte_width);
	}
R
Roberto De Ioris 已提交
550

551 552 553 554 555 556 557 558 559
	while (next_pixel < line_end) {

		dlfb_compress_hline((const uint16_t **) &next_pixel,
			     (const uint16_t *) line_end, &dev_addr,
			(u8 **) &cmd, (u8 *) cmd_end);

		if (cmd >= cmd_end) {
			int len = cmd - (u8 *) urb->transfer_buffer;
			if (dlfb_submit_urb(dev, urb, len))
560
				return 1; /* lost pixels is set */
561 562 563
			*sent_ptr += len;
			urb = dlfb_get_urb(dev);
			if (!urb)
564
				return 1; /* lost_pixels is set */
565 566 567
			*urb_ptr = urb;
			cmd = urb->transfer_buffer;
			cmd_end = &cmd[urb->transfer_buffer_length];
R
Roberto De Ioris 已提交
568 569 570
		}
	}

571
	*urb_buf_ptr = cmd;
572 573

	return 0;
R
Roberto De Ioris 已提交
574 575
}

576
static int dlfb_handle_damage(struct dlfb_data *dev, int x, int y,
577
	       int width, int height, char *data)
578 579
{
	int i, ret;
580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
	char *cmd;
	cycles_t start_cycles, end_cycles;
	int bytes_sent = 0;
	int bytes_identical = 0;
	struct urb *urb;
	int aligned_x;

	start_cycles = get_cycles();

	aligned_x = DL_ALIGN_DOWN(x, sizeof(unsigned long));
	width = DL_ALIGN_UP(width + (x-aligned_x), sizeof(unsigned long));
	x = aligned_x;

	if ((width <= 0) ||
	    (x + width > dev->info->var.xres) ||
	    (y + height > dev->info->var.yres))
		return -EINVAL;
597

598 599
	if (!atomic_read(&dev->usb_active))
		return 0;
600

601 602 603 604
	urb = dlfb_get_urb(dev);
	if (!urb)
		return 0;
	cmd = urb->transfer_buffer;
605

606 607 608
	for (i = y; i < y + height ; i++) {
		const int line_offset = dev->info->fix.line_length * i;
		const int byte_offset = line_offset + (x * BPP);
609

610 611
		if (dlfb_render_hline(dev, &urb,
				      (char *) dev->info->fix.smem_start,
612
				      &cmd, byte_offset, width * BPP,
613 614
				      &bytes_identical, &bytes_sent))
			goto error;
615 616
	}

617 618 619 620 621 622 623 624
	if (cmd > (char *) urb->transfer_buffer) {
		/* Send partial buffer remaining before exiting */
		int len = cmd - (char *) urb->transfer_buffer;
		ret = dlfb_submit_urb(dev, urb, len);
		bytes_sent += len;
	} else
		dlfb_urb_completion(urb);

625
error:
626 627 628 629 630 631 632
	atomic_add(bytes_sent, &dev->bytes_sent);
	atomic_add(bytes_identical, &dev->bytes_identical);
	atomic_add(width*height*2, &dev->bytes_rendered);
	end_cycles = get_cycles();
	atomic_add(((unsigned int) ((end_cycles - start_cycles)
		    >> 10)), /* Kcycles */
		   &dev->cpu_kcycles_used);
633

634
	return 0;
635 636
}

637 638 639 640 641 642 643 644 645
/*
 * Path triggered by usermode clients who write to filesystem
 * e.g. cat filename > /dev/fb1
 * Not used by X Windows or text-mode console. But useful for testing.
 * Slow because of extra copy and we must assume all pixels dirty.
 */
static ssize_t dlfb_ops_write(struct fb_info *info, const char __user *buf,
			  size_t count, loff_t *ppos)
{
646
	ssize_t result;
647 648 649 650 651 652
	struct dlfb_data *dev = info->par;
	u32 offset = (u32) *ppos;

	result = fb_sys_write(info, buf, count, ppos);

	if (result > 0) {
653
		int start = max((int)(offset / info->fix.line_length), 0);
654 655 656 657 658 659 660 661 662 663
		int lines = min((u32)((result / info->fix.line_length) + 1),
				(u32)info->var.yres);

		dlfb_handle_damage(dev, 0, start, info->var.xres,
			lines, info->screen_base);
	}

	return result;
}

664 665 666
/* hardware has native COPY command (see libdlo), but not worth it for fbcon */
static void dlfb_ops_copyarea(struct fb_info *info,
				const struct fb_copyarea *area)
R
Roberto De Ioris 已提交
667 668
{

669
	struct dlfb_data *dev = info->par;
R
Roberto De Ioris 已提交
670

671
	sys_copyarea(info, area);
R
Roberto De Ioris 已提交
672

673 674 675
	dlfb_handle_damage(dev, area->dx, area->dy,
			area->width, area->height, info->screen_base);
}
R
Roberto De Ioris 已提交
676

677 678 679 680
static void dlfb_ops_imageblit(struct fb_info *info,
				const struct fb_image *image)
{
	struct dlfb_data *dev = info->par;
R
Roberto De Ioris 已提交
681

682
	sys_imageblit(info, image);
R
Roberto De Ioris 已提交
683

684 685
	dlfb_handle_damage(dev, image->dx, image->dy,
			image->width, image->height, info->screen_base);
R
Roberto De Ioris 已提交
686 687
}

688 689
static void dlfb_ops_fillrect(struct fb_info *info,
			  const struct fb_fillrect *rect)
R
Roberto De Ioris 已提交
690 691 692
{
	struct dlfb_data *dev = info->par;

693
	sys_fillrect(info, rect);
R
Roberto De Ioris 已提交
694

695 696
	dlfb_handle_damage(dev, rect->dx, rect->dy, rect->width,
			      rect->height, info->screen_base);
R
Roberto De Ioris 已提交
697 698
}

699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
/*
 * NOTE: fb_defio.c is holding info->fbdefio.mutex
 *   Touching ANY framebuffer memory that triggers a page fault
 *   in fb_defio will cause a deadlock, when it also tries to
 *   grab the same mutex.
 */
static void dlfb_dpy_deferred_io(struct fb_info *info,
				struct list_head *pagelist)
{
	struct page *cur;
	struct fb_deferred_io *fbdefio = info->fbdefio;
	struct dlfb_data *dev = info->par;
	struct urb *urb;
	char *cmd;
	cycles_t start_cycles, end_cycles;
	int bytes_sent = 0;
	int bytes_identical = 0;
	int bytes_rendered = 0;

	if (!fb_defio)
		return;

	if (!atomic_read(&dev->usb_active))
		return;

	start_cycles = get_cycles();

	urb = dlfb_get_urb(dev);
	if (!urb)
		return;

	cmd = urb->transfer_buffer;

	/* walk the written page list and render each to device */
	list_for_each_entry(cur, &fbdefio->pagelist, lru) {

735
		if (dlfb_render_hline(dev, &urb, (char *) info->fix.smem_start,
736
				  &cmd, cur->index << PAGE_SHIFT,
737 738
				  PAGE_SIZE, &bytes_identical, &bytes_sent))
			goto error;
739 740 741 742 743 744 745 746 747 748 749
		bytes_rendered += PAGE_SIZE;
	}

	if (cmd > (char *) urb->transfer_buffer) {
		/* Send partial buffer remaining before exiting */
		int len = cmd - (char *) urb->transfer_buffer;
		dlfb_submit_urb(dev, urb, len);
		bytes_sent += len;
	} else
		dlfb_urb_completion(urb);

750
error:
751 752 753 754 755 756 757 758 759
	atomic_add(bytes_sent, &dev->bytes_sent);
	atomic_add(bytes_identical, &dev->bytes_identical);
	atomic_add(bytes_rendered, &dev->bytes_rendered);
	end_cycles = get_cycles();
	atomic_add(((unsigned int) ((end_cycles - start_cycles)
		    >> 10)), /* Kcycles */
		   &dev->cpu_kcycles_used);
}

760
static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len)
761 762 763
{
	int i;
	int ret;
764
	char *rbuf;
765

766 767 768 769 770
	rbuf = kmalloc(2, GFP_KERNEL);
	if (!rbuf)
		return 0;

	for (i = 0; i < len; i++) {
771 772 773
		ret = usb_control_msg(dev->udev,
				    usb_rcvctrlpipe(dev->udev, 0), (0x02),
				    (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
774 775
				    HZ);
		if (ret < 1) {
776
			pr_err("Read EDID byte %d failed err %x\n", i, ret);
777 778 779 780
			i--;
			break;
		}
		edid[i] = rbuf[1];
781
	}
782 783 784 785

	kfree(rbuf);

	return i;
786 787
}

788
static int dlfb_ops_ioctl(struct fb_info *info, unsigned int cmd,
789
				unsigned long arg)
R
Roberto De Ioris 已提交
790
{
791 792

	struct dlfb_data *dev = info->par;
R
Roberto De Ioris 已提交
793

794 795 796 797 798
	if (!atomic_read(&dev->usb_active))
		return 0;

	/* TODO: Update X server to get this from sysfs instead */
	if (cmd == DLFB_IOCTL_RETURN_EDID) {
799
		void __user *edid = (void __user *)arg;
800
		if (copy_to_user(edid, dev->edid, dev->edid_size))
801 802 803 804
			return -EFAULT;
		return 0;
	}

805 806
	/* TODO: Help propose a standard fb.h ioctl to report mmap damage */
	if (cmd == DLFB_IOCTL_REPORT_DAMAGE) {
807 808 809 810 811
		struct dloarea area;

		if (copy_from_user(&area, (void __user *)arg,
				  sizeof(struct dloarea)))
			return -EFAULT;
R
Roberto De Ioris 已提交
812

813 814
		/*
		 * If we have a damage-aware client, turn fb_defio "off"
L
Lucas De Marchi 已提交
815
		 * To avoid perf imact of unnecessary page fault handling.
816 817 818 819 820 821 822
		 * Done by resetting the delay for this fb_info to a very
		 * long period. Pages will become writable and stay that way.
		 * Reset to normal value when all clients have closed this fb.
		 */
		if (info->fbdefio)
			info->fbdefio->delay = DL_DEFIO_WRITE_DISABLE;

823 824
		if (area.x < 0)
			area.x = 0;
R
Roberto De Ioris 已提交
825

826 827
		if (area.x > info->var.xres)
			area.x = info->var.xres;
R
Roberto De Ioris 已提交
828

829 830
		if (area.y < 0)
			area.y = 0;
R
Roberto De Ioris 已提交
831

832 833
		if (area.y > info->var.yres)
			area.y = info->var.yres;
R
Roberto De Ioris 已提交
834

835
		dlfb_handle_damage(dev, area.x, area.y, area.w, area.h,
R
Roberto De Ioris 已提交
836 837
			   info->screen_base);
	}
838

R
Roberto De Ioris 已提交
839 840 841
	return 0;
}

842
/* taken from vesafb */
R
Roberto De Ioris 已提交
843
static int
844
dlfb_ops_setcolreg(unsigned regno, unsigned red, unsigned green,
R
Roberto De Ioris 已提交
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
	       unsigned blue, unsigned transp, struct fb_info *info)
{
	int err = 0;

	if (regno >= info->cmap.len)
		return 1;

	if (regno < 16) {
		if (info->var.red.offset == 10) {
			/* 1:5:5:5 */
			((u32 *) (info->pseudo_palette))[regno] =
			    ((red & 0xf800) >> 1) |
			    ((green & 0xf800) >> 6) | ((blue & 0xf800) >> 11);
		} else {
			/* 0:5:6:5 */
			((u32 *) (info->pseudo_palette))[regno] =
			    ((red & 0xf800)) |
			    ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
		}
	}

	return err;
}

869 870 871
/*
 * It's common for several clients to have framebuffer open simultaneously.
 * e.g. both fbcon and X. Makes things interesting.
872
 * Assumes caller is holding info->lock (for open and release at least)
873 874 875 876 877
 */
static int dlfb_ops_open(struct fb_info *info, int user)
{
	struct dlfb_data *dev = info->par;

878 879 880 881 882
	/*
	 * fbcon aggressively connects to first framebuffer it finds,
	 * preventing other clients (X) from working properly. Usually
	 * not what the user wants. Fail by default with option to enable.
	 */
883
	if ((user == 0) && (!console))
884
		return -EBUSY;
885

886 887 888
	/* If the USB device is gone, we don't accept new opens */
	if (dev->virtualized)
		return -ENODEV;
889 890 891

	dev->fb_count++;

892 893
	kref_get(&dev->kref);

894
	if (fb_defio && (info->fbdefio == NULL)) {
895 896 897 898
		/* enable defio at last moment if not disabled by client */

		struct fb_deferred_io *fbdefio;

H
Heiko Stübner 已提交
899
		fbdefio = kzalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
900 901 902 903 904 905 906

		if (fbdefio) {
			fbdefio->delay = DL_DEFIO_WRITE_DELAY;
			fbdefio->deferred_io = dlfb_dpy_deferred_io;
		}

		info->fbdefio = fbdefio;
907 908 909
		fb_deferred_io_init(info);
	}

910
	pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n",
911 912
	    info->node, user, info, dev->fb_count);

R
Roberto De Ioris 已提交
913 914 915
	return 0;
}

916 917 918 919 920
/*
 * Called when all client interfaces to start transactions have been disabled,
 * and all references to our device instance (dlfb_data) are released.
 * Every transaction must have a reference, so we know are fully spun down
 */
921
static void dlfb_free(struct kref *kref)
922 923 924 925 926 927
{
	struct dlfb_data *dev = container_of(kref, struct dlfb_data, kref);

	if (dev->backing_buffer)
		vfree(dev->backing_buffer);

928 929
	kfree(dev->edid);

930
	pr_warn("freeing dlfb_data %p\n", dev);
931

932 933 934
	kfree(dev);
}

935 936 937 938 939 940 941
static void dlfb_release_urb_work(struct work_struct *work)
{
	struct urb_node *unode = container_of(work, struct urb_node,
					      release_urb_work.work);

	up(&unode->dev->urbs.limit_sem);
}
942

943
static void dlfb_free_framebuffer(struct dlfb_data *dev)
944
{
945 946
	struct fb_info *info = dev->info;

947 948
	if (info) {
		int node = info->node;
949

950
		unregister_framebuffer(info);
951

952 953 954 955 956 957
		if (info->cmap.len != 0)
			fb_dealloc_cmap(&info->cmap);
		if (info->monspecs.modedb)
			fb_destroy_modedb(info->monspecs.modedb);
		if (info->screen_base)
			vfree(info->screen_base);
958

959
		fb_destroy_modelist(&info->modelist);
960

961
		dev->info = NULL;
962

963 964
		/* Assume info structure is freed after this point */
		framebuffer_release(info);
965

966 967
		pr_warn("fb_info for /dev/fb%d has been freed\n", node);
	}
968 969 970 971 972

	/* ref taken in probe() as part of registering framebfufer */
	kref_put(&dev->kref, dlfb_free);
}

973 974 975 976 977 978
static void dlfb_free_framebuffer_work(struct work_struct *work)
{
	struct dlfb_data *dev = container_of(work, struct dlfb_data,
					     free_framebuffer_work.work);
	dlfb_free_framebuffer(dev);
}
979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
/*
 * Assumes caller is holding info->lock mutex (for open and release at least)
 */
static int dlfb_ops_release(struct fb_info *info, int user)
{
	struct dlfb_data *dev = info->par;

	dev->fb_count--;

	/* We can't free fb_info here - fbmem will touch it when we return */
	if (dev->virtualized && (dev->fb_count == 0))
		schedule_delayed_work(&dev->free_framebuffer_work, HZ);

	if ((dev->fb_count == 0) && (info->fbdefio)) {
		fb_deferred_io_cleanup(info);
		kfree(info->fbdefio);
		info->fbdefio = NULL;
		info->fbops->fb_mmap = dlfb_ops_mmap;
	}

999
	pr_warn("released /dev/fb%d user=%d count=%d\n",
1000 1001 1002 1003 1004
		  info->node, user, dev->fb_count);

	kref_put(&dev->kref, dlfb_free);

	return 0;
1005 1006
}

1007 1008 1009 1010 1011 1012 1013 1014 1015
/*
 * Check whether a video mode is supported by the DisplayLink chip
 * We start from monitor's modes, so don't need to filter that here
 */
static int dlfb_is_valid_mode(struct fb_videomode *mode,
		struct fb_info *info)
{
	struct dlfb_data *dev = info->par;

1016
	if (mode->xres * mode->yres > dev->sku_pixel_limit) {
1017
		pr_warn("%dx%d beyond chip capabilities\n",
1018
		       mode->xres, mode->yres);
1019
		return 0;
1020 1021
	}

1022 1023
	pr_info("%dx%d @ %d Hz valid mode\n", mode->xres, mode->yres,
		mode->refresh);
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039

	return 1;
}

static void dlfb_var_color_format(struct fb_var_screeninfo *var)
{
	const struct fb_bitfield red = { 11, 5, 0 };
	const struct fb_bitfield green = { 5, 6, 0 };
	const struct fb_bitfield blue = { 0, 5, 0 };

	var->bits_per_pixel = 16;
	var->red = red;
	var->green = green;
	var->blue = blue;
}

1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
static int dlfb_ops_check_var(struct fb_var_screeninfo *var,
				struct fb_info *info)
{
	struct fb_videomode mode;

	/* TODO: support dynamically changing framebuffer size */
	if ((var->xres * var->yres * 2) > info->fix.smem_len)
		return -EINVAL;

	/* set device-specific elements of var unrelated to mode */
	dlfb_var_color_format(var);

	fb_var_to_videomode(&mode, var);

	if (!dlfb_is_valid_mode(&mode, info))
		return -EINVAL;

	return 0;
}

static int dlfb_ops_set_par(struct fb_info *info)
{
	struct dlfb_data *dev = info->par;
1063 1064 1065
	int result;
	u16 *pix_framebuffer;
	int i;
1066

1067
	pr_notice("set_par mode %dx%d\n", info->var.xres, info->var.yres);
1068

1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
	result = dlfb_set_video_mode(dev, &info->var);

	if ((result == 0) && (dev->fb_count == 0)) {

		/* paint greenscreen */

		pix_framebuffer = (u16 *) info->screen_base;
		for (i = 0; i < info->fix.smem_len / 2; i++)
			pix_framebuffer[i] = 0x37e6;

		dlfb_handle_damage(dev, 0, 0, info->var.xres, info->var.yres,
				   info->screen_base);
	}

	return result;
1084 1085
}

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
/* To fonzi the jukebox (e.g. make blanking changes take effect) */
static char *dlfb_dummy_render(char *buf)
{
	*buf++ = 0xAF;
	*buf++ = 0x6A; /* copy */
	*buf++ = 0x00; /* from address*/
	*buf++ = 0x00;
	*buf++ = 0x00;
	*buf++ = 0x01; /* one pixel */
	*buf++ = 0x00; /* to address */
	*buf++ = 0x00;
	*buf++ = 0x00;
	return buf;
}

1101 1102 1103
/*
 * In order to come back from full DPMS off, we need to set the mode again
 */
1104
static int dlfb_ops_blank(int blank_mode, struct fb_info *info)
1105
{
1106
	struct dlfb_data *dev = info->par;
1107 1108
	char *bufptr;
	struct urb *urb;
1109

1110 1111
	pr_info("/dev/fb%d FB_BLANK mode %d --> %d\n",
		info->node, dev->blank_mode, blank_mode);
1112

1113 1114
	if ((dev->blank_mode == FB_BLANK_POWERDOWN) &&
	    (blank_mode != FB_BLANK_POWERDOWN)) {
1115

1116
		/* returning from powerdown requires a fresh modeset */
1117
		dlfb_set_video_mode(dev, &info->var);
1118 1119
	}

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
	urb = dlfb_get_urb(dev);
	if (!urb)
		return 0;

	bufptr = (char *) urb->transfer_buffer;
	bufptr = dlfb_vidreg_lock(bufptr);
	bufptr = dlfb_blanking(bufptr, blank_mode);
	bufptr = dlfb_vidreg_unlock(bufptr);

	/* seems like a render op is needed to have blank change take effect */
	bufptr = dlfb_dummy_render(bufptr);

	dlfb_submit_urb(dev, urb, bufptr -
			(char *) urb->transfer_buffer);

	dev->blank_mode = blank_mode;

R
Roberto De Ioris 已提交
1137 1138 1139 1140
	return 0;
}

static struct fb_ops dlfb_ops = {
1141
	.owner = THIS_MODULE,
1142
	.fb_read = fb_sys_read,
1143
	.fb_write = dlfb_ops_write,
1144 1145 1146 1147 1148 1149
	.fb_setcolreg = dlfb_ops_setcolreg,
	.fb_fillrect = dlfb_ops_fillrect,
	.fb_copyarea = dlfb_ops_copyarea,
	.fb_imageblit = dlfb_ops_imageblit,
	.fb_mmap = dlfb_ops_mmap,
	.fb_ioctl = dlfb_ops_ioctl,
1150
	.fb_open = dlfb_ops_open,
1151 1152
	.fb_release = dlfb_ops_release,
	.fb_blank = dlfb_ops_blank,
1153 1154
	.fb_check_var = dlfb_ops_check_var,
	.fb_set_par = dlfb_ops_set_par,
R
Roberto De Ioris 已提交
1155 1156
};

1157

1158
/*
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
 * Assumes &info->lock held by caller
 * Assumes no active clients have framebuffer open
 */
static int dlfb_realloc_framebuffer(struct dlfb_data *dev, struct fb_info *info)
{
	int retval = -ENOMEM;
	int old_len = info->fix.smem_len;
	int new_len;
	unsigned char *old_fb = info->screen_base;
	unsigned char *new_fb;
1169
	unsigned char *new_back = NULL;
1170

1171
	pr_warn("Reallocating framebuffer. Addresses will change!\n");
1172 1173 1174 1175 1176 1177 1178 1179 1180

	new_len = info->fix.line_length * info->var.yres;

	if (PAGE_ALIGN(new_len) > old_len) {
		/*
		 * Alloc system memory for virtual framebuffer
		 */
		new_fb = vmalloc(new_len);
		if (!new_fb) {
1181
			pr_err("Virtual framebuffer alloc failed\n");
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
			goto error;
		}

		if (info->screen_base) {
			memcpy(new_fb, old_fb, old_len);
			vfree(info->screen_base);
		}

		info->screen_base = new_fb;
		info->fix.smem_len = PAGE_ALIGN(new_len);
		info->fix.smem_start = (unsigned long) new_fb;
		info->flags = udlfb_info_flags;

		/*
		 * Second framebuffer copy to mirror the framebuffer state
		 * on the physical USB device. We can function without this.
		 * But with imperfect damage info we may send pixels over USB
		 * that were, in fact, unchanged - wasting limited USB bandwidth
		 */
1201 1202
		if (shadow)
			new_back = vzalloc(new_len);
1203
		if (!new_back)
1204
			pr_info("No shadow/backing buffer allocated\n");
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
		else {
			if (dev->backing_buffer)
				vfree(dev->backing_buffer);
			dev->backing_buffer = new_back;
		}
	}

	retval = 0;

error:
	return retval;
}

/*
 * 1) Get EDID from hw, or use sw default
 * 2) Parse into various fb_info structs
 * 3) Allocate virtual framebuffer memory to back highest res mode
 *
 * Parses EDID into three places used by various parts of fbdev:
1224 1225 1226 1227 1228 1229
 * fb_var_screeninfo contains the timing of the monitor's preferred mode
 * fb_info.monspecs is full parsed EDID info, including monspecs.modedb
 * fb_info.modelist is a linked list of all monitor & VESA modes which work
 *
 * If EDID is not readable/valid, then modelist is all VESA modes,
 * monspecs is NULL, and fb_var_screeninfo is set to safe VESA mode
1230
 * Returns 0 if successful
1231
 */
1232 1233 1234
static int dlfb_setup_modes(struct dlfb_data *dev,
			   struct fb_info *info,
			   char *default_edid, size_t default_edid_size)
1235 1236 1237 1238
{
	int i;
	const struct fb_videomode *default_vmode = NULL;
	int result = 0;
1239 1240 1241 1242 1243 1244
	char *edid;
	int tries = 3;

	if (info->dev) /* only use mutex if info has been registered */
		mutex_lock(&info->lock);

1245
	edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
1246 1247 1248 1249
	if (!edid) {
		result = -ENOMEM;
		goto error;
	}
1250 1251 1252 1253

	fb_destroy_modelist(&info->modelist);
	memset(&info->monspecs, 0, sizeof(info->monspecs));

1254 1255 1256 1257 1258 1259 1260
	/*
	 * Try to (re)read EDID from hardware first
	 * EDID data may return, but not parse as valid
	 * Try again a few times, in case of e.g. analog cable noise
	 */
	while (tries--) {

1261
		i = dlfb_get_edid(dev, edid, EDID_LENGTH);
1262

1263
		if (i >= EDID_LENGTH)
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
			fb_edid_to_monspecs(edid, &info->monspecs);

		if (info->monspecs.modedb_len > 0) {
			dev->edid = edid;
			dev->edid_size = i;
			break;
		}
	}

	/* If that fails, use a previously returned EDID if available */
	if (info->monspecs.modedb_len == 0) {

1276
		pr_err("Unable to get valid EDID from device/display\n");
1277 1278 1279 1280

		if (dev->edid) {
			fb_edid_to_monspecs(dev->edid, &info->monspecs);
			if (info->monspecs.modedb_len > 0)
1281
				pr_err("Using previously queried EDID\n");
1282 1283 1284 1285 1286
		}
	}

	/* If that fails, use the default EDID we were handed */
	if (info->monspecs.modedb_len == 0) {
1287
		if (default_edid_size >= EDID_LENGTH) {
1288 1289 1290 1291 1292
			fb_edid_to_monspecs(default_edid, &info->monspecs);
			if (info->monspecs.modedb_len > 0) {
				memcpy(edid, default_edid, default_edid_size);
				dev->edid = edid;
				dev->edid_size = default_edid_size;
1293
				pr_err("Using default/backup EDID\n");
1294 1295 1296
			}
		}
	}
1297

1298
	/* If we've got modes, let's pick a best default mode */
1299 1300 1301 1302 1303 1304
	if (info->monspecs.modedb_len > 0) {

		for (i = 0; i < info->monspecs.modedb_len; i++) {
			if (dlfb_is_valid_mode(&info->monspecs.modedb[i], info))
				fb_add_videomode(&info->monspecs.modedb[i],
					&info->modelist);
1305 1306 1307 1308 1309 1310
			else {
				if (i == 0)
					/* if we've removed top/best mode */
					info->monspecs.misc
						&= ~FB_MISC_1ST_DETAIL;
			}
1311 1312 1313 1314
		}

		default_vmode = fb_find_best_display(&info->monspecs,
						     &info->modelist);
1315
	}
1316

1317 1318 1319 1320
	/* If everything else has failed, fall back to safe default mode */
	if (default_vmode == NULL) {

		struct fb_videomode fb_vmode = {0};
1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345

		/*
		 * Add the standard VESA modes to our modelist
		 * Since we don't have EDID, there may be modes that
		 * overspec monitor and/or are incorrect aspect ratio, etc.
		 * But at least the user has a chance to choose
		 */
		for (i = 0; i < VESA_MODEDB_SIZE; i++) {
			if (dlfb_is_valid_mode((struct fb_videomode *)
						&vesa_modes[i], info))
				fb_add_videomode(&vesa_modes[i],
						 &info->modelist);
		}

		/*
		 * default to resolution safe for projectors
		 * (since they are most common case without EDID)
		 */
		fb_vmode.xres = 800;
		fb_vmode.yres = 600;
		fb_vmode.refresh = 60;
		default_vmode = fb_find_nearest_mode(&fb_vmode,
						     &info->modelist);
	}

1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
	/* If we have good mode and no active clients*/
	if ((default_vmode != NULL) && (dev->fb_count == 0)) {

		fb_videomode_to_var(&info->var, default_vmode);
		dlfb_var_color_format(&info->var);

		/*
		 * with mode size info, we can now alloc our framebuffer.
		 */
		memcpy(&info->fix, &dlfb_fix, sizeof(dlfb_fix));
		info->fix.line_length = info->var.xres *
			(info->var.bits_per_pixel / 8);

		result = dlfb_realloc_framebuffer(dev, info);

	} else
		result = -EINVAL;

error:
	if (edid && (dev->edid != edid))
		kfree(edid);

	if (info->dev)
		mutex_unlock(&info->lock);
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405

	return result;
}

static ssize_t metrics_bytes_rendered_show(struct device *fbdev,
				   struct device_attribute *a, char *buf) {
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;
	return snprintf(buf, PAGE_SIZE, "%u\n",
			atomic_read(&dev->bytes_rendered));
}

static ssize_t metrics_bytes_identical_show(struct device *fbdev,
				   struct device_attribute *a, char *buf) {
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;
	return snprintf(buf, PAGE_SIZE, "%u\n",
			atomic_read(&dev->bytes_identical));
}

static ssize_t metrics_bytes_sent_show(struct device *fbdev,
				   struct device_attribute *a, char *buf) {
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;
	return snprintf(buf, PAGE_SIZE, "%u\n",
			atomic_read(&dev->bytes_sent));
}

static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev,
				   struct device_attribute *a, char *buf) {
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;
	return snprintf(buf, PAGE_SIZE, "%u\n",
			atomic_read(&dev->cpu_kcycles_used));
}

1406 1407 1408
static ssize_t edid_show(
			struct file *filp,
			struct kobject *kobj, struct bin_attribute *a,
1409 1410 1411 1412 1413
			 char *buf, loff_t off, size_t count) {
	struct device *fbdev = container_of(kobj, struct device, kobj);
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;

1414
	if (dev->edid == NULL)
1415 1416
		return 0;

1417
	if ((off >= dev->edid_size) || (count > dev->edid_size))
1418 1419
		return 0;

1420 1421 1422
	if (off + count > dev->edid_size)
		count = dev->edid_size - off;

1423
	pr_info("sysfs edid copy %p to %p, %d bytes\n",
1424 1425 1426
		dev->edid, buf, (int) count);

	memcpy(buf, dev->edid, count);
1427 1428 1429 1430

	return count;
}

1431 1432 1433 1434 1435 1436 1437
static ssize_t edid_store(
			struct file *filp,
			struct kobject *kobj, struct bin_attribute *a,
			char *src, loff_t src_off, size_t src_size) {
	struct device *fbdev = container_of(kobj, struct device, kobj);
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;
1438
	int ret;
1439 1440

	/* We only support write of entire EDID at once, no offset*/
1441
	if ((src_size != EDID_LENGTH) || (src_off != 0))
1442
		return -EINVAL;
1443

1444 1445 1446
	ret = dlfb_setup_modes(dev, fb_info, src, src_size);
	if (ret)
		return ret;
1447

1448 1449 1450 1451 1452 1453
	if (!dev->edid || memcmp(src, dev->edid, src_size))
		return -EINVAL;

	pr_info("sysfs written EDID is new default\n");
	dlfb_ops_set_par(fb_info);
	return src_size;
1454
}
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472

static ssize_t metrics_reset_store(struct device *fbdev,
			   struct device_attribute *attr,
			   const char *buf, size_t count)
{
	struct fb_info *fb_info = dev_get_drvdata(fbdev);
	struct dlfb_data *dev = fb_info->par;

	atomic_set(&dev->bytes_rendered, 0);
	atomic_set(&dev->bytes_identical, 0);
	atomic_set(&dev->bytes_sent, 0);
	atomic_set(&dev->cpu_kcycles_used, 0);

	return count;
}

static struct bin_attribute edid_attr = {
	.attr.name = "edid",
1473
	.attr.mode = 0666,
1474
	.size = EDID_LENGTH,
1475
	.read = edid_show,
1476
	.write = edid_store
1477 1478 1479 1480 1481 1482 1483
};

static struct device_attribute fb_device_attrs[] = {
	__ATTR_RO(metrics_bytes_rendered),
	__ATTR_RO(metrics_bytes_identical),
	__ATTR_RO(metrics_bytes_sent),
	__ATTR_RO(metrics_cpu_kcycles_used),
1484
	__ATTR(metrics_reset, S_IWUSR, NULL, metrics_reset_store),
1485 1486
};

1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
/*
 * This is necessary before we can communicate with the display controller.
 */
static int dlfb_select_std_channel(struct dlfb_data *dev)
{
	int ret;
	u8 set_def_chn[] = {	   0x57, 0xCD, 0xDC, 0xA7,
				0x1C, 0x88, 0x5E, 0x15,
				0x60, 0xFE, 0xC6, 0x97,
				0x16, 0x3D, 0x47, 0xF2  };

	ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
			NR_USB_REQUEST_CHANNEL,
			(USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
			set_def_chn, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT);
	return ret;
}

1505
static int dlfb_parse_vendor_descriptor(struct dlfb_data *dev,
1506
					struct usb_interface *interface)
1507 1508 1509 1510 1511
{
	char *desc;
	char *buf;
	char *desc_end;

1512
	int total_len = 0;
1513 1514 1515 1516 1517 1518

	buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
	if (!buf)
		return false;
	desc = buf;

1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
	total_len = usb_get_descriptor(interface_to_usbdev(interface),
					0x5f, /* vendor specific */
					0, desc, MAX_VENDOR_DESCRIPTOR_SIZE);

	/* if not found, look in configuration descriptor */
	if (total_len < 0) {
		if (0 == usb_get_extra_descriptor(interface->cur_altsetting,
			0x5f, &desc))
			total_len = (int) desc[0];
	}

1530
	if (total_len > 5) {
1531
		pr_info("vendor descriptor length:%x data:%02x %02x %02x %02x" \
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550
			"%02x %02x %02x %02x %02x %02x %02x\n",
			total_len, desc[0],
			desc[1], desc[2], desc[3], desc[4], desc[5], desc[6],
			desc[7], desc[8], desc[9], desc[10]);

		if ((desc[0] != total_len) || /* descriptor length */
		    (desc[1] != 0x5f) ||   /* vendor descriptor type */
		    (desc[2] != 0x01) ||   /* version (2 bytes) */
		    (desc[3] != 0x00) ||
		    (desc[4] != total_len - 2)) /* length after type */
			goto unrecognized;

		desc_end = desc + total_len;
		desc += 5; /* the fixed header we've already parsed */

		while (desc < desc_end) {
			u8 length;
			u16 key;

1551
			key = le16_to_cpu(*((u16 *) desc));
1552 1553 1554 1555 1556 1557 1558 1559
			desc += sizeof(u16);
			length = *desc;
			desc++;

			switch (key) {
			case 0x0200: { /* max_area */
				u32 max_area;
				max_area = le32_to_cpu(*((u32 *)desc));
1560
				pr_warn("DL chip limited to %d pixel modes\n",
1561 1562 1563 1564 1565 1566 1567 1568 1569
					max_area);
				dev->sku_pixel_limit = max_area;
				break;
			}
			default:
				break;
			}
			desc += length;
		}
1570 1571
	} else {
		pr_info("vendor descriptor not available (%d)\n", total_len);
1572 1573 1574
	}

	goto success;
1575

1576 1577
unrecognized:
	/* allow udlfb to load for now even if firmware unrecognized */
1578
	pr_err("Unrecognized vendor firmware descriptor\n");
1579 1580 1581 1582 1583

success:
	kfree(buf);
	return true;
}
1584 1585 1586

static void dlfb_init_framebuffer_work(struct work_struct *work);

1587
static int dlfb_usb_probe(struct usb_interface *interface,
1588
			const struct usb_device_id *id)
R
Roberto De Ioris 已提交
1589
{
1590
	struct usb_device *usbdev;
1591
	struct dlfb_data *dev = NULL;
1592 1593
	int retval = -ENOMEM;

1594 1595 1596
	/* usb initialization */

	usbdev = interface_to_usbdev(interface);
1597 1598 1599

	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (dev == NULL) {
1600
		dev_err(&interface->dev, "dlfb_usb_probe: failed alloc of dev struct\n");
1601
		goto error;
R
Roberto De Ioris 已提交
1602 1603
	}

1604 1605
	kref_init(&dev->kref); /* matching kref_put in usb .disconnect fn */

1606
	dev->udev = usbdev;
1607
	dev->gdev = &usbdev->dev; /* our generic struct device * */
1608 1609
	usb_set_intfdata(interface, dev);

1610
	pr_info("%s %s - serial #%s\n",
1611
		usbdev->manufacturer, usbdev->product, usbdev->serial);
1612
	pr_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n",
1613 1614
		usbdev->descriptor.idVendor, usbdev->descriptor.idProduct,
		usbdev->descriptor.bcdDevice, dev);
1615 1616
	pr_info("console enable=%d\n", console);
	pr_info("fb_defio enable=%d\n", fb_defio);
1617
	pr_info("shadow enable=%d\n", shadow);
1618 1619 1620

	dev->sku_pixel_limit = 2048 * 1152; /* default to maximum */

1621
	if (!dlfb_parse_vendor_descriptor(dev, interface)) {
1622
		pr_err("firmware not recognized. Assume incompatible device\n");
1623 1624 1625
		goto error;
	}

1626
	if (pixel_limit) {
M
Masanari Iida 已提交
1627
		pr_warn("DL chip limit of %d overridden"
1628 1629 1630 1631 1632 1633
			" by module param to %d\n",
			dev->sku_pixel_limit, pixel_limit);
		dev->sku_pixel_limit = pixel_limit;
	}


1634 1635
	if (!dlfb_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
		retval = -ENOMEM;
1636
		pr_err("dlfb_alloc_urb_list failed\n");
1637 1638 1639
		goto error;
	}

1640 1641
	kref_get(&dev->kref); /* matching kref_put in free_framebuffer_work */

1642
	/* We don't register a new USB class. Our client interface is fbdev */
1643

1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670
	/* Workitem keep things fast & simple during USB enumeration */
	INIT_DELAYED_WORK(&dev->init_framebuffer_work,
			  dlfb_init_framebuffer_work);
	schedule_delayed_work(&dev->init_framebuffer_work, 0);

	return 0;

error:
	if (dev) {

		kref_put(&dev->kref, dlfb_free); /* ref for framebuffer */
		kref_put(&dev->kref, dlfb_free); /* last ref from kref_init */

		/* dev has been deallocated. Do not dereference */
	}

	return retval;
}

static void dlfb_init_framebuffer_work(struct work_struct *work)
{
	struct dlfb_data *dev = container_of(work, struct dlfb_data,
					     init_framebuffer_work.work);
	struct fb_info *info;
	int retval;
	int i;

1671
	/* allocates framebuffer driver structure, not framebuffer memory */
1672
	info = framebuffer_alloc(0, dev->gdev);
1673 1674
	if (!info) {
		retval = -ENOMEM;
1675
		pr_err("framebuffer_alloc failed\n");
1676 1677
		goto error;
	}
1678

1679 1680 1681
	dev->info = info;
	info->par = dev;
	info->pseudo_palette = dev->pseudo_palette;
1682
	info->fbops = &dlfb_ops;
1683

1684 1685
	retval = fb_alloc_cmap(&info->cmap, 256, 0);
	if (retval < 0) {
1686
		pr_err("fb_alloc_cmap failed %x\n", retval);
1687 1688
		goto error;
	}
R
Roberto De Ioris 已提交
1689

1690 1691 1692
	INIT_DELAYED_WORK(&dev->free_framebuffer_work,
			  dlfb_free_framebuffer_work);

1693 1694 1695 1696
	INIT_LIST_HEAD(&info->modelist);

	retval = dlfb_setup_modes(dev, info, NULL, 0);
	if (retval != 0) {
1697
		pr_err("unable to find common mode for display and adapter\n");
1698 1699 1700
		goto error;
	}

1701
	/* ready to begin using device */
R
Roberto De Ioris 已提交
1702

1703 1704
	atomic_set(&dev->usb_active, 1);
	dlfb_select_std_channel(dev);
R
Roberto De Ioris 已提交
1705

1706
	dlfb_ops_check_var(&info->var, info);
1707
	dlfb_ops_set_par(info);
R
Roberto De Ioris 已提交
1708

1709
	retval = register_framebuffer(info);
1710
	if (retval < 0) {
1711
		pr_err("register_framebuffer failed %d\n", retval);
1712
		goto error;
1713
	}
R
Roberto De Ioris 已提交
1714

1715 1716 1717
	for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) {
		retval = device_create_file(info->dev, &fb_device_attrs[i]);
		if (retval) {
1718
			pr_warn("device_create_file failed %d\n", retval);
1719 1720
		}
	}
R
Roberto De Ioris 已提交
1721

1722 1723
	retval = device_create_bin_file(info->dev, &edid_attr);
	if (retval) {
1724
		pr_warn("device_create_bin_file failed %d\n", retval);
1725
	}
R
Roberto De Ioris 已提交
1726

1727
	pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution."
1728
			" Using %dK framebuffer memory\n", info->node,
1729
			info->var.xres, info->var.yres,
1730
			((dev->backing_buffer) ?
1731
			info->fix.smem_len * 2 : info->fix.smem_len) >> 10);
1732
	return;
1733

1734
error:
1735
	dlfb_free_framebuffer(dev);
R
Roberto De Ioris 已提交
1736 1737
}

1738
static void dlfb_usb_disconnect(struct usb_interface *interface)
R
Roberto De Ioris 已提交
1739
{
1740 1741
	struct dlfb_data *dev;
	struct fb_info *info;
1742
	int i;
R
Roberto De Ioris 已提交
1743

1744
	dev = usb_get_intfdata(interface);
1745 1746
	info = dev->info;

1747
	pr_info("USB disconnect starting\n");
1748

1749 1750 1751 1752 1753
	/* we virtualize until all fb clients release. Then we free */
	dev->virtualized = true;

	/* When non-active we'll update virtual framebuffer, but no new urbs */
	atomic_set(&dev->usb_active, 0);
1754

1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765
	/* this function will wait for all in-flight urbs to complete */
	dlfb_free_urb_list(dev);

	if (info) {
		/* remove udlfb's sysfs interfaces */
		for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
			device_remove_file(info->dev, &fb_device_attrs[i]);
		device_remove_bin_file(info->dev, &edid_attr);
		unlink_framebuffer(info);
	}

1766
	usb_set_intfdata(interface, NULL);
1767 1768
	dev->udev = NULL;
	dev->gdev = NULL;
1769

1770 1771 1772
	/* if clients still have us open, will be freed on last close */
	if (dev->fb_count == 0)
		schedule_delayed_work(&dev->free_framebuffer_work, 0);
R
Roberto De Ioris 已提交
1773

1774
	/* release reference taken by kref_init in probe() */
1775
	kref_put(&dev->kref, dlfb_free);
R
Roberto De Ioris 已提交
1776

1777 1778 1779
	/* consider dlfb_data freed */

	return;
R
Roberto De Ioris 已提交
1780 1781 1782 1783
}

static struct usb_driver dlfb_driver = {
	.name = "udlfb",
1784 1785
	.probe = dlfb_usb_probe,
	.disconnect = dlfb_usb_disconnect,
R
Roberto De Ioris 已提交
1786 1787 1788
	.id_table = id_table,
};

1789
module_usb_driver(dlfb_driver);
R
Roberto De Ioris 已提交
1790

1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
static void dlfb_urb_completion(struct urb *urb)
{
	struct urb_node *unode = urb->context;
	struct dlfb_data *dev = unode->dev;
	unsigned long flags;

	/* sync/async unlink faults aren't errors */
	if (urb->status) {
		if (!(urb->status == -ENOENT ||
		    urb->status == -ECONNRESET ||
		    urb->status == -ESHUTDOWN)) {
1802
			pr_err("%s - nonzero write bulk status received: %d\n",
1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
				__func__, urb->status);
			atomic_set(&dev->lost_pixels, 1);
		}
	}

	urb->transfer_buffer_length = dev->urbs.size; /* reset to actual */

	spin_lock_irqsave(&dev->urbs.lock, flags);
	list_add_tail(&unode->entry, &dev->urbs.list);
	dev->urbs.available++;
	spin_unlock_irqrestore(&dev->urbs.lock, flags);

1815 1816 1817 1818 1819 1820 1821 1822
	/*
	 * When using fb_defio, we deadlock if up() is called
	 * while another is waiting. So queue to another process.
	 */
	if (fb_defio)
		schedule_delayed_work(&unode->release_urb_work, 0);
	else
		up(&dev->urbs.limit_sem);
1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
}

static void dlfb_free_urb_list(struct dlfb_data *dev)
{
	int count = dev->urbs.count;
	struct list_head *node;
	struct urb_node *unode;
	struct urb *urb;
	int ret;
	unsigned long flags;

1834
	pr_notice("Freeing all render urbs\n");
1835 1836 1837

	/* keep waiting and freeing, until we've got 'em all */
	while (count--) {
1838

1839
		/* Getting interrupted means a leak, but ok at disconnect */
1840 1841
		ret = down_interruptible(&dev->urbs.limit_sem);
		if (ret)
1842
			break;
1843

1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854
		spin_lock_irqsave(&dev->urbs.lock, flags);

		node = dev->urbs.list.next; /* have reserved one with sem */
		list_del_init(node);

		spin_unlock_irqrestore(&dev->urbs.lock, flags);

		unode = list_entry(node, struct urb_node, entry);
		urb = unode->urb;

		/* Free each separately allocated piece */
1855 1856
		usb_free_coherent(urb->dev, dev->urbs.size,
				  urb->transfer_buffer, urb->transfer_dma);
1857 1858 1859 1860
		usb_free_urb(urb);
		kfree(node);
	}

1861
	dev->urbs.count = 0;
1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
}

static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size)
{
	int i = 0;
	struct urb *urb;
	struct urb_node *unode;
	char *buf;

	spin_lock_init(&dev->urbs.lock);

	dev->urbs.size = size;
	INIT_LIST_HEAD(&dev->urbs.list);

	while (i < count) {
		unode = kzalloc(sizeof(struct urb_node), GFP_KERNEL);
		if (!unode)
			break;
		unode->dev = dev;

1882 1883 1884
		INIT_DELAYED_WORK(&unode->release_urb_work,
			  dlfb_release_urb_work);

1885 1886 1887 1888 1889 1890 1891
		urb = usb_alloc_urb(0, GFP_KERNEL);
		if (!urb) {
			kfree(unode);
			break;
		}
		unode->urb = urb;

1892 1893
		buf = usb_alloc_coherent(dev->udev, MAX_TRANSFER, GFP_KERNEL,
					 &urb->transfer_dma);
1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913
		if (!buf) {
			kfree(unode);
			usb_free_urb(urb);
			break;
		}

		/* urb->transfer_buffer_length set to actual before submit */
		usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, 1),
			buf, size, dlfb_urb_completion, unode);
		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

		list_add_tail(&unode->entry, &dev->urbs.list);

		i++;
	}

	sema_init(&dev->urbs.limit_sem, i);
	dev->urbs.count = i;
	dev->urbs.available = i;

1914
	pr_notice("allocated %d %d byte urbs\n", i, (int) size);
1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930

	return i;
}

static struct urb *dlfb_get_urb(struct dlfb_data *dev)
{
	int ret = 0;
	struct list_head *entry;
	struct urb_node *unode;
	struct urb *urb = NULL;
	unsigned long flags;

	/* Wait for an in-flight buffer to complete and get re-queued */
	ret = down_timeout(&dev->urbs.limit_sem, GET_URB_TIMEOUT);
	if (ret) {
		atomic_set(&dev->lost_pixels, 1);
1931
		pr_warn("wait for urb interrupted: %x available: %d\n",
1932
		       ret, dev->urbs.available);
1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
		goto error;
	}

	spin_lock_irqsave(&dev->urbs.lock, flags);

	BUG_ON(list_empty(&dev->urbs.list)); /* reserved one with limit_sem */
	entry = dev->urbs.list.next;
	list_del_init(entry);
	dev->urbs.available--;

	spin_unlock_irqrestore(&dev->urbs.lock, flags);

	unode = list_entry(entry, struct urb_node, entry);
	urb = unode->urb;

error:
	return urb;
}

static int dlfb_submit_urb(struct dlfb_data *dev, struct urb *urb, size_t len)
{
	int ret;

	BUG_ON(len > dev->urbs.size);

	urb->transfer_buffer_length = len; /* set to actual payload len */
	ret = usb_submit_urb(urb, GFP_KERNEL);
	if (ret) {
		dlfb_urb_completion(urb); /* because no one else will */
		atomic_set(&dev->lost_pixels, 1);
1963
		pr_err("usb_submit_urb error %x\n", ret);
1964 1965 1966 1967
	}
	return ret;
}

1968
module_param(console, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1969
MODULE_PARM_DESC(console, "Allow fbcon to open framebuffer");
1970 1971

module_param(fb_defio, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1972
MODULE_PARM_DESC(fb_defio, "Page fault detection of mmap writes");
1973

1974 1975 1976
module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");

1977 1978 1979
module_param(pixel_limit, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
MODULE_PARM_DESC(pixel_limit, "Force limit on max mode (in x*y pixels)");

1980
MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>, "
1981 1982 1983
	      "Jaya Kumar <jayakumar.lkml@gmail.com>, "
	      "Bernie Thompson <bernie@plugable.com>");
MODULE_DESCRIPTION("DisplayLink kernel framebuffer driver");
R
Roberto De Ioris 已提交
1984
MODULE_LICENSE("GPL");
1985