Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.9-rc8 2078 lines 52 kB view raw
1/* 2 * A framebuffer driver for VBE 2.0+ compliant video cards 3 * 4 * (c) 2007 Michal Januszewski <spock@gentoo.org> 5 * Loosely based upon the vesafb driver. 6 * 7 */ 8#include <linux/init.h> 9#include <linux/module.h> 10#include <linux/moduleparam.h> 11#include <linux/skbuff.h> 12#include <linux/timer.h> 13#include <linux/completion.h> 14#include <linux/connector.h> 15#include <linux/random.h> 16#include <linux/platform_device.h> 17#include <linux/limits.h> 18#include <linux/fb.h> 19#include <linux/io.h> 20#include <linux/mutex.h> 21#include <linux/slab.h> 22#include <video/edid.h> 23#include <video/uvesafb.h> 24#ifdef CONFIG_X86 25#include <video/vga.h> 26#endif 27#ifdef CONFIG_MTRR 28#include <asm/mtrr.h> 29#endif 30#include "edid.h" 31 32static struct cb_id uvesafb_cn_id = { 33 .idx = CN_IDX_V86D, 34 .val = CN_VAL_V86D_UVESAFB 35}; 36static char v86d_path[PATH_MAX] = "/sbin/v86d"; 37static char v86d_started; /* has v86d been started by uvesafb? */ 38 39static struct fb_fix_screeninfo uvesafb_fix = { 40 .id = "VESA VGA", 41 .type = FB_TYPE_PACKED_PIXELS, 42 .accel = FB_ACCEL_NONE, 43 .visual = FB_VISUAL_TRUECOLOR, 44}; 45 46static int mtrr = 3; /* enable mtrr by default */ 47static bool blank = 1; /* enable blanking by default */ 48static int ypan = 1; /* 0: scroll, 1: ypan, 2: ywrap */ 49static bool pmi_setpal = true; /* use PMI for palette changes */ 50static bool nocrtc; /* ignore CRTC settings */ 51static bool noedid; /* don't try DDC transfers */ 52static int vram_remap; /* set amt. of memory to be used */ 53static int vram_total; /* set total amount of memory */ 54static u16 maxclk; /* maximum pixel clock */ 55static u16 maxvf; /* maximum vertical frequency */ 56static u16 maxhf; /* maximum horizontal frequency */ 57static u16 vbemode; /* force use of a specific VBE mode */ 58static char *mode_option; 59static u8 dac_width = 6; 60 61static struct uvesafb_ktask *uvfb_tasks[UVESAFB_TASKS_MAX]; 62static DEFINE_MUTEX(uvfb_lock); 63 64/* 65 * A handler for replies from userspace. 66 * 67 * Make sure each message passes consistency checks and if it does, 68 * find the kernel part of the task struct, copy the registers and 69 * the buffer contents and then complete the task. 70 */ 71static void uvesafb_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) 72{ 73 struct uvesafb_task *utask; 74 struct uvesafb_ktask *task; 75 76 if (!capable(CAP_SYS_ADMIN)) 77 return; 78 79 if (msg->seq >= UVESAFB_TASKS_MAX) 80 return; 81 82 mutex_lock(&uvfb_lock); 83 task = uvfb_tasks[msg->seq]; 84 85 if (!task || msg->ack != task->ack) { 86 mutex_unlock(&uvfb_lock); 87 return; 88 } 89 90 utask = (struct uvesafb_task *)msg->data; 91 92 /* Sanity checks for the buffer length. */ 93 if (task->t.buf_len < utask->buf_len || 94 utask->buf_len > msg->len - sizeof(*utask)) { 95 mutex_unlock(&uvfb_lock); 96 return; 97 } 98 99 uvfb_tasks[msg->seq] = NULL; 100 mutex_unlock(&uvfb_lock); 101 102 memcpy(&task->t, utask, sizeof(*utask)); 103 104 if (task->t.buf_len && task->buf) 105 memcpy(task->buf, utask + 1, task->t.buf_len); 106 107 complete(task->done); 108 return; 109} 110 111static int uvesafb_helper_start(void) 112{ 113 char *envp[] = { 114 "HOME=/", 115 "PATH=/sbin:/bin", 116 NULL, 117 }; 118 119 char *argv[] = { 120 v86d_path, 121 NULL, 122 }; 123 124 return call_usermodehelper(v86d_path, argv, envp, UMH_WAIT_PROC); 125} 126 127/* 128 * Execute a uvesafb task. 129 * 130 * Returns 0 if the task is executed successfully. 131 * 132 * A message sent to the userspace consists of the uvesafb_task 133 * struct and (optionally) a buffer. The uvesafb_task struct is 134 * a simplified version of uvesafb_ktask (its kernel counterpart) 135 * containing only the register values, flags and the length of 136 * the buffer. 137 * 138 * Each message is assigned a sequence number (increased linearly) 139 * and a random ack number. The sequence number is used as a key 140 * for the uvfb_tasks array which holds pointers to uvesafb_ktask 141 * structs for all requests. 142 */ 143static int uvesafb_exec(struct uvesafb_ktask *task) 144{ 145 static int seq; 146 struct cn_msg *m; 147 int err; 148 int len = sizeof(task->t) + task->t.buf_len; 149 150 /* 151 * Check whether the message isn't longer than the maximum 152 * allowed by connector. 153 */ 154 if (sizeof(*m) + len > CONNECTOR_MAX_MSG_SIZE) { 155 printk(KERN_WARNING "uvesafb: message too long (%d), " 156 "can't execute task\n", (int)(sizeof(*m) + len)); 157 return -E2BIG; 158 } 159 160 m = kzalloc(sizeof(*m) + len, GFP_KERNEL); 161 if (!m) 162 return -ENOMEM; 163 164 init_completion(task->done); 165 166 memcpy(&m->id, &uvesafb_cn_id, sizeof(m->id)); 167 m->seq = seq; 168 m->len = len; 169 m->ack = random32(); 170 171 /* uvesafb_task structure */ 172 memcpy(m + 1, &task->t, sizeof(task->t)); 173 174 /* Buffer */ 175 memcpy((u8 *)(m + 1) + sizeof(task->t), task->buf, task->t.buf_len); 176 177 /* 178 * Save the message ack number so that we can find the kernel 179 * part of this task when a reply is received from userspace. 180 */ 181 task->ack = m->ack; 182 183 mutex_lock(&uvfb_lock); 184 185 /* If all slots are taken -- bail out. */ 186 if (uvfb_tasks[seq]) { 187 mutex_unlock(&uvfb_lock); 188 err = -EBUSY; 189 goto out; 190 } 191 192 /* Save a pointer to the kernel part of the task struct. */ 193 uvfb_tasks[seq] = task; 194 mutex_unlock(&uvfb_lock); 195 196 err = cn_netlink_send(m, 0, GFP_KERNEL); 197 if (err == -ESRCH) { 198 /* 199 * Try to start the userspace helper if sending 200 * the request failed the first time. 201 */ 202 err = uvesafb_helper_start(); 203 if (err) { 204 printk(KERN_ERR "uvesafb: failed to execute %s\n", 205 v86d_path); 206 printk(KERN_ERR "uvesafb: make sure that the v86d " 207 "helper is installed and executable\n"); 208 } else { 209 v86d_started = 1; 210 err = cn_netlink_send(m, 0, gfp_any()); 211 if (err == -ENOBUFS) 212 err = 0; 213 } 214 } else if (err == -ENOBUFS) 215 err = 0; 216 217 if (!err && !(task->t.flags & TF_EXIT)) 218 err = !wait_for_completion_timeout(task->done, 219 msecs_to_jiffies(UVESAFB_TIMEOUT)); 220 221 mutex_lock(&uvfb_lock); 222 uvfb_tasks[seq] = NULL; 223 mutex_unlock(&uvfb_lock); 224 225 seq++; 226 if (seq >= UVESAFB_TASKS_MAX) 227 seq = 0; 228out: 229 kfree(m); 230 return err; 231} 232 233/* 234 * Free a uvesafb_ktask struct. 235 */ 236static void uvesafb_free(struct uvesafb_ktask *task) 237{ 238 if (task) { 239 if (task->done) 240 kfree(task->done); 241 kfree(task); 242 } 243} 244 245/* 246 * Prepare a uvesafb_ktask struct to be used again. 247 */ 248static void uvesafb_reset(struct uvesafb_ktask *task) 249{ 250 struct completion *cpl = task->done; 251 252 memset(task, 0, sizeof(*task)); 253 task->done = cpl; 254} 255 256/* 257 * Allocate and prepare a uvesafb_ktask struct. 258 */ 259static struct uvesafb_ktask *uvesafb_prep(void) 260{ 261 struct uvesafb_ktask *task; 262 263 task = kzalloc(sizeof(*task), GFP_KERNEL); 264 if (task) { 265 task->done = kzalloc(sizeof(*task->done), GFP_KERNEL); 266 if (!task->done) { 267 kfree(task); 268 task = NULL; 269 } 270 } 271 return task; 272} 273 274static void uvesafb_setup_var(struct fb_var_screeninfo *var, 275 struct fb_info *info, struct vbe_mode_ib *mode) 276{ 277 struct uvesafb_par *par = info->par; 278 279 var->vmode = FB_VMODE_NONINTERLACED; 280 var->sync = FB_SYNC_VERT_HIGH_ACT; 281 282 var->xres = mode->x_res; 283 var->yres = mode->y_res; 284 var->xres_virtual = mode->x_res; 285 var->yres_virtual = (par->ypan) ? 286 info->fix.smem_len / mode->bytes_per_scan_line : 287 mode->y_res; 288 var->xoffset = 0; 289 var->yoffset = 0; 290 var->bits_per_pixel = mode->bits_per_pixel; 291 292 if (var->bits_per_pixel == 15) 293 var->bits_per_pixel = 16; 294 295 if (var->bits_per_pixel > 8) { 296 var->red.offset = mode->red_off; 297 var->red.length = mode->red_len; 298 var->green.offset = mode->green_off; 299 var->green.length = mode->green_len; 300 var->blue.offset = mode->blue_off; 301 var->blue.length = mode->blue_len; 302 var->transp.offset = mode->rsvd_off; 303 var->transp.length = mode->rsvd_len; 304 } else { 305 var->red.offset = 0; 306 var->green.offset = 0; 307 var->blue.offset = 0; 308 var->transp.offset = 0; 309 310 var->red.length = 8; 311 var->green.length = 8; 312 var->blue.length = 8; 313 var->transp.length = 0; 314 } 315} 316 317static int uvesafb_vbe_find_mode(struct uvesafb_par *par, 318 int xres, int yres, int depth, unsigned char flags) 319{ 320 int i, match = -1, h = 0, d = 0x7fffffff; 321 322 for (i = 0; i < par->vbe_modes_cnt; i++) { 323 h = abs(par->vbe_modes[i].x_res - xres) + 324 abs(par->vbe_modes[i].y_res - yres) + 325 abs(depth - par->vbe_modes[i].depth); 326 327 /* 328 * We have an exact match in terms of resolution 329 * and depth. 330 */ 331 if (h == 0) 332 return i; 333 334 if (h < d || (h == d && par->vbe_modes[i].depth > depth)) { 335 d = h; 336 match = i; 337 } 338 } 339 i = 1; 340 341 if (flags & UVESAFB_EXACT_DEPTH && 342 par->vbe_modes[match].depth != depth) 343 i = 0; 344 345 if (flags & UVESAFB_EXACT_RES && d > 24) 346 i = 0; 347 348 if (i != 0) 349 return match; 350 else 351 return -1; 352} 353 354static u8 *uvesafb_vbe_state_save(struct uvesafb_par *par) 355{ 356 struct uvesafb_ktask *task; 357 u8 *state; 358 int err; 359 360 if (!par->vbe_state_size) 361 return NULL; 362 363 state = kmalloc(par->vbe_state_size, GFP_KERNEL); 364 if (!state) 365 return ERR_PTR(-ENOMEM); 366 367 task = uvesafb_prep(); 368 if (!task) { 369 kfree(state); 370 return NULL; 371 } 372 373 task->t.regs.eax = 0x4f04; 374 task->t.regs.ecx = 0x000f; 375 task->t.regs.edx = 0x0001; 376 task->t.flags = TF_BUF_RET | TF_BUF_ESBX; 377 task->t.buf_len = par->vbe_state_size; 378 task->buf = state; 379 err = uvesafb_exec(task); 380 381 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { 382 printk(KERN_WARNING "uvesafb: VBE get state call " 383 "failed (eax=0x%x, err=%d)\n", 384 task->t.regs.eax, err); 385 kfree(state); 386 state = NULL; 387 } 388 389 uvesafb_free(task); 390 return state; 391} 392 393static void uvesafb_vbe_state_restore(struct uvesafb_par *par, u8 *state_buf) 394{ 395 struct uvesafb_ktask *task; 396 int err; 397 398 if (!state_buf) 399 return; 400 401 task = uvesafb_prep(); 402 if (!task) 403 return; 404 405 task->t.regs.eax = 0x4f04; 406 task->t.regs.ecx = 0x000f; 407 task->t.regs.edx = 0x0002; 408 task->t.buf_len = par->vbe_state_size; 409 task->t.flags = TF_BUF_ESBX; 410 task->buf = state_buf; 411 412 err = uvesafb_exec(task); 413 if (err || (task->t.regs.eax & 0xffff) != 0x004f) 414 printk(KERN_WARNING "uvesafb: VBE state restore call " 415 "failed (eax=0x%x, err=%d)\n", 416 task->t.regs.eax, err); 417 418 uvesafb_free(task); 419} 420 421static int uvesafb_vbe_getinfo(struct uvesafb_ktask *task, 422 struct uvesafb_par *par) 423{ 424 int err; 425 426 task->t.regs.eax = 0x4f00; 427 task->t.flags = TF_VBEIB; 428 task->t.buf_len = sizeof(struct vbe_ib); 429 task->buf = &par->vbe_ib; 430 strncpy(par->vbe_ib.vbe_signature, "VBE2", 4); 431 432 err = uvesafb_exec(task); 433 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { 434 printk(KERN_ERR "uvesafb: Getting VBE info block failed " 435 "(eax=0x%x, err=%d)\n", (u32)task->t.regs.eax, 436 err); 437 return -EINVAL; 438 } 439 440 if (par->vbe_ib.vbe_version < 0x0200) { 441 printk(KERN_ERR "uvesafb: Sorry, pre-VBE 2.0 cards are " 442 "not supported.\n"); 443 return -EINVAL; 444 } 445 446 if (!par->vbe_ib.mode_list_ptr) { 447 printk(KERN_ERR "uvesafb: Missing mode list!\n"); 448 return -EINVAL; 449 } 450 451 printk(KERN_INFO "uvesafb: "); 452 453 /* 454 * Convert string pointers and the mode list pointer into 455 * usable addresses. Print informational messages about the 456 * video adapter and its vendor. 457 */ 458 if (par->vbe_ib.oem_vendor_name_ptr) 459 printk("%s, ", 460 ((char *)task->buf) + par->vbe_ib.oem_vendor_name_ptr); 461 462 if (par->vbe_ib.oem_product_name_ptr) 463 printk("%s, ", 464 ((char *)task->buf) + par->vbe_ib.oem_product_name_ptr); 465 466 if (par->vbe_ib.oem_product_rev_ptr) 467 printk("%s, ", 468 ((char *)task->buf) + par->vbe_ib.oem_product_rev_ptr); 469 470 if (par->vbe_ib.oem_string_ptr) 471 printk("OEM: %s, ", 472 ((char *)task->buf) + par->vbe_ib.oem_string_ptr); 473 474 printk("VBE v%d.%d\n", ((par->vbe_ib.vbe_version & 0xff00) >> 8), 475 par->vbe_ib.vbe_version & 0xff); 476 477 return 0; 478} 479 480static int uvesafb_vbe_getmodes(struct uvesafb_ktask *task, 481 struct uvesafb_par *par) 482{ 483 int off = 0, err; 484 u16 *mode; 485 486 par->vbe_modes_cnt = 0; 487 488 /* Count available modes. */ 489 mode = (u16 *) (((u8 *)&par->vbe_ib) + par->vbe_ib.mode_list_ptr); 490 while (*mode != 0xffff) { 491 par->vbe_modes_cnt++; 492 mode++; 493 } 494 495 par->vbe_modes = kzalloc(sizeof(struct vbe_mode_ib) * 496 par->vbe_modes_cnt, GFP_KERNEL); 497 if (!par->vbe_modes) 498 return -ENOMEM; 499 500 /* Get info about all available modes. */ 501 mode = (u16 *) (((u8 *)&par->vbe_ib) + par->vbe_ib.mode_list_ptr); 502 while (*mode != 0xffff) { 503 struct vbe_mode_ib *mib; 504 505 uvesafb_reset(task); 506 task->t.regs.eax = 0x4f01; 507 task->t.regs.ecx = (u32) *mode; 508 task->t.flags = TF_BUF_RET | TF_BUF_ESDI; 509 task->t.buf_len = sizeof(struct vbe_mode_ib); 510 task->buf = par->vbe_modes + off; 511 512 err = uvesafb_exec(task); 513 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { 514 printk(KERN_WARNING "uvesafb: Getting mode info block " 515 "for mode 0x%x failed (eax=0x%x, err=%d)\n", 516 *mode, (u32)task->t.regs.eax, err); 517 mode++; 518 par->vbe_modes_cnt--; 519 continue; 520 } 521 522 mib = task->buf; 523 mib->mode_id = *mode; 524 525 /* 526 * We only want modes that are supported with the current 527 * hardware configuration, color, graphics and that have 528 * support for the LFB. 529 */ 530 if ((mib->mode_attr & VBE_MODE_MASK) == VBE_MODE_MASK && 531 mib->bits_per_pixel >= 8) 532 off++; 533 else 534 par->vbe_modes_cnt--; 535 536 mode++; 537 mib->depth = mib->red_len + mib->green_len + mib->blue_len; 538 539 /* 540 * Handle 8bpp modes and modes with broken color component 541 * lengths. 542 */ 543 if (mib->depth == 0 || (mib->depth == 24 && 544 mib->bits_per_pixel == 32)) 545 mib->depth = mib->bits_per_pixel; 546 } 547 548 if (par->vbe_modes_cnt > 0) 549 return 0; 550 else 551 return -EINVAL; 552} 553 554/* 555 * The Protected Mode Interface is 32-bit x86 code, so we only run it on 556 * x86 and not x86_64. 557 */ 558#ifdef CONFIG_X86_32 559static int uvesafb_vbe_getpmi(struct uvesafb_ktask *task, 560 struct uvesafb_par *par) 561{ 562 int i, err; 563 564 uvesafb_reset(task); 565 task->t.regs.eax = 0x4f0a; 566 task->t.regs.ebx = 0x0; 567 err = uvesafb_exec(task); 568 569 if ((task->t.regs.eax & 0xffff) != 0x4f || task->t.regs.es < 0xc000) { 570 par->pmi_setpal = par->ypan = 0; 571 } else { 572 par->pmi_base = (u16 *)phys_to_virt(((u32)task->t.regs.es << 4) 573 + task->t.regs.edi); 574 par->pmi_start = (u8 *)par->pmi_base + par->pmi_base[1]; 575 par->pmi_pal = (u8 *)par->pmi_base + par->pmi_base[2]; 576 printk(KERN_INFO "uvesafb: protected mode interface info at " 577 "%04x:%04x\n", 578 (u16)task->t.regs.es, (u16)task->t.regs.edi); 579 printk(KERN_INFO "uvesafb: pmi: set display start = %p, " 580 "set palette = %p\n", par->pmi_start, 581 par->pmi_pal); 582 583 if (par->pmi_base[3]) { 584 printk(KERN_INFO "uvesafb: pmi: ports = "); 585 for (i = par->pmi_base[3]/2; 586 par->pmi_base[i] != 0xffff; i++) 587 printk("%x ", par->pmi_base[i]); 588 printk("\n"); 589 590 if (par->pmi_base[i] != 0xffff) { 591 printk(KERN_INFO "uvesafb: can't handle memory" 592 " requests, pmi disabled\n"); 593 par->ypan = par->pmi_setpal = 0; 594 } 595 } 596 } 597 return 0; 598} 599#endif /* CONFIG_X86_32 */ 600 601/* 602 * Check whether a video mode is supported by the Video BIOS and is 603 * compatible with the monitor limits. 604 */ 605static int uvesafb_is_valid_mode(struct fb_videomode *mode, 606 struct fb_info *info) 607{ 608 if (info->monspecs.gtf) { 609 fb_videomode_to_var(&info->var, mode); 610 if (fb_validate_mode(&info->var, info)) 611 return 0; 612 } 613 614 if (uvesafb_vbe_find_mode(info->par, mode->xres, mode->yres, 8, 615 UVESAFB_EXACT_RES) == -1) 616 return 0; 617 618 return 1; 619} 620 621static int uvesafb_vbe_getedid(struct uvesafb_ktask *task, struct fb_info *info) 622{ 623 struct uvesafb_par *par = info->par; 624 int err = 0; 625 626 if (noedid || par->vbe_ib.vbe_version < 0x0300) 627 return -EINVAL; 628 629 task->t.regs.eax = 0x4f15; 630 task->t.regs.ebx = 0; 631 task->t.regs.ecx = 0; 632 task->t.buf_len = 0; 633 task->t.flags = 0; 634 635 err = uvesafb_exec(task); 636 637 if ((task->t.regs.eax & 0xffff) != 0x004f || err) 638 return -EINVAL; 639 640 if ((task->t.regs.ebx & 0x3) == 3) { 641 printk(KERN_INFO "uvesafb: VBIOS/hardware supports both " 642 "DDC1 and DDC2 transfers\n"); 643 } else if ((task->t.regs.ebx & 0x3) == 2) { 644 printk(KERN_INFO "uvesafb: VBIOS/hardware supports DDC2 " 645 "transfers\n"); 646 } else if ((task->t.regs.ebx & 0x3) == 1) { 647 printk(KERN_INFO "uvesafb: VBIOS/hardware supports DDC1 " 648 "transfers\n"); 649 } else { 650 printk(KERN_INFO "uvesafb: VBIOS/hardware doesn't support " 651 "DDC transfers\n"); 652 return -EINVAL; 653 } 654 655 task->t.regs.eax = 0x4f15; 656 task->t.regs.ebx = 1; 657 task->t.regs.ecx = task->t.regs.edx = 0; 658 task->t.flags = TF_BUF_RET | TF_BUF_ESDI; 659 task->t.buf_len = EDID_LENGTH; 660 task->buf = kzalloc(EDID_LENGTH, GFP_KERNEL); 661 if (!task->buf) 662 return -ENOMEM; 663 664 err = uvesafb_exec(task); 665 666 if ((task->t.regs.eax & 0xffff) == 0x004f && !err) { 667 fb_edid_to_monspecs(task->buf, &info->monspecs); 668 669 if (info->monspecs.vfmax && info->monspecs.hfmax) { 670 /* 671 * If the maximum pixel clock wasn't specified in 672 * the EDID block, set it to 300 MHz. 673 */ 674 if (info->monspecs.dclkmax == 0) 675 info->monspecs.dclkmax = 300 * 1000000; 676 info->monspecs.gtf = 1; 677 } 678 } else { 679 err = -EINVAL; 680 } 681 682 kfree(task->buf); 683 return err; 684} 685 686static void uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task, 687 struct fb_info *info) 688{ 689 struct uvesafb_par *par = info->par; 690 int i; 691 692 memset(&info->monspecs, 0, sizeof(info->monspecs)); 693 694 /* 695 * If we don't get all necessary data from the EDID block, 696 * mark it as incompatible with the GTF and set nocrtc so 697 * that we always use the default BIOS refresh rate. 698 */ 699 if (uvesafb_vbe_getedid(task, info)) { 700 info->monspecs.gtf = 0; 701 par->nocrtc = 1; 702 } 703 704 /* Kernel command line overrides. */ 705 if (maxclk) 706 info->monspecs.dclkmax = maxclk * 1000000; 707 if (maxvf) 708 info->monspecs.vfmax = maxvf; 709 if (maxhf) 710 info->monspecs.hfmax = maxhf * 1000; 711 712 /* 713 * In case DDC transfers are not supported, the user can provide 714 * monitor limits manually. Lower limits are set to "safe" values. 715 */ 716 if (info->monspecs.gtf == 0 && maxclk && maxvf && maxhf) { 717 info->monspecs.dclkmin = 0; 718 info->monspecs.vfmin = 60; 719 info->monspecs.hfmin = 29000; 720 info->monspecs.gtf = 1; 721 par->nocrtc = 0; 722 } 723 724 if (info->monspecs.gtf) 725 printk(KERN_INFO 726 "uvesafb: monitor limits: vf = %d Hz, hf = %d kHz, " 727 "clk = %d MHz\n", info->monspecs.vfmax, 728 (int)(info->monspecs.hfmax / 1000), 729 (int)(info->monspecs.dclkmax / 1000000)); 730 else 731 printk(KERN_INFO "uvesafb: no monitor limits have been set, " 732 "default refresh rate will be used\n"); 733 734 /* Add VBE modes to the modelist. */ 735 for (i = 0; i < par->vbe_modes_cnt; i++) { 736 struct fb_var_screeninfo var; 737 struct vbe_mode_ib *mode; 738 struct fb_videomode vmode; 739 740 mode = &par->vbe_modes[i]; 741 memset(&var, 0, sizeof(var)); 742 743 var.xres = mode->x_res; 744 var.yres = mode->y_res; 745 746 fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, &var, info); 747 fb_var_to_videomode(&vmode, &var); 748 fb_add_videomode(&vmode, &info->modelist); 749 } 750 751 /* Add valid VESA modes to our modelist. */ 752 for (i = 0; i < VESA_MODEDB_SIZE; i++) { 753 if (uvesafb_is_valid_mode((struct fb_videomode *) 754 &vesa_modes[i], info)) 755 fb_add_videomode(&vesa_modes[i], &info->modelist); 756 } 757 758 for (i = 0; i < info->monspecs.modedb_len; i++) { 759 if (uvesafb_is_valid_mode(&info->monspecs.modedb[i], info)) 760 fb_add_videomode(&info->monspecs.modedb[i], 761 &info->modelist); 762 } 763 764 return; 765} 766 767static void uvesafb_vbe_getstatesize(struct uvesafb_ktask *task, 768 struct uvesafb_par *par) 769{ 770 int err; 771 772 uvesafb_reset(task); 773 774 /* 775 * Get the VBE state buffer size. We want all available 776 * hardware state data (CL = 0x0f). 777 */ 778 task->t.regs.eax = 0x4f04; 779 task->t.regs.ecx = 0x000f; 780 task->t.regs.edx = 0x0000; 781 task->t.flags = 0; 782 783 err = uvesafb_exec(task); 784 785 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { 786 printk(KERN_WARNING "uvesafb: VBE state buffer size " 787 "cannot be determined (eax=0x%x, err=%d)\n", 788 task->t.regs.eax, err); 789 par->vbe_state_size = 0; 790 return; 791 } 792 793 par->vbe_state_size = 64 * (task->t.regs.ebx & 0xffff); 794} 795 796static int uvesafb_vbe_init(struct fb_info *info) 797{ 798 struct uvesafb_ktask *task = NULL; 799 struct uvesafb_par *par = info->par; 800 int err; 801 802 task = uvesafb_prep(); 803 if (!task) 804 return -ENOMEM; 805 806 err = uvesafb_vbe_getinfo(task, par); 807 if (err) 808 goto out; 809 810 err = uvesafb_vbe_getmodes(task, par); 811 if (err) 812 goto out; 813 814 par->nocrtc = nocrtc; 815#ifdef CONFIG_X86_32 816 par->pmi_setpal = pmi_setpal; 817 par->ypan = ypan; 818 819 if (par->pmi_setpal || par->ypan) { 820 if (__supported_pte_mask & _PAGE_NX) { 821 par->pmi_setpal = par->ypan = 0; 822 printk(KERN_WARNING "uvesafb: NX protection is actively." 823 "We have better not to use the PMI.\n"); 824 } else { 825 uvesafb_vbe_getpmi(task, par); 826 } 827 } 828#else 829 /* The protected mode interface is not available on non-x86. */ 830 par->pmi_setpal = par->ypan = 0; 831#endif 832 833 INIT_LIST_HEAD(&info->modelist); 834 uvesafb_vbe_getmonspecs(task, info); 835 uvesafb_vbe_getstatesize(task, par); 836 837out: uvesafb_free(task); 838 return err; 839} 840 841static int uvesafb_vbe_init_mode(struct fb_info *info) 842{ 843 struct list_head *pos; 844 struct fb_modelist *modelist; 845 struct fb_videomode *mode; 846 struct uvesafb_par *par = info->par; 847 int i, modeid; 848 849 /* Has the user requested a specific VESA mode? */ 850 if (vbemode) { 851 for (i = 0; i < par->vbe_modes_cnt; i++) { 852 if (par->vbe_modes[i].mode_id == vbemode) { 853 modeid = i; 854 uvesafb_setup_var(&info->var, info, 855 &par->vbe_modes[modeid]); 856 fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, 857 &info->var, info); 858 /* 859 * With pixclock set to 0, the default BIOS 860 * timings will be used in set_par(). 861 */ 862 info->var.pixclock = 0; 863 goto gotmode; 864 } 865 } 866 printk(KERN_INFO "uvesafb: requested VBE mode 0x%x is " 867 "unavailable\n", vbemode); 868 vbemode = 0; 869 } 870 871 /* Count the modes in the modelist */ 872 i = 0; 873 list_for_each(pos, &info->modelist) 874 i++; 875 876 /* 877 * Convert the modelist into a modedb so that we can use it with 878 * fb_find_mode(). 879 */ 880 mode = kzalloc(i * sizeof(*mode), GFP_KERNEL); 881 if (mode) { 882 i = 0; 883 list_for_each(pos, &info->modelist) { 884 modelist = list_entry(pos, struct fb_modelist, list); 885 mode[i] = modelist->mode; 886 i++; 887 } 888 889 if (!mode_option) 890 mode_option = UVESAFB_DEFAULT_MODE; 891 892 i = fb_find_mode(&info->var, info, mode_option, mode, i, 893 NULL, 8); 894 895 kfree(mode); 896 } 897 898 /* fb_find_mode() failed */ 899 if (i == 0) { 900 info->var.xres = 640; 901 info->var.yres = 480; 902 mode = (struct fb_videomode *) 903 fb_find_best_mode(&info->var, &info->modelist); 904 905 if (mode) { 906 fb_videomode_to_var(&info->var, mode); 907 } else { 908 modeid = par->vbe_modes[0].mode_id; 909 uvesafb_setup_var(&info->var, info, 910 &par->vbe_modes[modeid]); 911 fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, 912 &info->var, info); 913 914 goto gotmode; 915 } 916 } 917 918 /* Look for a matching VBE mode. */ 919 modeid = uvesafb_vbe_find_mode(par, info->var.xres, info->var.yres, 920 info->var.bits_per_pixel, UVESAFB_EXACT_RES); 921 922 if (modeid == -1) 923 return -EINVAL; 924 925 uvesafb_setup_var(&info->var, info, &par->vbe_modes[modeid]); 926 927gotmode: 928 /* 929 * If we are not VBE3.0+ compliant, we're done -- the BIOS will 930 * ignore our timings anyway. 931 */ 932 if (par->vbe_ib.vbe_version < 0x0300 || par->nocrtc) 933 fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, 934 &info->var, info); 935 936 return modeid; 937} 938 939static int uvesafb_setpalette(struct uvesafb_pal_entry *entries, int count, 940 int start, struct fb_info *info) 941{ 942 struct uvesafb_ktask *task; 943#ifdef CONFIG_X86 944 struct uvesafb_par *par = info->par; 945 int i = par->mode_idx; 946#endif 947 int err = 0; 948 949 /* 950 * We support palette modifications for 8 bpp modes only, so 951 * there can never be more than 256 entries. 952 */ 953 if (start + count > 256) 954 return -EINVAL; 955 956#ifdef CONFIG_X86 957 /* Use VGA registers if mode is VGA-compatible. */ 958 if (i >= 0 && i < par->vbe_modes_cnt && 959 par->vbe_modes[i].mode_attr & VBE_MODE_VGACOMPAT) { 960 for (i = 0; i < count; i++) { 961 outb_p(start + i, dac_reg); 962 outb_p(entries[i].red, dac_val); 963 outb_p(entries[i].green, dac_val); 964 outb_p(entries[i].blue, dac_val); 965 } 966 } 967#ifdef CONFIG_X86_32 968 else if (par->pmi_setpal) { 969 __asm__ __volatile__( 970 "call *(%%esi)" 971 : /* no return value */ 972 : "a" (0x4f09), /* EAX */ 973 "b" (0), /* EBX */ 974 "c" (count), /* ECX */ 975 "d" (start), /* EDX */ 976 "D" (entries), /* EDI */ 977 "S" (&par->pmi_pal)); /* ESI */ 978 } 979#endif /* CONFIG_X86_32 */ 980 else 981#endif /* CONFIG_X86 */ 982 { 983 task = uvesafb_prep(); 984 if (!task) 985 return -ENOMEM; 986 987 task->t.regs.eax = 0x4f09; 988 task->t.regs.ebx = 0x0; 989 task->t.regs.ecx = count; 990 task->t.regs.edx = start; 991 task->t.flags = TF_BUF_ESDI; 992 task->t.buf_len = sizeof(struct uvesafb_pal_entry) * count; 993 task->buf = entries; 994 995 err = uvesafb_exec(task); 996 if ((task->t.regs.eax & 0xffff) != 0x004f) 997 err = 1; 998 999 uvesafb_free(task); 1000 } 1001 return err; 1002} 1003 1004static int uvesafb_setcolreg(unsigned regno, unsigned red, unsigned green, 1005 unsigned blue, unsigned transp, 1006 struct fb_info *info) 1007{ 1008 struct uvesafb_pal_entry entry; 1009 int shift = 16 - dac_width; 1010 int err = 0; 1011 1012 if (regno >= info->cmap.len) 1013 return -EINVAL; 1014 1015 if (info->var.bits_per_pixel == 8) { 1016 entry.red = red >> shift; 1017 entry.green = green >> shift; 1018 entry.blue = blue >> shift; 1019 entry.pad = 0; 1020 1021 err = uvesafb_setpalette(&entry, 1, regno, info); 1022 } else if (regno < 16) { 1023 switch (info->var.bits_per_pixel) { 1024 case 16: 1025 if (info->var.red.offset == 10) { 1026 /* 1:5:5:5 */ 1027 ((u32 *) (info->pseudo_palette))[regno] = 1028 ((red & 0xf800) >> 1) | 1029 ((green & 0xf800) >> 6) | 1030 ((blue & 0xf800) >> 11); 1031 } else { 1032 /* 0:5:6:5 */ 1033 ((u32 *) (info->pseudo_palette))[regno] = 1034 ((red & 0xf800) ) | 1035 ((green & 0xfc00) >> 5) | 1036 ((blue & 0xf800) >> 11); 1037 } 1038 break; 1039 1040 case 24: 1041 case 32: 1042 red >>= 8; 1043 green >>= 8; 1044 blue >>= 8; 1045 ((u32 *)(info->pseudo_palette))[regno] = 1046 (red << info->var.red.offset) | 1047 (green << info->var.green.offset) | 1048 (blue << info->var.blue.offset); 1049 break; 1050 } 1051 } 1052 return err; 1053} 1054 1055static int uvesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info) 1056{ 1057 struct uvesafb_pal_entry *entries; 1058 int shift = 16 - dac_width; 1059 int i, err = 0; 1060 1061 if (info->var.bits_per_pixel == 8) { 1062 if (cmap->start + cmap->len > info->cmap.start + 1063 info->cmap.len || cmap->start < info->cmap.start) 1064 return -EINVAL; 1065 1066 entries = kmalloc(sizeof(*entries) * cmap->len, GFP_KERNEL); 1067 if (!entries) 1068 return -ENOMEM; 1069 1070 for (i = 0; i < cmap->len; i++) { 1071 entries[i].red = cmap->red[i] >> shift; 1072 entries[i].green = cmap->green[i] >> shift; 1073 entries[i].blue = cmap->blue[i] >> shift; 1074 entries[i].pad = 0; 1075 } 1076 err = uvesafb_setpalette(entries, cmap->len, cmap->start, info); 1077 kfree(entries); 1078 } else { 1079 /* 1080 * For modes with bpp > 8, we only set the pseudo palette in 1081 * the fb_info struct. We rely on uvesafb_setcolreg to do all 1082 * sanity checking. 1083 */ 1084 for (i = 0; i < cmap->len; i++) { 1085 err |= uvesafb_setcolreg(cmap->start + i, cmap->red[i], 1086 cmap->green[i], cmap->blue[i], 1087 0, info); 1088 } 1089 } 1090 return err; 1091} 1092 1093static int uvesafb_pan_display(struct fb_var_screeninfo *var, 1094 struct fb_info *info) 1095{ 1096#ifdef CONFIG_X86_32 1097 int offset; 1098 struct uvesafb_par *par = info->par; 1099 1100 offset = (var->yoffset * info->fix.line_length + var->xoffset) / 4; 1101 1102 /* 1103 * It turns out it's not the best idea to do panning via vm86, 1104 * so we only allow it if we have a PMI. 1105 */ 1106 if (par->pmi_start) { 1107 __asm__ __volatile__( 1108 "call *(%%edi)" 1109 : /* no return value */ 1110 : "a" (0x4f07), /* EAX */ 1111 "b" (0), /* EBX */ 1112 "c" (offset), /* ECX */ 1113 "d" (offset >> 16), /* EDX */ 1114 "D" (&par->pmi_start)); /* EDI */ 1115 } 1116#endif 1117 return 0; 1118} 1119 1120static int uvesafb_blank(int blank, struct fb_info *info) 1121{ 1122 struct uvesafb_ktask *task; 1123 int err = 1; 1124#ifdef CONFIG_X86 1125 struct uvesafb_par *par = info->par; 1126 1127 if (par->vbe_ib.capabilities & VBE_CAP_VGACOMPAT) { 1128 int loop = 10000; 1129 u8 seq = 0, crtc17 = 0; 1130 1131 if (blank == FB_BLANK_POWERDOWN) { 1132 seq = 0x20; 1133 crtc17 = 0x00; 1134 err = 0; 1135 } else { 1136 seq = 0x00; 1137 crtc17 = 0x80; 1138 err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL; 1139 } 1140 1141 vga_wseq(NULL, 0x00, 0x01); 1142 seq |= vga_rseq(NULL, 0x01) & ~0x20; 1143 vga_wseq(NULL, 0x00, seq); 1144 1145 crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80; 1146 while (loop--); 1147 vga_wcrt(NULL, 0x17, crtc17); 1148 vga_wseq(NULL, 0x00, 0x03); 1149 } else 1150#endif /* CONFIG_X86 */ 1151 { 1152 task = uvesafb_prep(); 1153 if (!task) 1154 return -ENOMEM; 1155 1156 task->t.regs.eax = 0x4f10; 1157 switch (blank) { 1158 case FB_BLANK_UNBLANK: 1159 task->t.regs.ebx = 0x0001; 1160 break; 1161 case FB_BLANK_NORMAL: 1162 task->t.regs.ebx = 0x0101; /* standby */ 1163 break; 1164 case FB_BLANK_POWERDOWN: 1165 task->t.regs.ebx = 0x0401; /* powerdown */ 1166 break; 1167 default: 1168 goto out; 1169 } 1170 1171 err = uvesafb_exec(task); 1172 if (err || (task->t.regs.eax & 0xffff) != 0x004f) 1173 err = 1; 1174out: uvesafb_free(task); 1175 } 1176 return err; 1177} 1178 1179static int uvesafb_open(struct fb_info *info, int user) 1180{ 1181 struct uvesafb_par *par = info->par; 1182 int cnt = atomic_read(&par->ref_count); 1183 u8 *buf = NULL; 1184 1185 if (!cnt && par->vbe_state_size) { 1186 buf = uvesafb_vbe_state_save(par); 1187 if (IS_ERR(buf)) { 1188 printk(KERN_WARNING "uvesafb: save hardware state" 1189 "failed, error code is %ld!\n", PTR_ERR(buf)); 1190 } else { 1191 par->vbe_state_orig = buf; 1192 } 1193 } 1194 1195 atomic_inc(&par->ref_count); 1196 return 0; 1197} 1198 1199static int uvesafb_release(struct fb_info *info, int user) 1200{ 1201 struct uvesafb_ktask *task = NULL; 1202 struct uvesafb_par *par = info->par; 1203 int cnt = atomic_read(&par->ref_count); 1204 1205 if (!cnt) 1206 return -EINVAL; 1207 1208 if (cnt != 1) 1209 goto out; 1210 1211 task = uvesafb_prep(); 1212 if (!task) 1213 goto out; 1214 1215 /* First, try to set the standard 80x25 text mode. */ 1216 task->t.regs.eax = 0x0003; 1217 uvesafb_exec(task); 1218 1219 /* 1220 * Now try to restore whatever hardware state we might have 1221 * saved when the fb device was first opened. 1222 */ 1223 uvesafb_vbe_state_restore(par, par->vbe_state_orig); 1224out: 1225 atomic_dec(&par->ref_count); 1226 if (task) 1227 uvesafb_free(task); 1228 return 0; 1229} 1230 1231static int uvesafb_set_par(struct fb_info *info) 1232{ 1233 struct uvesafb_par *par = info->par; 1234 struct uvesafb_ktask *task = NULL; 1235 struct vbe_crtc_ib *crtc = NULL; 1236 struct vbe_mode_ib *mode = NULL; 1237 int i, err = 0, depth = info->var.bits_per_pixel; 1238 1239 if (depth > 8 && depth != 32) 1240 depth = info->var.red.length + info->var.green.length + 1241 info->var.blue.length; 1242 1243 i = uvesafb_vbe_find_mode(par, info->var.xres, info->var.yres, depth, 1244 UVESAFB_EXACT_RES | UVESAFB_EXACT_DEPTH); 1245 if (i >= 0) 1246 mode = &par->vbe_modes[i]; 1247 else 1248 return -EINVAL; 1249 1250 task = uvesafb_prep(); 1251 if (!task) 1252 return -ENOMEM; 1253setmode: 1254 task->t.regs.eax = 0x4f02; 1255 task->t.regs.ebx = mode->mode_id | 0x4000; /* use LFB */ 1256 1257 if (par->vbe_ib.vbe_version >= 0x0300 && !par->nocrtc && 1258 info->var.pixclock != 0) { 1259 task->t.regs.ebx |= 0x0800; /* use CRTC data */ 1260 task->t.flags = TF_BUF_ESDI; 1261 crtc = kzalloc(sizeof(struct vbe_crtc_ib), GFP_KERNEL); 1262 if (!crtc) { 1263 err = -ENOMEM; 1264 goto out; 1265 } 1266 crtc->horiz_start = info->var.xres + info->var.right_margin; 1267 crtc->horiz_end = crtc->horiz_start + info->var.hsync_len; 1268 crtc->horiz_total = crtc->horiz_end + info->var.left_margin; 1269 1270 crtc->vert_start = info->var.yres + info->var.lower_margin; 1271 crtc->vert_end = crtc->vert_start + info->var.vsync_len; 1272 crtc->vert_total = crtc->vert_end + info->var.upper_margin; 1273 1274 crtc->pixel_clock = PICOS2KHZ(info->var.pixclock) * 1000; 1275 crtc->refresh_rate = (u16)(100 * (crtc->pixel_clock / 1276 (crtc->vert_total * crtc->horiz_total))); 1277 1278 if (info->var.vmode & FB_VMODE_DOUBLE) 1279 crtc->flags |= 0x1; 1280 if (info->var.vmode & FB_VMODE_INTERLACED) 1281 crtc->flags |= 0x2; 1282 if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT)) 1283 crtc->flags |= 0x4; 1284 if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT)) 1285 crtc->flags |= 0x8; 1286 memcpy(&par->crtc, crtc, sizeof(*crtc)); 1287 } else { 1288 memset(&par->crtc, 0, sizeof(*crtc)); 1289 } 1290 1291 task->t.buf_len = sizeof(struct vbe_crtc_ib); 1292 task->buf = &par->crtc; 1293 1294 err = uvesafb_exec(task); 1295 if (err || (task->t.regs.eax & 0xffff) != 0x004f) { 1296 /* 1297 * The mode switch might have failed because we tried to 1298 * use our own timings. Try again with the default timings. 1299 */ 1300 if (crtc != NULL) { 1301 printk(KERN_WARNING "uvesafb: mode switch failed " 1302 "(eax=0x%x, err=%d). Trying again with " 1303 "default timings.\n", task->t.regs.eax, err); 1304 uvesafb_reset(task); 1305 kfree(crtc); 1306 crtc = NULL; 1307 info->var.pixclock = 0; 1308 goto setmode; 1309 } else { 1310 printk(KERN_ERR "uvesafb: mode switch failed (eax=" 1311 "0x%x, err=%d)\n", task->t.regs.eax, err); 1312 err = -EINVAL; 1313 goto out; 1314 } 1315 } 1316 par->mode_idx = i; 1317 1318 /* For 8bpp modes, always try to set the DAC to 8 bits. */ 1319 if (par->vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC && 1320 mode->bits_per_pixel <= 8) { 1321 uvesafb_reset(task); 1322 task->t.regs.eax = 0x4f08; 1323 task->t.regs.ebx = 0x0800; 1324 1325 err = uvesafb_exec(task); 1326 if (err || (task->t.regs.eax & 0xffff) != 0x004f || 1327 ((task->t.regs.ebx & 0xff00) >> 8) != 8) { 1328 dac_width = 6; 1329 } else { 1330 dac_width = 8; 1331 } 1332 } 1333 1334 info->fix.visual = (info->var.bits_per_pixel == 8) ? 1335 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; 1336 info->fix.line_length = mode->bytes_per_scan_line; 1337 1338out: if (crtc != NULL) 1339 kfree(crtc); 1340 uvesafb_free(task); 1341 1342 return err; 1343} 1344 1345static void uvesafb_check_limits(struct fb_var_screeninfo *var, 1346 struct fb_info *info) 1347{ 1348 const struct fb_videomode *mode; 1349 struct uvesafb_par *par = info->par; 1350 1351 /* 1352 * If pixclock is set to 0, then we're using default BIOS timings 1353 * and thus don't have to perform any checks here. 1354 */ 1355 if (!var->pixclock) 1356 return; 1357 1358 if (par->vbe_ib.vbe_version < 0x0300) { 1359 fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, var, info); 1360 return; 1361 } 1362 1363 if (!fb_validate_mode(var, info)) 1364 return; 1365 1366 mode = fb_find_best_mode(var, &info->modelist); 1367 if (mode) { 1368 if (mode->xres == var->xres && mode->yres == var->yres && 1369 !(mode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))) { 1370 fb_videomode_to_var(var, mode); 1371 return; 1372 } 1373 } 1374 1375 if (info->monspecs.gtf && !fb_get_mode(FB_MAXTIMINGS, 0, var, info)) 1376 return; 1377 /* Use default refresh rate */ 1378 var->pixclock = 0; 1379} 1380 1381static int uvesafb_check_var(struct fb_var_screeninfo *var, 1382 struct fb_info *info) 1383{ 1384 struct uvesafb_par *par = info->par; 1385 struct vbe_mode_ib *mode = NULL; 1386 int match = -1; 1387 int depth = var->red.length + var->green.length + var->blue.length; 1388 1389 /* 1390 * Various apps will use bits_per_pixel to set the color depth, 1391 * which is theoretically incorrect, but which we'll try to handle 1392 * here. 1393 */ 1394 if (depth == 0 || abs(depth - var->bits_per_pixel) >= 8) 1395 depth = var->bits_per_pixel; 1396 1397 match = uvesafb_vbe_find_mode(par, var->xres, var->yres, depth, 1398 UVESAFB_EXACT_RES); 1399 if (match == -1) 1400 return -EINVAL; 1401 1402 mode = &par->vbe_modes[match]; 1403 uvesafb_setup_var(var, info, mode); 1404 1405 /* 1406 * Check whether we have remapped enough memory for this mode. 1407 * We might be called at an early stage, when we haven't remapped 1408 * any memory yet, in which case we simply skip the check. 1409 */ 1410 if (var->yres * mode->bytes_per_scan_line > info->fix.smem_len 1411 && info->fix.smem_len) 1412 return -EINVAL; 1413 1414 if ((var->vmode & FB_VMODE_DOUBLE) && 1415 !(par->vbe_modes[match].mode_attr & 0x100)) 1416 var->vmode &= ~FB_VMODE_DOUBLE; 1417 1418 if ((var->vmode & FB_VMODE_INTERLACED) && 1419 !(par->vbe_modes[match].mode_attr & 0x200)) 1420 var->vmode &= ~FB_VMODE_INTERLACED; 1421 1422 uvesafb_check_limits(var, info); 1423 1424 var->xres_virtual = var->xres; 1425 var->yres_virtual = (par->ypan) ? 1426 info->fix.smem_len / mode->bytes_per_scan_line : 1427 var->yres; 1428 return 0; 1429} 1430 1431static struct fb_ops uvesafb_ops = { 1432 .owner = THIS_MODULE, 1433 .fb_open = uvesafb_open, 1434 .fb_release = uvesafb_release, 1435 .fb_setcolreg = uvesafb_setcolreg, 1436 .fb_setcmap = uvesafb_setcmap, 1437 .fb_pan_display = uvesafb_pan_display, 1438 .fb_blank = uvesafb_blank, 1439 .fb_fillrect = cfb_fillrect, 1440 .fb_copyarea = cfb_copyarea, 1441 .fb_imageblit = cfb_imageblit, 1442 .fb_check_var = uvesafb_check_var, 1443 .fb_set_par = uvesafb_set_par, 1444}; 1445 1446static void uvesafb_init_info(struct fb_info *info, struct vbe_mode_ib *mode) 1447{ 1448 unsigned int size_vmode; 1449 unsigned int size_remap; 1450 unsigned int size_total; 1451 struct uvesafb_par *par = info->par; 1452 int i, h; 1453 1454 info->pseudo_palette = ((u8 *)info->par + sizeof(struct uvesafb_par)); 1455 info->fix = uvesafb_fix; 1456 info->fix.ypanstep = par->ypan ? 1 : 0; 1457 info->fix.ywrapstep = (par->ypan > 1) ? 1 : 0; 1458 1459 /* Disable blanking if the user requested so. */ 1460 if (!blank) 1461 info->fbops->fb_blank = NULL; 1462 1463 /* 1464 * Find out how much IO memory is required for the mode with 1465 * the highest resolution. 1466 */ 1467 size_remap = 0; 1468 for (i = 0; i < par->vbe_modes_cnt; i++) { 1469 h = par->vbe_modes[i].bytes_per_scan_line * 1470 par->vbe_modes[i].y_res; 1471 if (h > size_remap) 1472 size_remap = h; 1473 } 1474 size_remap *= 2; 1475 1476 /* 1477 * size_vmode -- that is the amount of memory needed for the 1478 * used video mode, i.e. the minimum amount of 1479 * memory we need. 1480 */ 1481 if (mode != NULL) { 1482 size_vmode = info->var.yres * mode->bytes_per_scan_line; 1483 } else { 1484 size_vmode = info->var.yres * info->var.xres * 1485 ((info->var.bits_per_pixel + 7) >> 3); 1486 } 1487 1488 /* 1489 * size_total -- all video memory we have. Used for mtrr 1490 * entries, resource allocation and bounds 1491 * checking. 1492 */ 1493 size_total = par->vbe_ib.total_memory * 65536; 1494 if (vram_total) 1495 size_total = vram_total * 1024 * 1024; 1496 if (size_total < size_vmode) 1497 size_total = size_vmode; 1498 1499 /* 1500 * size_remap -- the amount of video memory we are going to 1501 * use for vesafb. With modern cards it is no 1502 * option to simply use size_total as th 1503 * wastes plenty of kernel address space. 1504 */ 1505 if (vram_remap) 1506 size_remap = vram_remap * 1024 * 1024; 1507 if (size_remap < size_vmode) 1508 size_remap = size_vmode; 1509 if (size_remap > size_total) 1510 size_remap = size_total; 1511 1512 info->fix.smem_len = size_remap; 1513 info->fix.smem_start = mode->phys_base_ptr; 1514 1515 /* 1516 * We have to set yres_virtual here because when setup_var() was 1517 * called, smem_len wasn't defined yet. 1518 */ 1519 info->var.yres_virtual = info->fix.smem_len / 1520 mode->bytes_per_scan_line; 1521 1522 if (par->ypan && info->var.yres_virtual > info->var.yres) { 1523 printk(KERN_INFO "uvesafb: scrolling: %s " 1524 "using protected mode interface, " 1525 "yres_virtual=%d\n", 1526 (par->ypan > 1) ? "ywrap" : "ypan", 1527 info->var.yres_virtual); 1528 } else { 1529 printk(KERN_INFO "uvesafb: scrolling: redraw\n"); 1530 info->var.yres_virtual = info->var.yres; 1531 par->ypan = 0; 1532 } 1533 1534 info->flags = FBINFO_FLAG_DEFAULT | 1535 (par->ypan ? FBINFO_HWACCEL_YPAN : 0); 1536 1537 if (!par->ypan) 1538 info->fbops->fb_pan_display = NULL; 1539} 1540 1541static void uvesafb_init_mtrr(struct fb_info *info) 1542{ 1543#ifdef CONFIG_MTRR 1544 if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) { 1545 int temp_size = info->fix.smem_len; 1546 unsigned int type = 0; 1547 1548 switch (mtrr) { 1549 case 1: 1550 type = MTRR_TYPE_UNCACHABLE; 1551 break; 1552 case 2: 1553 type = MTRR_TYPE_WRBACK; 1554 break; 1555 case 3: 1556 type = MTRR_TYPE_WRCOMB; 1557 break; 1558 case 4: 1559 type = MTRR_TYPE_WRTHROUGH; 1560 break; 1561 default: 1562 type = 0; 1563 break; 1564 } 1565 1566 if (type) { 1567 int rc; 1568 1569 /* Find the largest power-of-two */ 1570 temp_size = roundup_pow_of_two(temp_size); 1571 1572 /* Try and find a power of two to add */ 1573 do { 1574 rc = mtrr_add(info->fix.smem_start, 1575 temp_size, type, 1); 1576 temp_size >>= 1; 1577 } while (temp_size >= PAGE_SIZE && rc == -EINVAL); 1578 } 1579 } 1580#endif /* CONFIG_MTRR */ 1581} 1582 1583static void uvesafb_ioremap(struct fb_info *info) 1584{ 1585#ifdef CONFIG_X86 1586 switch (mtrr) { 1587 case 1: /* uncachable */ 1588 info->screen_base = ioremap_nocache(info->fix.smem_start, info->fix.smem_len); 1589 break; 1590 case 2: /* write-back */ 1591 info->screen_base = ioremap_cache(info->fix.smem_start, info->fix.smem_len); 1592 break; 1593 case 3: /* write-combining */ 1594 info->screen_base = ioremap_wc(info->fix.smem_start, info->fix.smem_len); 1595 break; 1596 case 4: /* write-through */ 1597 default: 1598 info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); 1599 break; 1600 } 1601#else 1602 info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); 1603#endif /* CONFIG_X86 */ 1604} 1605 1606static ssize_t uvesafb_show_vbe_ver(struct device *dev, 1607 struct device_attribute *attr, char *buf) 1608{ 1609 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1610 struct uvesafb_par *par = info->par; 1611 1612 return snprintf(buf, PAGE_SIZE, "%.4x\n", par->vbe_ib.vbe_version); 1613} 1614 1615static DEVICE_ATTR(vbe_version, S_IRUGO, uvesafb_show_vbe_ver, NULL); 1616 1617static ssize_t uvesafb_show_vbe_modes(struct device *dev, 1618 struct device_attribute *attr, char *buf) 1619{ 1620 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1621 struct uvesafb_par *par = info->par; 1622 int ret = 0, i; 1623 1624 for (i = 0; i < par->vbe_modes_cnt && ret < PAGE_SIZE; i++) { 1625 ret += snprintf(buf + ret, PAGE_SIZE - ret, 1626 "%dx%d-%d, 0x%.4x\n", 1627 par->vbe_modes[i].x_res, par->vbe_modes[i].y_res, 1628 par->vbe_modes[i].depth, par->vbe_modes[i].mode_id); 1629 } 1630 1631 return ret; 1632} 1633 1634static DEVICE_ATTR(vbe_modes, S_IRUGO, uvesafb_show_vbe_modes, NULL); 1635 1636static ssize_t uvesafb_show_vendor(struct device *dev, 1637 struct device_attribute *attr, char *buf) 1638{ 1639 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1640 struct uvesafb_par *par = info->par; 1641 1642 if (par->vbe_ib.oem_vendor_name_ptr) 1643 return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1644 (&par->vbe_ib) + par->vbe_ib.oem_vendor_name_ptr); 1645 else 1646 return 0; 1647} 1648 1649static DEVICE_ATTR(oem_vendor, S_IRUGO, uvesafb_show_vendor, NULL); 1650 1651static ssize_t uvesafb_show_product_name(struct device *dev, 1652 struct device_attribute *attr, char *buf) 1653{ 1654 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1655 struct uvesafb_par *par = info->par; 1656 1657 if (par->vbe_ib.oem_product_name_ptr) 1658 return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1659 (&par->vbe_ib) + par->vbe_ib.oem_product_name_ptr); 1660 else 1661 return 0; 1662} 1663 1664static DEVICE_ATTR(oem_product_name, S_IRUGO, uvesafb_show_product_name, NULL); 1665 1666static ssize_t uvesafb_show_product_rev(struct device *dev, 1667 struct device_attribute *attr, char *buf) 1668{ 1669 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1670 struct uvesafb_par *par = info->par; 1671 1672 if (par->vbe_ib.oem_product_rev_ptr) 1673 return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1674 (&par->vbe_ib) + par->vbe_ib.oem_product_rev_ptr); 1675 else 1676 return 0; 1677} 1678 1679static DEVICE_ATTR(oem_product_rev, S_IRUGO, uvesafb_show_product_rev, NULL); 1680 1681static ssize_t uvesafb_show_oem_string(struct device *dev, 1682 struct device_attribute *attr, char *buf) 1683{ 1684 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1685 struct uvesafb_par *par = info->par; 1686 1687 if (par->vbe_ib.oem_string_ptr) 1688 return snprintf(buf, PAGE_SIZE, "%s\n", 1689 (char *)(&par->vbe_ib) + par->vbe_ib.oem_string_ptr); 1690 else 1691 return 0; 1692} 1693 1694static DEVICE_ATTR(oem_string, S_IRUGO, uvesafb_show_oem_string, NULL); 1695 1696static ssize_t uvesafb_show_nocrtc(struct device *dev, 1697 struct device_attribute *attr, char *buf) 1698{ 1699 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1700 struct uvesafb_par *par = info->par; 1701 1702 return snprintf(buf, PAGE_SIZE, "%d\n", par->nocrtc); 1703} 1704 1705static ssize_t uvesafb_store_nocrtc(struct device *dev, 1706 struct device_attribute *attr, const char *buf, size_t count) 1707{ 1708 struct fb_info *info = platform_get_drvdata(to_platform_device(dev)); 1709 struct uvesafb_par *par = info->par; 1710 1711 if (count > 0) { 1712 if (buf[0] == '0') 1713 par->nocrtc = 0; 1714 else 1715 par->nocrtc = 1; 1716 } 1717 return count; 1718} 1719 1720static DEVICE_ATTR(nocrtc, S_IRUGO | S_IWUSR, uvesafb_show_nocrtc, 1721 uvesafb_store_nocrtc); 1722 1723static struct attribute *uvesafb_dev_attrs[] = { 1724 &dev_attr_vbe_version.attr, 1725 &dev_attr_vbe_modes.attr, 1726 &dev_attr_oem_vendor.attr, 1727 &dev_attr_oem_product_name.attr, 1728 &dev_attr_oem_product_rev.attr, 1729 &dev_attr_oem_string.attr, 1730 &dev_attr_nocrtc.attr, 1731 NULL, 1732}; 1733 1734static struct attribute_group uvesafb_dev_attgrp = { 1735 .name = NULL, 1736 .attrs = uvesafb_dev_attrs, 1737}; 1738 1739static int uvesafb_probe(struct platform_device *dev) 1740{ 1741 struct fb_info *info; 1742 struct vbe_mode_ib *mode = NULL; 1743 struct uvesafb_par *par; 1744 int err = 0, i; 1745 1746 info = framebuffer_alloc(sizeof(*par) + sizeof(u32) * 256, &dev->dev); 1747 if (!info) 1748 return -ENOMEM; 1749 1750 par = info->par; 1751 1752 err = uvesafb_vbe_init(info); 1753 if (err) { 1754 printk(KERN_ERR "uvesafb: vbe_init() failed with %d\n", err); 1755 goto out; 1756 } 1757 1758 info->fbops = &uvesafb_ops; 1759 1760 i = uvesafb_vbe_init_mode(info); 1761 if (i < 0) { 1762 err = -EINVAL; 1763 goto out; 1764 } else { 1765 mode = &par->vbe_modes[i]; 1766 } 1767 1768 if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { 1769 err = -ENXIO; 1770 goto out; 1771 } 1772 1773 uvesafb_init_info(info, mode); 1774 1775 if (!request_region(0x3c0, 32, "uvesafb")) { 1776 printk(KERN_ERR "uvesafb: request region 0x3c0-0x3e0 failed\n"); 1777 err = -EIO; 1778 goto out_mode; 1779 } 1780 1781 if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, 1782 "uvesafb")) { 1783 printk(KERN_ERR "uvesafb: cannot reserve video memory at " 1784 "0x%lx\n", info->fix.smem_start); 1785 err = -EIO; 1786 goto out_reg; 1787 } 1788 1789 uvesafb_init_mtrr(info); 1790 uvesafb_ioremap(info); 1791 1792 if (!info->screen_base) { 1793 printk(KERN_ERR 1794 "uvesafb: abort, cannot ioremap 0x%x bytes of video " 1795 "memory at 0x%lx\n", 1796 info->fix.smem_len, info->fix.smem_start); 1797 err = -EIO; 1798 goto out_mem; 1799 } 1800 1801 platform_set_drvdata(dev, info); 1802 1803 if (register_framebuffer(info) < 0) { 1804 printk(KERN_ERR 1805 "uvesafb: failed to register framebuffer device\n"); 1806 err = -EINVAL; 1807 goto out_unmap; 1808 } 1809 1810 printk(KERN_INFO "uvesafb: framebuffer at 0x%lx, mapped to 0x%p, " 1811 "using %dk, total %dk\n", info->fix.smem_start, 1812 info->screen_base, info->fix.smem_len/1024, 1813 par->vbe_ib.total_memory * 64); 1814 printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, 1815 info->fix.id); 1816 1817 err = sysfs_create_group(&dev->dev.kobj, &uvesafb_dev_attgrp); 1818 if (err != 0) 1819 printk(KERN_WARNING "fb%d: failed to register attributes\n", 1820 info->node); 1821 1822 return 0; 1823 1824out_unmap: 1825 iounmap(info->screen_base); 1826out_mem: 1827 release_mem_region(info->fix.smem_start, info->fix.smem_len); 1828out_reg: 1829 release_region(0x3c0, 32); 1830out_mode: 1831 if (!list_empty(&info->modelist)) 1832 fb_destroy_modelist(&info->modelist); 1833 fb_destroy_modedb(info->monspecs.modedb); 1834 fb_dealloc_cmap(&info->cmap); 1835out: 1836 if (par->vbe_modes) 1837 kfree(par->vbe_modes); 1838 1839 framebuffer_release(info); 1840 return err; 1841} 1842 1843static int uvesafb_remove(struct platform_device *dev) 1844{ 1845 struct fb_info *info = platform_get_drvdata(dev); 1846 1847 if (info) { 1848 struct uvesafb_par *par = info->par; 1849 1850 sysfs_remove_group(&dev->dev.kobj, &uvesafb_dev_attgrp); 1851 unregister_framebuffer(info); 1852 release_region(0x3c0, 32); 1853 iounmap(info->screen_base); 1854 release_mem_region(info->fix.smem_start, info->fix.smem_len); 1855 fb_destroy_modedb(info->monspecs.modedb); 1856 fb_dealloc_cmap(&info->cmap); 1857 1858 if (par) { 1859 if (par->vbe_modes) 1860 kfree(par->vbe_modes); 1861 if (par->vbe_state_orig) 1862 kfree(par->vbe_state_orig); 1863 if (par->vbe_state_saved) 1864 kfree(par->vbe_state_saved); 1865 } 1866 1867 framebuffer_release(info); 1868 } 1869 return 0; 1870} 1871 1872static struct platform_driver uvesafb_driver = { 1873 .probe = uvesafb_probe, 1874 .remove = uvesafb_remove, 1875 .driver = { 1876 .name = "uvesafb", 1877 }, 1878}; 1879 1880static struct platform_device *uvesafb_device; 1881 1882#ifndef MODULE 1883static int uvesafb_setup(char *options) 1884{ 1885 char *this_opt; 1886 1887 if (!options || !*options) 1888 return 0; 1889 1890 while ((this_opt = strsep(&options, ",")) != NULL) { 1891 if (!*this_opt) continue; 1892 1893 if (!strcmp(this_opt, "redraw")) 1894 ypan = 0; 1895 else if (!strcmp(this_opt, "ypan")) 1896 ypan = 1; 1897 else if (!strcmp(this_opt, "ywrap")) 1898 ypan = 2; 1899 else if (!strcmp(this_opt, "vgapal")) 1900 pmi_setpal = 0; 1901 else if (!strcmp(this_opt, "pmipal")) 1902 pmi_setpal = 1; 1903 else if (!strncmp(this_opt, "mtrr:", 5)) 1904 mtrr = simple_strtoul(this_opt+5, NULL, 0); 1905 else if (!strcmp(this_opt, "nomtrr")) 1906 mtrr = 0; 1907 else if (!strcmp(this_opt, "nocrtc")) 1908 nocrtc = 1; 1909 else if (!strcmp(this_opt, "noedid")) 1910 noedid = 1; 1911 else if (!strcmp(this_opt, "noblank")) 1912 blank = 0; 1913 else if (!strncmp(this_opt, "vtotal:", 7)) 1914 vram_total = simple_strtoul(this_opt + 7, NULL, 0); 1915 else if (!strncmp(this_opt, "vremap:", 7)) 1916 vram_remap = simple_strtoul(this_opt + 7, NULL, 0); 1917 else if (!strncmp(this_opt, "maxhf:", 6)) 1918 maxhf = simple_strtoul(this_opt + 6, NULL, 0); 1919 else if (!strncmp(this_opt, "maxvf:", 6)) 1920 maxvf = simple_strtoul(this_opt + 6, NULL, 0); 1921 else if (!strncmp(this_opt, "maxclk:", 7)) 1922 maxclk = simple_strtoul(this_opt + 7, NULL, 0); 1923 else if (!strncmp(this_opt, "vbemode:", 8)) 1924 vbemode = simple_strtoul(this_opt + 8, NULL, 0); 1925 else if (this_opt[0] >= '0' && this_opt[0] <= '9') { 1926 mode_option = this_opt; 1927 } else { 1928 printk(KERN_WARNING 1929 "uvesafb: unrecognized option %s\n", this_opt); 1930 } 1931 } 1932 1933 return 0; 1934} 1935#endif /* !MODULE */ 1936 1937static ssize_t show_v86d(struct device_driver *dev, char *buf) 1938{ 1939 return snprintf(buf, PAGE_SIZE, "%s\n", v86d_path); 1940} 1941 1942static ssize_t store_v86d(struct device_driver *dev, const char *buf, 1943 size_t count) 1944{ 1945 strncpy(v86d_path, buf, PATH_MAX); 1946 return count; 1947} 1948 1949static DRIVER_ATTR(v86d, S_IRUGO | S_IWUSR, show_v86d, store_v86d); 1950 1951static int uvesafb_init(void) 1952{ 1953 int err; 1954 1955#ifndef MODULE 1956 char *option = NULL; 1957 1958 if (fb_get_options("uvesafb", &option)) 1959 return -ENODEV; 1960 uvesafb_setup(option); 1961#endif 1962 err = cn_add_callback(&uvesafb_cn_id, "uvesafb", uvesafb_cn_callback); 1963 if (err) 1964 return err; 1965 1966 err = platform_driver_register(&uvesafb_driver); 1967 1968 if (!err) { 1969 uvesafb_device = platform_device_alloc("uvesafb", 0); 1970 if (uvesafb_device) 1971 err = platform_device_add(uvesafb_device); 1972 else 1973 err = -ENOMEM; 1974 1975 if (err) { 1976 if (uvesafb_device) 1977 platform_device_put(uvesafb_device); 1978 platform_driver_unregister(&uvesafb_driver); 1979 cn_del_callback(&uvesafb_cn_id); 1980 return err; 1981 } 1982 1983 err = driver_create_file(&uvesafb_driver.driver, 1984 &driver_attr_v86d); 1985 if (err) { 1986 printk(KERN_WARNING "uvesafb: failed to register " 1987 "attributes\n"); 1988 err = 0; 1989 } 1990 } 1991 return err; 1992} 1993 1994module_init(uvesafb_init); 1995 1996static void uvesafb_exit(void) 1997{ 1998 struct uvesafb_ktask *task; 1999 2000 if (v86d_started) { 2001 task = uvesafb_prep(); 2002 if (task) { 2003 task->t.flags = TF_EXIT; 2004 uvesafb_exec(task); 2005 uvesafb_free(task); 2006 } 2007 } 2008 2009 cn_del_callback(&uvesafb_cn_id); 2010 driver_remove_file(&uvesafb_driver.driver, &driver_attr_v86d); 2011 platform_device_unregister(uvesafb_device); 2012 platform_driver_unregister(&uvesafb_driver); 2013} 2014 2015module_exit(uvesafb_exit); 2016 2017static int param_set_scroll(const char *val, const struct kernel_param *kp) 2018{ 2019 ypan = 0; 2020 2021 if (!strcmp(val, "redraw")) 2022 ypan = 0; 2023 else if (!strcmp(val, "ypan")) 2024 ypan = 1; 2025 else if (!strcmp(val, "ywrap")) 2026 ypan = 2; 2027 else 2028 return -EINVAL; 2029 2030 return 0; 2031} 2032static struct kernel_param_ops param_ops_scroll = { 2033 .set = param_set_scroll, 2034}; 2035#define param_check_scroll(name, p) __param_check(name, p, void) 2036 2037module_param_named(scroll, ypan, scroll, 0); 2038MODULE_PARM_DESC(scroll, 2039 "Scrolling mode, set to 'redraw', 'ypan', or 'ywrap'"); 2040module_param_named(vgapal, pmi_setpal, invbool, 0); 2041MODULE_PARM_DESC(vgapal, "Set palette using VGA registers"); 2042module_param_named(pmipal, pmi_setpal, bool, 0); 2043MODULE_PARM_DESC(pmipal, "Set palette using PMI calls"); 2044module_param(mtrr, uint, 0); 2045MODULE_PARM_DESC(mtrr, 2046 "Memory Type Range Registers setting. Use 0 to disable."); 2047module_param(blank, bool, 0); 2048MODULE_PARM_DESC(blank, "Enable hardware blanking"); 2049module_param(nocrtc, bool, 0); 2050MODULE_PARM_DESC(nocrtc, "Ignore CRTC timings when setting modes"); 2051module_param(noedid, bool, 0); 2052MODULE_PARM_DESC(noedid, 2053 "Ignore EDID-provided monitor limits when setting modes"); 2054module_param(vram_remap, uint, 0); 2055MODULE_PARM_DESC(vram_remap, "Set amount of video memory to be used [MiB]"); 2056module_param(vram_total, uint, 0); 2057MODULE_PARM_DESC(vram_total, "Set total amount of video memoery [MiB]"); 2058module_param(maxclk, ushort, 0); 2059MODULE_PARM_DESC(maxclk, "Maximum pixelclock [MHz], overrides EDID data"); 2060module_param(maxhf, ushort, 0); 2061MODULE_PARM_DESC(maxhf, 2062 "Maximum horizontal frequency [kHz], overrides EDID data"); 2063module_param(maxvf, ushort, 0); 2064MODULE_PARM_DESC(maxvf, 2065 "Maximum vertical frequency [Hz], overrides EDID data"); 2066module_param(mode_option, charp, 0); 2067MODULE_PARM_DESC(mode_option, 2068 "Specify initial video mode as \"<xres>x<yres>[-<bpp>][@<refresh>]\""); 2069module_param(vbemode, ushort, 0); 2070MODULE_PARM_DESC(vbemode, 2071 "VBE mode number to set, overrides the 'mode' option"); 2072module_param_string(v86d, v86d_path, PATH_MAX, 0660); 2073MODULE_PARM_DESC(v86d, "Path to the v86d userspace helper."); 2074 2075MODULE_LICENSE("GPL"); 2076MODULE_AUTHOR("Michal Januszewski <spock@gentoo.org>"); 2077MODULE_DESCRIPTION("Framebuffer driver for VBE2.0+ compliant graphics boards"); 2078