1 /* 2 * drivers/video/cirrusfb.c - driver for Cirrus Logic chipsets 3 * 4 * Copyright 1999-2001 Jeff Garzik <jgarzik@pobox.com> 5 * 6 * Contributors (thanks, all!) 7 * 8 * David Eger: 9 * Overhaul for Linux 2.6 10 * 11 * Jeff Rugen: 12 * Major contributions; Motorola PowerStack (PPC and PCI) support, 13 * GD54xx, 1280x1024 mode support, change MCLK based on VCLK. 14 * 15 * Geert Uytterhoeven: 16 * Excellent code review. 17 * 18 * Lars Hecking: 19 * Amiga updates and testing. 20 * 21 * Original cirrusfb author: Frank Neumann 22 * 23 * Based on retz3fb.c and cirrusfb.c: 24 * Copyright (C) 1997 Jes Sorensen 25 * Copyright (C) 1996 Frank Neumann 26 * 27 *************************************************************** 28 * 29 * Format this code with GNU indent '-kr -i8 -pcs' options. 30 * 31 * This file is subject to the terms and conditions of the GNU General Public 32 * License. See the file COPYING in the main directory of this archive 33 * for more details. 34 * 35 */ 36 37 #include <linux/module.h> 38 #include <linux/kernel.h> 39 #include <linux/errno.h> 40 #include <linux/string.h> 41 #include <linux/mm.h> 42 #include <linux/delay.h> 43 #include <linux/fb.h> 44 #include <linux/init.h> 45 #include <asm/pgtable.h> 46 47 #ifdef CONFIG_ZORRO 48 #include <linux/zorro.h> 49 #endif 50 #ifdef CONFIG_PCI 51 #include <linux/pci.h> 52 #endif 53 #ifdef CONFIG_AMIGA 54 #include <asm/amigahw.h> 55 #endif 56 57 #include <video/vga.h> 58 #include <video/cirrus.h> 59 60 /***************************************************************** 61 * 62 * debugging and utility macros 63 * 64 */ 65 66 /* disable runtime assertions? */ 67 /* #define CIRRUSFB_NDEBUG */ 68 69 /* debugging assertions */ 70 #ifndef CIRRUSFB_NDEBUG 71 #define assert(expr) \ 72 if (!(expr)) { \ 73 printk("Assertion failed! %s,%s,%s,line=%d\n", \ 74 #expr, __FILE__, __func__, __LINE__); \ 75 } 76 #else 77 #define assert(expr) 78 #endif 79 80 #define MB_ (1024 * 1024) 81 82 /***************************************************************** 83 * 84 * chipset information 85 * 86 */ 87 88 /* board types */ 89 enum cirrus_board { 90 BT_NONE = 0, 91 BT_SD64, /* GD5434 */ 92 BT_PICCOLO, /* GD5426 */ 93 BT_PICASSO, /* GD5426 or GD5428 */ 94 BT_SPECTRUM, /* GD5426 or GD5428 */ 95 BT_PICASSO4, /* GD5446 */ 96 BT_ALPINE, /* GD543x/4x */ 97 BT_GD5480, 98 BT_LAGUNA, /* GD5462/64 */ 99 BT_LAGUNAB, /* GD5465 */ 100 }; 101 102 /* 103 * per-board-type information, used for enumerating and abstracting 104 * chip-specific information 105 * NOTE: MUST be in the same order as enum cirrus_board in order to 106 * use direct indexing on this array 107 * NOTE: '__initdata' cannot be used as some of this info 108 * is required at runtime. Maybe separate into an init-only and 109 * a run-time table? 110 */ 111 static const struct cirrusfb_board_info_rec { 112 char *name; /* ASCII name of chipset */ 113 long maxclock[5]; /* maximum video clock */ 114 /* for 1/4bpp, 8bpp 15/16bpp, 24bpp, 32bpp - numbers from xorg code */ 115 bool init_sr07 : 1; /* init SR07 during init_vgachip() */ 116 bool init_sr1f : 1; /* write SR1F during init_vgachip() */ 117 /* construct bit 19 of screen start address */ 118 bool scrn_start_bit19 : 1; 119 120 /* initial SR07 value, then for each mode */ 121 unsigned char sr07; 122 unsigned char sr07_1bpp; 123 unsigned char sr07_1bpp_mux; 124 unsigned char sr07_8bpp; 125 unsigned char sr07_8bpp_mux; 126 127 unsigned char sr1f; /* SR1F VGA initial register value */ 128 } cirrusfb_board_info[] = { 129 [BT_SD64] = { 130 .name = "CL SD64", 131 .maxclock = { 132 /* guess */ 133 /* the SD64/P4 have a higher max. videoclock */ 134 135100, 135100, 85500, 85500, 0 135 }, 136 .init_sr07 = true, 137 .init_sr1f = true, 138 .scrn_start_bit19 = true, 139 .sr07 = 0xF0, 140 .sr07_1bpp = 0xF0, 141 .sr07_1bpp_mux = 0xF6, 142 .sr07_8bpp = 0xF1, 143 .sr07_8bpp_mux = 0xF7, 144 .sr1f = 0x1E 145 }, 146 [BT_PICCOLO] = { 147 .name = "CL Piccolo", 148 .maxclock = { 149 /* guess */ 150 90000, 90000, 90000, 90000, 90000 151 }, 152 .init_sr07 = true, 153 .init_sr1f = true, 154 .scrn_start_bit19 = false, 155 .sr07 = 0x80, 156 .sr07_1bpp = 0x80, 157 .sr07_8bpp = 0x81, 158 .sr1f = 0x22 159 }, 160 [BT_PICASSO] = { 161 .name = "CL Picasso", 162 .maxclock = { 163 /* guess */ 164 90000, 90000, 90000, 90000, 90000 165 }, 166 .init_sr07 = true, 167 .init_sr1f = true, 168 .scrn_start_bit19 = false, 169 .sr07 = 0x20, 170 .sr07_1bpp = 0x20, 171 .sr07_8bpp = 0x21, 172 .sr1f = 0x22 173 }, 174 [BT_SPECTRUM] = { 175 .name = "CL Spectrum", 176 .maxclock = { 177 /* guess */ 178 90000, 90000, 90000, 90000, 90000 179 }, 180 .init_sr07 = true, 181 .init_sr1f = true, 182 .scrn_start_bit19 = false, 183 .sr07 = 0x80, 184 .sr07_1bpp = 0x80, 185 .sr07_8bpp = 0x81, 186 .sr1f = 0x22 187 }, 188 [BT_PICASSO4] = { 189 .name = "CL Picasso4", 190 .maxclock = { 191 135100, 135100, 85500, 85500, 0 192 }, 193 .init_sr07 = true, 194 .init_sr1f = false, 195 .scrn_start_bit19 = true, 196 .sr07 = 0xA0, 197 .sr07_1bpp = 0xA0, 198 .sr07_1bpp_mux = 0xA6, 199 .sr07_8bpp = 0xA1, 200 .sr07_8bpp_mux = 0xA7, 201 .sr1f = 0 202 }, 203 [BT_ALPINE] = { 204 .name = "CL Alpine", 205 .maxclock = { 206 /* for the GD5430. GD5446 can do more... */ 207 85500, 85500, 50000, 28500, 0 208 }, 209 .init_sr07 = true, 210 .init_sr1f = true, 211 .scrn_start_bit19 = true, 212 .sr07 = 0xA0, 213 .sr07_1bpp = 0xA0, 214 .sr07_1bpp_mux = 0xA6, 215 .sr07_8bpp = 0xA1, 216 .sr07_8bpp_mux = 0xA7, 217 .sr1f = 0x1C 218 }, 219 [BT_GD5480] = { 220 .name = "CL GD5480", 221 .maxclock = { 222 135100, 200000, 200000, 135100, 135100 223 }, 224 .init_sr07 = true, 225 .init_sr1f = true, 226 .scrn_start_bit19 = true, 227 .sr07 = 0x10, 228 .sr07_1bpp = 0x11, 229 .sr07_8bpp = 0x11, 230 .sr1f = 0x1C 231 }, 232 [BT_LAGUNA] = { 233 .name = "CL Laguna", 234 .maxclock = { 235 /* taken from X11 code */ 236 170000, 170000, 170000, 170000, 135100, 237 }, 238 .init_sr07 = false, 239 .init_sr1f = false, 240 .scrn_start_bit19 = true, 241 }, 242 [BT_LAGUNAB] = { 243 .name = "CL Laguna AGP", 244 .maxclock = { 245 /* taken from X11 code */ 246 170000, 250000, 170000, 170000, 135100, 247 }, 248 .init_sr07 = false, 249 .init_sr1f = false, 250 .scrn_start_bit19 = true, 251 } 252 }; 253 254 #ifdef CONFIG_PCI 255 #define CHIP(id, btype) \ 256 { PCI_VENDOR_ID_CIRRUS, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (btype) } 257 258 static struct pci_device_id cirrusfb_pci_table[] = { 259 CHIP(PCI_DEVICE_ID_CIRRUS_5436, BT_ALPINE), 260 CHIP(PCI_DEVICE_ID_CIRRUS_5434_8, BT_SD64), 261 CHIP(PCI_DEVICE_ID_CIRRUS_5434_4, BT_SD64), 262 CHIP(PCI_DEVICE_ID_CIRRUS_5430, BT_ALPINE), /* GD-5440 is same id */ 263 CHIP(PCI_DEVICE_ID_CIRRUS_7543, BT_ALPINE), 264 CHIP(PCI_DEVICE_ID_CIRRUS_7548, BT_ALPINE), 265 CHIP(PCI_DEVICE_ID_CIRRUS_5480, BT_GD5480), /* MacPicasso likely */ 266 CHIP(PCI_DEVICE_ID_CIRRUS_5446, BT_PICASSO4), /* Picasso 4 is 5446 */ 267 CHIP(PCI_DEVICE_ID_CIRRUS_5462, BT_LAGUNA), /* CL Laguna */ 268 CHIP(PCI_DEVICE_ID_CIRRUS_5464, BT_LAGUNA), /* CL Laguna 3D */ 269 CHIP(PCI_DEVICE_ID_CIRRUS_5465, BT_LAGUNAB), /* CL Laguna 3DA*/ 270 { 0, } 271 }; 272 MODULE_DEVICE_TABLE(pci, cirrusfb_pci_table); 273 #undef CHIP 274 #endif /* CONFIG_PCI */ 275 276 #ifdef CONFIG_ZORRO 277 struct zorrocl { 278 enum cirrus_board type; /* Board type */ 279 u32 regoffset; /* Offset of registers in first Zorro device */ 280 u32 ramsize; /* Size of video RAM in first Zorro device */ 281 /* If zero, use autoprobe on RAM device */ 282 u32 ramoffset; /* Offset of video RAM in first Zorro device */ 283 zorro_id ramid; /* Zorro ID of RAM device */ 284 zorro_id ramid2; /* Zorro ID of optional second RAM device */ 285 }; 286 287 static const struct zorrocl zcl_sd64 = { 288 .type = BT_SD64, 289 .ramid = ZORRO_PROD_HELFRICH_SD64_RAM, 290 }; 291 292 static const struct zorrocl zcl_piccolo = { 293 .type = BT_PICCOLO, 294 .ramid = ZORRO_PROD_HELFRICH_PICCOLO_RAM, 295 }; 296 297 static const struct zorrocl zcl_picasso = { 298 .type = BT_PICASSO, 299 .ramid = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM, 300 }; 301 302 static const struct zorrocl zcl_spectrum = { 303 .type = BT_SPECTRUM, 304 .ramid = ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_RAM, 305 }; 306 307 static const struct zorrocl zcl_picasso4_z3 = { 308 .type = BT_PICASSO4, 309 .regoffset = 0x00600000, 310 .ramsize = 4 * MB_, 311 .ramoffset = 0x01000000, /* 0x02000000 for 64 MiB boards */ 312 }; 313 314 static const struct zorrocl zcl_picasso4_z2 = { 315 .type = BT_PICASSO4, 316 .regoffset = 0x10000, 317 .ramid = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM1, 318 .ramid2 = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM2, 319 }; 320 321 322 static const struct zorro_device_id cirrusfb_zorro_table[] = { 323 { 324 .id = ZORRO_PROD_HELFRICH_SD64_REG, 325 .driver_data = (unsigned long)&zcl_sd64, 326 }, { 327 .id = ZORRO_PROD_HELFRICH_PICCOLO_REG, 328 .driver_data = (unsigned long)&zcl_piccolo, 329 }, { 330 .id = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG, 331 .driver_data = (unsigned long)&zcl_picasso, 332 }, { 333 .id = ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_REG, 334 .driver_data = (unsigned long)&zcl_spectrum, 335 }, { 336 .id = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z3, 337 .driver_data = (unsigned long)&zcl_picasso4_z3, 338 }, { 339 .id = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_REG, 340 .driver_data = (unsigned long)&zcl_picasso4_z2, 341 }, 342 { 0 } 343 }; 344 MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table); 345 #endif /* CONFIG_ZORRO */ 346 347 #ifdef CIRRUSFB_DEBUG 348 enum cirrusfb_dbg_reg_class { 349 CRT, 350 SEQ 351 }; 352 #endif /* CIRRUSFB_DEBUG */ 353 354 /* info about board */ 355 struct cirrusfb_info { 356 u8 __iomem *regbase; 357 u8 __iomem *laguna_mmio; 358 enum cirrus_board btype; 359 unsigned char SFR; /* Shadow of special function register */ 360 361 int multiplexing; 362 int doubleVCLK; 363 int blank_mode; 364 u32 pseudo_palette[16]; 365 366 void (*unmap)(struct fb_info *info); 367 }; 368 369 static bool noaccel; 370 static char *mode_option = "640x480@60"; 371 372 /****************************************************************************/ 373 /**** BEGIN PROTOTYPES ******************************************************/ 374 375 /*--- Interface used by the world ------------------------------------------*/ 376 static int cirrusfb_pan_display(struct fb_var_screeninfo *var, 377 struct fb_info *info); 378 379 /*--- Internal routines ----------------------------------------------------*/ 380 static void init_vgachip(struct fb_info *info); 381 static void switch_monitor(struct cirrusfb_info *cinfo, int on); 382 static void WGen(const struct cirrusfb_info *cinfo, 383 int regnum, unsigned char val); 384 static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum); 385 static void AttrOn(const struct cirrusfb_info *cinfo); 386 static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val); 387 static void WSFR(struct cirrusfb_info *cinfo, unsigned char val); 388 static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val); 389 static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum, 390 unsigned char red, unsigned char green, unsigned char blue); 391 #if 0 392 static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum, 393 unsigned char *red, unsigned char *green, 394 unsigned char *blue); 395 #endif 396 static void cirrusfb_WaitBLT(u8 __iomem *regbase); 397 static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel, 398 u_short curx, u_short cury, 399 u_short destx, u_short desty, 400 u_short width, u_short height, 401 u_short line_length); 402 static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel, 403 u_short x, u_short y, 404 u_short width, u_short height, 405 u32 fg_color, u32 bg_color, 406 u_short line_length, u_char blitmode); 407 408 static void bestclock(long freq, int *nom, int *den, int *div); 409 410 #ifdef CIRRUSFB_DEBUG 411 static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase); 412 static void cirrusfb_dbg_print_regs(struct fb_info *info, 413 caddr_t regbase, 414 enum cirrusfb_dbg_reg_class reg_class, ...); 415 #endif /* CIRRUSFB_DEBUG */ 416 417 /*** END PROTOTYPES ********************************************************/ 418 /*****************************************************************************/ 419 /*** BEGIN Interface Used by the World ***************************************/ 420 421 static inline int is_laguna(const struct cirrusfb_info *cinfo) 422 { 423 return cinfo->btype == BT_LAGUNA || cinfo->btype == BT_LAGUNAB; 424 } 425 426 static int opencount; 427 428 /*--- Open /dev/fbx ---------------------------------------------------------*/ 429 static int cirrusfb_open(struct fb_info *info, int user) 430 { 431 if (opencount++ == 0) 432 switch_monitor(info->par, 1); 433 return 0; 434 } 435 436 /*--- Close /dev/fbx --------------------------------------------------------*/ 437 static int cirrusfb_release(struct fb_info *info, int user) 438 { 439 if (--opencount == 0) 440 switch_monitor(info->par, 0); 441 return 0; 442 } 443 444 /**** END Interface used by the World *************************************/ 445 /****************************************************************************/ 446 /**** BEGIN Hardware specific Routines **************************************/ 447 448 /* Check if the MCLK is not a better clock source */ 449 static int cirrusfb_check_mclk(struct fb_info *info, long freq) 450 { 451 struct cirrusfb_info *cinfo = info->par; 452 long mclk = vga_rseq(cinfo->regbase, CL_SEQR1F) & 0x3f; 453 454 /* Read MCLK value */ 455 mclk = (14318 * mclk) >> 3; 456 dev_dbg(info->device, "Read MCLK of %ld kHz\n", mclk); 457 458 /* Determine if we should use MCLK instead of VCLK, and if so, what we 459 * should divide it by to get VCLK 460 */ 461 462 if (abs(freq - mclk) < 250) { 463 dev_dbg(info->device, "Using VCLK = MCLK\n"); 464 return 1; 465 } else if (abs(freq - (mclk / 2)) < 250) { 466 dev_dbg(info->device, "Using VCLK = MCLK/2\n"); 467 return 2; 468 } 469 470 return 0; 471 } 472 473 static int cirrusfb_check_pixclock(const struct fb_var_screeninfo *var, 474 struct fb_info *info) 475 { 476 long freq; 477 long maxclock; 478 struct cirrusfb_info *cinfo = info->par; 479 unsigned maxclockidx = var->bits_per_pixel >> 3; 480 481 /* convert from ps to kHz */ 482 freq = PICOS2KHZ(var->pixclock); 483 484 dev_dbg(info->device, "desired pixclock: %ld kHz\n", freq); 485 486 maxclock = cirrusfb_board_info[cinfo->btype].maxclock[maxclockidx]; 487 cinfo->multiplexing = 0; 488 489 /* If the frequency is greater than we can support, we might be able 490 * to use multiplexing for the video mode */ 491 if (freq > maxclock) { 492 dev_err(info->device, 493 "Frequency greater than maxclock (%ld kHz)\n", 494 maxclock); 495 return -EINVAL; 496 } 497 /* 498 * Additional constraint: 8bpp uses DAC clock doubling to allow maximum 499 * pixel clock 500 */ 501 if (var->bits_per_pixel == 8) { 502 switch (cinfo->btype) { 503 case BT_ALPINE: 504 case BT_SD64: 505 case BT_PICASSO4: 506 if (freq > 85500) 507 cinfo->multiplexing = 1; 508 break; 509 case BT_GD5480: 510 if (freq > 135100) 511 cinfo->multiplexing = 1; 512 break; 513 514 default: 515 break; 516 } 517 } 518 519 /* If we have a 1MB 5434, we need to put ourselves in a mode where 520 * the VCLK is double the pixel clock. */ 521 cinfo->doubleVCLK = 0; 522 if (cinfo->btype == BT_SD64 && info->fix.smem_len <= MB_ && 523 var->bits_per_pixel == 16) { 524 cinfo->doubleVCLK = 1; 525 } 526 527 return 0; 528 } 529 530 static int cirrusfb_check_var(struct fb_var_screeninfo *var, 531 struct fb_info *info) 532 { 533 int yres; 534 /* memory size in pixels */ 535 unsigned pixels = info->screen_size * 8 / var->bits_per_pixel; 536 struct cirrusfb_info *cinfo = info->par; 537 538 switch (var->bits_per_pixel) { 539 case 1: 540 var->red.offset = 0; 541 var->red.length = 1; 542 var->green = var->red; 543 var->blue = var->red; 544 break; 545 546 case 8: 547 var->red.offset = 0; 548 var->red.length = 8; 549 var->green = var->red; 550 var->blue = var->red; 551 break; 552 553 case 16: 554 var->red.offset = 11; 555 var->green.offset = 5; 556 var->blue.offset = 0; 557 var->red.length = 5; 558 var->green.length = 6; 559 var->blue.length = 5; 560 break; 561 562 case 24: 563 var->red.offset = 16; 564 var->green.offset = 8; 565 var->blue.offset = 0; 566 var->red.length = 8; 567 var->green.length = 8; 568 var->blue.length = 8; 569 break; 570 571 default: 572 dev_dbg(info->device, 573 "Unsupported bpp size: %d\n", var->bits_per_pixel); 574 return -EINVAL; 575 } 576 577 if (var->xres_virtual < var->xres) 578 var->xres_virtual = var->xres; 579 /* use highest possible virtual resolution */ 580 if (var->yres_virtual == -1) { 581 var->yres_virtual = pixels / var->xres_virtual; 582 583 dev_info(info->device, 584 "virtual resolution set to maximum of %dx%d\n", 585 var->xres_virtual, var->yres_virtual); 586 } 587 if (var->yres_virtual < var->yres) 588 var->yres_virtual = var->yres; 589 590 if (var->xres_virtual * var->yres_virtual > pixels) { 591 dev_err(info->device, "mode %dx%dx%d rejected... " 592 "virtual resolution too high to fit into video memory!\n", 593 var->xres_virtual, var->yres_virtual, 594 var->bits_per_pixel); 595 return -EINVAL; 596 } 597 598 /* truncate xoffset and yoffset to maximum if too high */ 599 if (var->xoffset > var->xres_virtual - var->xres) 600 var->xoffset = var->xres_virtual - var->xres - 1; 601 if (var->yoffset > var->yres_virtual - var->yres) 602 var->yoffset = var->yres_virtual - var->yres - 1; 603 604 var->red.msb_right = 605 var->green.msb_right = 606 var->blue.msb_right = 607 var->transp.offset = 608 var->transp.length = 609 var->transp.msb_right = 0; 610 611 yres = var->yres; 612 if (var->vmode & FB_VMODE_DOUBLE) 613 yres *= 2; 614 else if (var->vmode & FB_VMODE_INTERLACED) 615 yres = (yres + 1) / 2; 616 617 if (yres >= 1280) { 618 dev_err(info->device, "ERROR: VerticalTotal >= 1280; " 619 "special treatment required! (TODO)\n"); 620 return -EINVAL; 621 } 622 623 if (cirrusfb_check_pixclock(var, info)) 624 return -EINVAL; 625 626 if (!is_laguna(cinfo)) 627 var->accel_flags = FB_ACCELF_TEXT; 628 629 return 0; 630 } 631 632 static void cirrusfb_set_mclk_as_source(const struct fb_info *info, int div) 633 { 634 struct cirrusfb_info *cinfo = info->par; 635 unsigned char old1f, old1e; 636 637 assert(cinfo != NULL); 638 old1f = vga_rseq(cinfo->regbase, CL_SEQR1F) & ~0x40; 639 640 if (div) { 641 dev_dbg(info->device, "Set %s as pixclock source.\n", 642 (div == 2) ? "MCLK/2" : "MCLK"); 643 old1f |= 0x40; 644 old1e = vga_rseq(cinfo->regbase, CL_SEQR1E) & ~0x1; 645 if (div == 2) 646 old1e |= 1; 647 648 vga_wseq(cinfo->regbase, CL_SEQR1E, old1e); 649 } 650 vga_wseq(cinfo->regbase, CL_SEQR1F, old1f); 651 } 652 653 /************************************************************************* 654 cirrusfb_set_par_foo() 655 656 actually writes the values for a new video mode into the hardware, 657 **************************************************************************/ 658 static int cirrusfb_set_par_foo(struct fb_info *info) 659 { 660 struct cirrusfb_info *cinfo = info->par; 661 struct fb_var_screeninfo *var = &info->var; 662 u8 __iomem *regbase = cinfo->regbase; 663 unsigned char tmp; 664 int pitch; 665 const struct cirrusfb_board_info_rec *bi; 666 int hdispend, hsyncstart, hsyncend, htotal; 667 int yres, vdispend, vsyncstart, vsyncend, vtotal; 668 long freq; 669 int nom, den, div; 670 unsigned int control = 0, format = 0, threshold = 0; 671 672 dev_dbg(info->device, "Requested mode: %dx%dx%d\n", 673 var->xres, var->yres, var->bits_per_pixel); 674 675 switch (var->bits_per_pixel) { 676 case 1: 677 info->fix.line_length = var->xres_virtual / 8; 678 info->fix.visual = FB_VISUAL_MONO10; 679 break; 680 681 case 8: 682 info->fix.line_length = var->xres_virtual; 683 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; 684 break; 685 686 case 16: 687 case 24: 688 info->fix.line_length = var->xres_virtual * 689 var->bits_per_pixel >> 3; 690 info->fix.visual = FB_VISUAL_TRUECOLOR; 691 break; 692 } 693 info->fix.type = FB_TYPE_PACKED_PIXELS; 694 695 init_vgachip(info); 696 697 bi = &cirrusfb_board_info[cinfo->btype]; 698 699 hsyncstart = var->xres + var->right_margin; 700 hsyncend = hsyncstart + var->hsync_len; 701 htotal = (hsyncend + var->left_margin) / 8; 702 hdispend = var->xres / 8; 703 hsyncstart = hsyncstart / 8; 704 hsyncend = hsyncend / 8; 705 706 vdispend = var->yres; 707 vsyncstart = vdispend + var->lower_margin; 708 vsyncend = vsyncstart + var->vsync_len; 709 vtotal = vsyncend + var->upper_margin; 710 711 if (var->vmode & FB_VMODE_DOUBLE) { 712 vdispend *= 2; 713 vsyncstart *= 2; 714 vsyncend *= 2; 715 vtotal *= 2; 716 } else if (var->vmode & FB_VMODE_INTERLACED) { 717 vdispend = (vdispend + 1) / 2; 718 vsyncstart = (vsyncstart + 1) / 2; 719 vsyncend = (vsyncend + 1) / 2; 720 vtotal = (vtotal + 1) / 2; 721 } 722 yres = vdispend; 723 if (yres >= 1024) { 724 vtotal /= 2; 725 vsyncstart /= 2; 726 vsyncend /= 2; 727 vdispend /= 2; 728 } 729 730 vdispend -= 1; 731 vsyncstart -= 1; 732 vsyncend -= 1; 733 vtotal -= 2; 734 735 if (cinfo->multiplexing) { 736 htotal /= 2; 737 hsyncstart /= 2; 738 hsyncend /= 2; 739 hdispend /= 2; 740 } 741 742 htotal -= 5; 743 hdispend -= 1; 744 hsyncstart += 1; 745 hsyncend += 1; 746 747 /* unlock register VGA_CRTC_H_TOTAL..CRT7 */ 748 vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, 0x20); /* previously: 0x00) */ 749 750 /* if debugging is enabled, all parameters get output before writing */ 751 dev_dbg(info->device, "CRT0: %d\n", htotal); 752 vga_wcrt(regbase, VGA_CRTC_H_TOTAL, htotal); 753 754 dev_dbg(info->device, "CRT1: %d\n", hdispend); 755 vga_wcrt(regbase, VGA_CRTC_H_DISP, hdispend); 756 757 dev_dbg(info->device, "CRT2: %d\n", var->xres / 8); 758 vga_wcrt(regbase, VGA_CRTC_H_BLANK_START, var->xres / 8); 759 760 /* + 128: Compatible read */ 761 dev_dbg(info->device, "CRT3: 128+%d\n", (htotal + 5) % 32); 762 vga_wcrt(regbase, VGA_CRTC_H_BLANK_END, 763 128 + ((htotal + 5) % 32)); 764 765 dev_dbg(info->device, "CRT4: %d\n", hsyncstart); 766 vga_wcrt(regbase, VGA_CRTC_H_SYNC_START, hsyncstart); 767 768 tmp = hsyncend % 32; 769 if ((htotal + 5) & 32) 770 tmp += 128; 771 dev_dbg(info->device, "CRT5: %d\n", tmp); 772 vga_wcrt(regbase, VGA_CRTC_H_SYNC_END, tmp); 773 774 dev_dbg(info->device, "CRT6: %d\n", vtotal & 0xff); 775 vga_wcrt(regbase, VGA_CRTC_V_TOTAL, vtotal & 0xff); 776 777 tmp = 16; /* LineCompare bit #9 */ 778 if (vtotal & 256) 779 tmp |= 1; 780 if (vdispend & 256) 781 tmp |= 2; 782 if (vsyncstart & 256) 783 tmp |= 4; 784 if ((vdispend + 1) & 256) 785 tmp |= 8; 786 if (vtotal & 512) 787 tmp |= 32; 788 if (vdispend & 512) 789 tmp |= 64; 790 if (vsyncstart & 512) 791 tmp |= 128; 792 dev_dbg(info->device, "CRT7: %d\n", tmp); 793 vga_wcrt(regbase, VGA_CRTC_OVERFLOW, tmp); 794 795 tmp = 0x40; /* LineCompare bit #8 */ 796 if ((vdispend + 1) & 512) 797 tmp |= 0x20; 798 if (var->vmode & FB_VMODE_DOUBLE) 799 tmp |= 0x80; 800 dev_dbg(info->device, "CRT9: %d\n", tmp); 801 vga_wcrt(regbase, VGA_CRTC_MAX_SCAN, tmp); 802 803 dev_dbg(info->device, "CRT10: %d\n", vsyncstart & 0xff); 804 vga_wcrt(regbase, VGA_CRTC_V_SYNC_START, vsyncstart & 0xff); 805 806 dev_dbg(info->device, "CRT11: 64+32+%d\n", vsyncend % 16); 807 vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, vsyncend % 16 + 64 + 32); 808 809 dev_dbg(info->device, "CRT12: %d\n", vdispend & 0xff); 810 vga_wcrt(regbase, VGA_CRTC_V_DISP_END, vdispend & 0xff); 811 812 dev_dbg(info->device, "CRT15: %d\n", (vdispend + 1) & 0xff); 813 vga_wcrt(regbase, VGA_CRTC_V_BLANK_START, (vdispend + 1) & 0xff); 814 815 dev_dbg(info->device, "CRT16: %d\n", vtotal & 0xff); 816 vga_wcrt(regbase, VGA_CRTC_V_BLANK_END, vtotal & 0xff); 817 818 dev_dbg(info->device, "CRT18: 0xff\n"); 819 vga_wcrt(regbase, VGA_CRTC_LINE_COMPARE, 0xff); 820 821 tmp = 0; 822 if (var->vmode & FB_VMODE_INTERLACED) 823 tmp |= 1; 824 if ((htotal + 5) & 64) 825 tmp |= 16; 826 if ((htotal + 5) & 128) 827 tmp |= 32; 828 if (vtotal & 256) 829 tmp |= 64; 830 if (vtotal & 512) 831 tmp |= 128; 832 833 dev_dbg(info->device, "CRT1a: %d\n", tmp); 834 vga_wcrt(regbase, CL_CRT1A, tmp); 835 836 freq = PICOS2KHZ(var->pixclock); 837 if (var->bits_per_pixel == 24) 838 if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64) 839 freq *= 3; 840 if (cinfo->multiplexing) 841 freq /= 2; 842 if (cinfo->doubleVCLK) 843 freq *= 2; 844 845 bestclock(freq, &nom, &den, &div); 846 847 dev_dbg(info->device, "VCLK freq: %ld kHz nom: %d den: %d div: %d\n", 848 freq, nom, den, div); 849 850 /* set VCLK0 */ 851 /* hardware RefClock: 14.31818 MHz */ 852 /* formula: VClk = (OSC * N) / (D * (1+P)) */ 853 /* Example: VClk = (14.31818 * 91) / (23 * (1+1)) = 28.325 MHz */ 854 855 if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_PICASSO4 || 856 cinfo->btype == BT_SD64) { 857 /* if freq is close to mclk or mclk/2 select mclk 858 * as clock source 859 */ 860 int divMCLK = cirrusfb_check_mclk(info, freq); 861 if (divMCLK) 862 nom = 0; 863 cirrusfb_set_mclk_as_source(info, divMCLK); 864 } 865 if (is_laguna(cinfo)) { 866 long pcifc = fb_readl(cinfo->laguna_mmio + 0x3fc); 867 unsigned char tile = fb_readb(cinfo->laguna_mmio + 0x407); 868 unsigned short tile_control; 869 870 if (cinfo->btype == BT_LAGUNAB) { 871 tile_control = fb_readw(cinfo->laguna_mmio + 0x2c4); 872 tile_control &= ~0x80; 873 fb_writew(tile_control, cinfo->laguna_mmio + 0x2c4); 874 } 875 876 fb_writel(pcifc | 0x10000000l, cinfo->laguna_mmio + 0x3fc); 877 fb_writeb(tile & 0x3f, cinfo->laguna_mmio + 0x407); 878 control = fb_readw(cinfo->laguna_mmio + 0x402); 879 threshold = fb_readw(cinfo->laguna_mmio + 0xea); 880 control &= ~0x6800; 881 format = 0; 882 threshold &= 0xffc0 & 0x3fbf; 883 } 884 if (nom) { 885 tmp = den << 1; 886 if (div != 0) 887 tmp |= 1; 888 /* 6 bit denom; ONLY 5434!!! (bugged me 10 days) */ 889 if ((cinfo->btype == BT_SD64) || 890 (cinfo->btype == BT_ALPINE) || 891 (cinfo->btype == BT_GD5480)) 892 tmp |= 0x80; 893 894 /* Laguna chipset has reversed clock registers */ 895 if (is_laguna(cinfo)) { 896 vga_wseq(regbase, CL_SEQRE, tmp); 897 vga_wseq(regbase, CL_SEQR1E, nom); 898 } else { 899 vga_wseq(regbase, CL_SEQRE, nom); 900 vga_wseq(regbase, CL_SEQR1E, tmp); 901 } 902 } 903 904 if (yres >= 1024) 905 /* 1280x1024 */ 906 vga_wcrt(regbase, VGA_CRTC_MODE, 0xc7); 907 else 908 /* mode control: VGA_CRTC_START_HI enable, ROTATE(?), 16bit 909 * address wrap, no compat. */ 910 vga_wcrt(regbase, VGA_CRTC_MODE, 0xc3); 911 912 /* don't know if it would hurt to also program this if no interlaced */ 913 /* mode is used, but I feel better this way.. :-) */ 914 if (var->vmode & FB_VMODE_INTERLACED) 915 vga_wcrt(regbase, VGA_CRTC_REGS, htotal / 2); 916 else 917 vga_wcrt(regbase, VGA_CRTC_REGS, 0x00); /* interlace control */ 918 919 /* adjust horizontal/vertical sync type (low/high), use VCLK3 */ 920 /* enable display memory & CRTC I/O address for color mode */ 921 tmp = 0x03 | 0xc; 922 if (var->sync & FB_SYNC_HOR_HIGH_ACT) 923 tmp |= 0x40; 924 if (var->sync & FB_SYNC_VERT_HIGH_ACT) 925 tmp |= 0x80; 926 WGen(cinfo, VGA_MIS_W, tmp); 927 928 /* text cursor on and start line */ 929 vga_wcrt(regbase, VGA_CRTC_CURSOR_START, 0); 930 /* text cursor end line */ 931 vga_wcrt(regbase, VGA_CRTC_CURSOR_END, 31); 932 933 /****************************************************** 934 * 935 * 1 bpp 936 * 937 */ 938 939 /* programming for different color depths */ 940 if (var->bits_per_pixel == 1) { 941 dev_dbg(info->device, "preparing for 1 bit deep display\n"); 942 vga_wgfx(regbase, VGA_GFX_MODE, 0); /* mode register */ 943 944 /* SR07 */ 945 switch (cinfo->btype) { 946 case BT_SD64: 947 case BT_PICCOLO: 948 case BT_PICASSO: 949 case BT_SPECTRUM: 950 case BT_PICASSO4: 951 case BT_ALPINE: 952 case BT_GD5480: 953 vga_wseq(regbase, CL_SEQR7, 954 cinfo->multiplexing ? 955 bi->sr07_1bpp_mux : bi->sr07_1bpp); 956 break; 957 958 case BT_LAGUNA: 959 case BT_LAGUNAB: 960 vga_wseq(regbase, CL_SEQR7, 961 vga_rseq(regbase, CL_SEQR7) & ~0x01); 962 break; 963 964 default: 965 dev_warn(info->device, "unknown Board\n"); 966 break; 967 } 968 969 /* Extended Sequencer Mode */ 970 switch (cinfo->btype) { 971 972 case BT_PICCOLO: 973 case BT_SPECTRUM: 974 /* evtl d0 bei 1 bit? avoid FIFO underruns..? */ 975 vga_wseq(regbase, CL_SEQRF, 0xb0); 976 break; 977 978 case BT_PICASSO: 979 /* ## vorher d0 avoid FIFO underruns..? */ 980 vga_wseq(regbase, CL_SEQRF, 0xd0); 981 break; 982 983 case BT_SD64: 984 case BT_PICASSO4: 985 case BT_ALPINE: 986 case BT_GD5480: 987 case BT_LAGUNA: 988 case BT_LAGUNAB: 989 /* do nothing */ 990 break; 991 992 default: 993 dev_warn(info->device, "unknown Board\n"); 994 break; 995 } 996 997 /* pixel mask: pass-through for first plane */ 998 WGen(cinfo, VGA_PEL_MSK, 0x01); 999 if (cinfo->multiplexing) 1000 /* hidden dac reg: 1280x1024 */ 1001 WHDR(cinfo, 0x4a); 1002 else 1003 /* hidden dac: nothing */ 1004 WHDR(cinfo, 0); 1005 /* memory mode: odd/even, ext. memory */ 1006 vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, 0x06); 1007 /* plane mask: only write to first plane */ 1008 vga_wseq(regbase, VGA_SEQ_PLANE_WRITE, 0x01); 1009 } 1010 1011 /****************************************************** 1012 * 1013 * 8 bpp 1014 * 1015 */ 1016 1017 else if (var->bits_per_pixel == 8) { 1018 dev_dbg(info->device, "preparing for 8 bit deep display\n"); 1019 switch (cinfo->btype) { 1020 case BT_SD64: 1021 case BT_PICCOLO: 1022 case BT_PICASSO: 1023 case BT_SPECTRUM: 1024 case BT_PICASSO4: 1025 case BT_ALPINE: 1026 case BT_GD5480: 1027 vga_wseq(regbase, CL_SEQR7, 1028 cinfo->multiplexing ? 1029 bi->sr07_8bpp_mux : bi->sr07_8bpp); 1030 break; 1031 1032 case BT_LAGUNA: 1033 case BT_LAGUNAB: 1034 vga_wseq(regbase, CL_SEQR7, 1035 vga_rseq(regbase, CL_SEQR7) | 0x01); 1036 threshold |= 0x10; 1037 break; 1038 1039 default: 1040 dev_warn(info->device, "unknown Board\n"); 1041 break; 1042 } 1043 1044 switch (cinfo->btype) { 1045 case BT_PICCOLO: 1046 case BT_PICASSO: 1047 case BT_SPECTRUM: 1048 /* Fast Page-Mode writes */ 1049 vga_wseq(regbase, CL_SEQRF, 0xb0); 1050 break; 1051 1052 case BT_PICASSO4: 1053 #ifdef CONFIG_ZORRO 1054 /* ### INCOMPLETE!! */ 1055 vga_wseq(regbase, CL_SEQRF, 0xb8); 1056 #endif 1057 case BT_ALPINE: 1058 case BT_SD64: 1059 case BT_GD5480: 1060 case BT_LAGUNA: 1061 case BT_LAGUNAB: 1062 /* do nothing */ 1063 break; 1064 1065 default: 1066 dev_warn(info->device, "unknown board\n"); 1067 break; 1068 } 1069 1070 /* mode register: 256 color mode */ 1071 vga_wgfx(regbase, VGA_GFX_MODE, 64); 1072 if (cinfo->multiplexing) 1073 /* hidden dac reg: 1280x1024 */ 1074 WHDR(cinfo, 0x4a); 1075 else 1076 /* hidden dac: nothing */ 1077 WHDR(cinfo, 0); 1078 } 1079 1080 /****************************************************** 1081 * 1082 * 16 bpp 1083 * 1084 */ 1085 1086 else if (var->bits_per_pixel == 16) { 1087 dev_dbg(info->device, "preparing for 16 bit deep display\n"); 1088 switch (cinfo->btype) { 1089 case BT_PICCOLO: 1090 case BT_SPECTRUM: 1091 vga_wseq(regbase, CL_SEQR7, 0x87); 1092 /* Fast Page-Mode writes */ 1093 vga_wseq(regbase, CL_SEQRF, 0xb0); 1094 break; 1095 1096 case BT_PICASSO: 1097 vga_wseq(regbase, CL_SEQR7, 0x27); 1098 /* Fast Page-Mode writes */ 1099 vga_wseq(regbase, CL_SEQRF, 0xb0); 1100 break; 1101 1102 case BT_SD64: 1103 case BT_PICASSO4: 1104 case BT_ALPINE: 1105 /* Extended Sequencer Mode: 256c col. mode */ 1106 vga_wseq(regbase, CL_SEQR7, 1107 cinfo->doubleVCLK ? 0xa3 : 0xa7); 1108 break; 1109 1110 case BT_GD5480: 1111 vga_wseq(regbase, CL_SEQR7, 0x17); 1112 /* We already set SRF and SR1F */ 1113 break; 1114 1115 case BT_LAGUNA: 1116 case BT_LAGUNAB: 1117 vga_wseq(regbase, CL_SEQR7, 1118 vga_rseq(regbase, CL_SEQR7) & ~0x01); 1119 control |= 0x2000; 1120 format |= 0x1400; 1121 threshold |= 0x10; 1122 break; 1123 1124 default: 1125 dev_warn(info->device, "unknown Board\n"); 1126 break; 1127 } 1128 1129 /* mode register: 256 color mode */ 1130 vga_wgfx(regbase, VGA_GFX_MODE, 64); 1131 #ifdef CONFIG_PCI 1132 WHDR(cinfo, cinfo->doubleVCLK ? 0xe1 : 0xc1); 1133 #elif defined(CONFIG_ZORRO) 1134 /* FIXME: CONFIG_PCI and CONFIG_ZORRO may be defined both */ 1135 WHDR(cinfo, 0xa0); /* hidden dac reg: nothing special */ 1136 #endif 1137 } 1138 1139 /****************************************************** 1140 * 1141 * 24 bpp 1142 * 1143 */ 1144 1145 else if (var->bits_per_pixel == 24) { 1146 dev_dbg(info->device, "preparing for 24 bit deep display\n"); 1147 switch (cinfo->btype) { 1148 case BT_PICCOLO: 1149 case BT_SPECTRUM: 1150 vga_wseq(regbase, CL_SEQR7, 0x85); 1151 /* Fast Page-Mode writes */ 1152 vga_wseq(regbase, CL_SEQRF, 0xb0); 1153 break; 1154 1155 case BT_PICASSO: 1156 vga_wseq(regbase, CL_SEQR7, 0x25); 1157 /* Fast Page-Mode writes */ 1158 vga_wseq(regbase, CL_SEQRF, 0xb0); 1159 break; 1160 1161 case BT_SD64: 1162 case BT_PICASSO4: 1163 case BT_ALPINE: 1164 /* Extended Sequencer Mode: 256c col. mode */ 1165 vga_wseq(regbase, CL_SEQR7, 0xa5); 1166 break; 1167 1168 case BT_GD5480: 1169 vga_wseq(regbase, CL_SEQR7, 0x15); 1170 /* We already set SRF and SR1F */ 1171 break; 1172 1173 case BT_LAGUNA: 1174 case BT_LAGUNAB: 1175 vga_wseq(regbase, CL_SEQR7, 1176 vga_rseq(regbase, CL_SEQR7) & ~0x01); 1177 control |= 0x4000; 1178 format |= 0x2400; 1179 threshold |= 0x20; 1180 break; 1181 1182 default: 1183 dev_warn(info->device, "unknown Board\n"); 1184 break; 1185 } 1186 1187 /* mode register: 256 color mode */ 1188 vga_wgfx(regbase, VGA_GFX_MODE, 64); 1189 /* hidden dac reg: 8-8-8 mode (24 or 32) */ 1190 WHDR(cinfo, 0xc5); 1191 } 1192 1193 /****************************************************** 1194 * 1195 * unknown/unsupported bpp 1196 * 1197 */ 1198 1199 else 1200 dev_err(info->device, 1201 "What's this? requested color depth == %d.\n", 1202 var->bits_per_pixel); 1203 1204 pitch = info->fix.line_length >> 3; 1205 vga_wcrt(regbase, VGA_CRTC_OFFSET, pitch & 0xff); 1206 tmp = 0x22; 1207 if (pitch & 0x100) 1208 tmp |= 0x10; /* offset overflow bit */ 1209 1210 /* screen start addr #16-18, fastpagemode cycles */ 1211 vga_wcrt(regbase, CL_CRT1B, tmp); 1212 1213 /* screen start address bit 19 */ 1214 if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) 1215 vga_wcrt(regbase, CL_CRT1D, (pitch >> 9) & 1); 1216 1217 if (is_laguna(cinfo)) { 1218 tmp = 0; 1219 if ((htotal + 5) & 256) 1220 tmp |= 128; 1221 if (hdispend & 256) 1222 tmp |= 64; 1223 if (hsyncstart & 256) 1224 tmp |= 48; 1225 if (vtotal & 1024) 1226 tmp |= 8; 1227 if (vdispend & 1024) 1228 tmp |= 4; 1229 if (vsyncstart & 1024) 1230 tmp |= 3; 1231 1232 vga_wcrt(regbase, CL_CRT1E, tmp); 1233 dev_dbg(info->device, "CRT1e: %d\n", tmp); 1234 } 1235 1236 /* pixel panning */ 1237 vga_wattr(regbase, CL_AR33, 0); 1238 1239 /* [ EGS: SetOffset(); ] */ 1240 /* From SetOffset(): Turn on VideoEnable bit in Attribute controller */ 1241 AttrOn(cinfo); 1242 1243 if (is_laguna(cinfo)) { 1244 /* no tiles */ 1245 fb_writew(control | 0x1000, cinfo->laguna_mmio + 0x402); 1246 fb_writew(format, cinfo->laguna_mmio + 0xc0); 1247 fb_writew(threshold, cinfo->laguna_mmio + 0xea); 1248 } 1249 /* finally, turn on everything - turn off "FullBandwidth" bit */ 1250 /* also, set "DotClock%2" bit where requested */ 1251 tmp = 0x01; 1252 1253 /*** FB_VMODE_CLOCK_HALVE in linux/fb.h not defined anymore ? 1254 if (var->vmode & FB_VMODE_CLOCK_HALVE) 1255 tmp |= 0x08; 1256 */ 1257 1258 vga_wseq(regbase, VGA_SEQ_CLOCK_MODE, tmp); 1259 dev_dbg(info->device, "CL_SEQR1: %d\n", tmp); 1260 1261 #ifdef CIRRUSFB_DEBUG 1262 cirrusfb_dbg_reg_dump(info, NULL); 1263 #endif 1264 1265 return 0; 1266 } 1267 1268 /* for some reason incomprehensible to me, cirrusfb requires that you write 1269 * the registers twice for the settings to take..grr. -dte */ 1270 static int cirrusfb_set_par(struct fb_info *info) 1271 { 1272 cirrusfb_set_par_foo(info); 1273 return cirrusfb_set_par_foo(info); 1274 } 1275 1276 static int cirrusfb_setcolreg(unsigned regno, unsigned red, unsigned green, 1277 unsigned blue, unsigned transp, 1278 struct fb_info *info) 1279 { 1280 struct cirrusfb_info *cinfo = info->par; 1281 1282 if (regno > 255) 1283 return -EINVAL; 1284 1285 if (info->fix.visual == FB_VISUAL_TRUECOLOR) { 1286 u32 v; 1287 red >>= (16 - info->var.red.length); 1288 green >>= (16 - info->var.green.length); 1289 blue >>= (16 - info->var.blue.length); 1290 1291 if (regno >= 16) 1292 return 1; 1293 v = (red << info->var.red.offset) | 1294 (green << info->var.green.offset) | 1295 (blue << info->var.blue.offset); 1296 1297 cinfo->pseudo_palette[regno] = v; 1298 return 0; 1299 } 1300 1301 if (info->var.bits_per_pixel == 8) 1302 WClut(cinfo, regno, red >> 10, green >> 10, blue >> 10); 1303 1304 return 0; 1305 1306 } 1307 1308 /************************************************************************* 1309 cirrusfb_pan_display() 1310 1311 performs display panning - provided hardware permits this 1312 **************************************************************************/ 1313 static int cirrusfb_pan_display(struct fb_var_screeninfo *var, 1314 struct fb_info *info) 1315 { 1316 int xoffset; 1317 unsigned long base; 1318 unsigned char tmp, xpix; 1319 struct cirrusfb_info *cinfo = info->par; 1320 1321 /* no range checks for xoffset and yoffset, */ 1322 /* as fb_pan_display has already done this */ 1323 if (var->vmode & FB_VMODE_YWRAP) 1324 return -EINVAL; 1325 1326 xoffset = var->xoffset * info->var.bits_per_pixel / 8; 1327 1328 base = var->yoffset * info->fix.line_length + xoffset; 1329 1330 if (info->var.bits_per_pixel == 1) { 1331 /* base is already correct */ 1332 xpix = (unsigned char) (var->xoffset % 8); 1333 } else { 1334 base /= 4; 1335 xpix = (unsigned char) ((xoffset % 4) * 2); 1336 } 1337 1338 if (!is_laguna(cinfo)) 1339 cirrusfb_WaitBLT(cinfo->regbase); 1340 1341 /* lower 8 + 8 bits of screen start address */ 1342 vga_wcrt(cinfo->regbase, VGA_CRTC_START_LO, base & 0xff); 1343 vga_wcrt(cinfo->regbase, VGA_CRTC_START_HI, (base >> 8) & 0xff); 1344 1345 /* 0xf2 is %11110010, exclude tmp bits */ 1346 tmp = vga_rcrt(cinfo->regbase, CL_CRT1B) & 0xf2; 1347 /* construct bits 16, 17 and 18 of screen start address */ 1348 if (base & 0x10000) 1349 tmp |= 0x01; 1350 if (base & 0x20000) 1351 tmp |= 0x04; 1352 if (base & 0x40000) 1353 tmp |= 0x08; 1354 1355 vga_wcrt(cinfo->regbase, CL_CRT1B, tmp); 1356 1357 /* construct bit 19 of screen start address */ 1358 if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) { 1359 tmp = vga_rcrt(cinfo->regbase, CL_CRT1D); 1360 if (is_laguna(cinfo)) 1361 tmp = (tmp & ~0x18) | ((base >> 16) & 0x18); 1362 else 1363 tmp = (tmp & ~0x80) | ((base >> 12) & 0x80); 1364 vga_wcrt(cinfo->regbase, CL_CRT1D, tmp); 1365 } 1366 1367 /* write pixel panning value to AR33; this does not quite work in 8bpp 1368 * 1369 * ### Piccolo..? Will this work? 1370 */ 1371 if (info->var.bits_per_pixel == 1) 1372 vga_wattr(cinfo->regbase, CL_AR33, xpix); 1373 1374 return 0; 1375 } 1376 1377 static int cirrusfb_blank(int blank_mode, struct fb_info *info) 1378 { 1379 /* 1380 * Blank the screen if blank_mode != 0, else unblank. If blank == NULL 1381 * then the caller blanks by setting the CLUT (Color Look Up Table) 1382 * to all black. Return 0 if blanking succeeded, != 0 if un-/blanking 1383 * failed due to e.g. a video mode which doesn't support it. 1384 * Implements VESA suspend and powerdown modes on hardware that 1385 * supports disabling hsync/vsync: 1386 * blank_mode == 2: suspend vsync 1387 * blank_mode == 3: suspend hsync 1388 * blank_mode == 4: powerdown 1389 */ 1390 unsigned char val; 1391 struct cirrusfb_info *cinfo = info->par; 1392 int current_mode = cinfo->blank_mode; 1393 1394 dev_dbg(info->device, "ENTER, blank mode = %d\n", blank_mode); 1395 1396 if (info->state != FBINFO_STATE_RUNNING || 1397 current_mode == blank_mode) { 1398 dev_dbg(info->device, "EXIT, returning 0\n"); 1399 return 0; 1400 } 1401 1402 /* Undo current */ 1403 if (current_mode == FB_BLANK_NORMAL || 1404 current_mode == FB_BLANK_UNBLANK) 1405 /* clear "FullBandwidth" bit */ 1406 val = 0; 1407 else 1408 /* set "FullBandwidth" bit */ 1409 val = 0x20; 1410 1411 val |= vga_rseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE) & 0xdf; 1412 vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, val); 1413 1414 switch (blank_mode) { 1415 case FB_BLANK_UNBLANK: 1416 case FB_BLANK_NORMAL: 1417 val = 0x00; 1418 break; 1419 case FB_BLANK_VSYNC_SUSPEND: 1420 val = 0x04; 1421 break; 1422 case FB_BLANK_HSYNC_SUSPEND: 1423 val = 0x02; 1424 break; 1425 case FB_BLANK_POWERDOWN: 1426 val = 0x06; 1427 break; 1428 default: 1429 dev_dbg(info->device, "EXIT, returning 1\n"); 1430 return 1; 1431 } 1432 1433 vga_wgfx(cinfo->regbase, CL_GRE, val); 1434 1435 cinfo->blank_mode = blank_mode; 1436 dev_dbg(info->device, "EXIT, returning 0\n"); 1437 1438 /* Let fbcon do a soft blank for us */ 1439 return (blank_mode == FB_BLANK_NORMAL) ? 1 : 0; 1440 } 1441 1442 /**** END Hardware specific Routines **************************************/ 1443 /****************************************************************************/ 1444 /**** BEGIN Internal Routines ***********************************************/ 1445 1446 static void init_vgachip(struct fb_info *info) 1447 { 1448 struct cirrusfb_info *cinfo = info->par; 1449 const struct cirrusfb_board_info_rec *bi; 1450 1451 assert(cinfo != NULL); 1452 1453 bi = &cirrusfb_board_info[cinfo->btype]; 1454 1455 /* reset board globally */ 1456 switch (cinfo->btype) { 1457 case BT_PICCOLO: 1458 WSFR(cinfo, 0x01); 1459 udelay(500); 1460 WSFR(cinfo, 0x51); 1461 udelay(500); 1462 break; 1463 case BT_PICASSO: 1464 WSFR2(cinfo, 0xff); 1465 udelay(500); 1466 break; 1467 case BT_SD64: 1468 case BT_SPECTRUM: 1469 WSFR(cinfo, 0x1f); 1470 udelay(500); 1471 WSFR(cinfo, 0x4f); 1472 udelay(500); 1473 break; 1474 case BT_PICASSO4: 1475 /* disable flickerfixer */ 1476 vga_wcrt(cinfo->regbase, CL_CRT51, 0x00); 1477 mdelay(100); 1478 /* mode */ 1479 vga_wgfx(cinfo->regbase, CL_GR31, 0x00); 1480 case BT_GD5480: /* fall through */ 1481 /* from Klaus' NetBSD driver: */ 1482 vga_wgfx(cinfo->regbase, CL_GR2F, 0x00); 1483 case BT_ALPINE: /* fall through */ 1484 /* put blitter into 542x compat */ 1485 vga_wgfx(cinfo->regbase, CL_GR33, 0x00); 1486 break; 1487 1488 case BT_LAGUNA: 1489 case BT_LAGUNAB: 1490 /* Nothing to do to reset the board. */ 1491 break; 1492 1493 default: 1494 dev_err(info->device, "Warning: Unknown board type\n"); 1495 break; 1496 } 1497 1498 /* make sure RAM size set by this point */ 1499 assert(info->screen_size > 0); 1500 1501 /* the P4 is not fully initialized here; I rely on it having been */ 1502 /* inited under AmigaOS already, which seems to work just fine */ 1503 /* (Klaus advised to do it this way) */ 1504 1505 if (cinfo->btype != BT_PICASSO4) { 1506 WGen(cinfo, CL_VSSM, 0x10); /* EGS: 0x16 */ 1507 WGen(cinfo, CL_POS102, 0x01); 1508 WGen(cinfo, CL_VSSM, 0x08); /* EGS: 0x0e */ 1509 1510 if (cinfo->btype != BT_SD64) 1511 WGen(cinfo, CL_VSSM2, 0x01); 1512 1513 /* reset sequencer logic */ 1514 vga_wseq(cinfo->regbase, VGA_SEQ_RESET, 0x03); 1515 1516 /* FullBandwidth (video off) and 8/9 dot clock */ 1517 vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, 0x21); 1518 1519 /* "magic cookie" - doesn't make any sense to me.. */ 1520 /* vga_wgfx(cinfo->regbase, CL_GRA, 0xce); */ 1521 /* unlock all extension registers */ 1522 vga_wseq(cinfo->regbase, CL_SEQR6, 0x12); 1523 1524 switch (cinfo->btype) { 1525 case BT_GD5480: 1526 vga_wseq(cinfo->regbase, CL_SEQRF, 0x98); 1527 break; 1528 case BT_ALPINE: 1529 case BT_LAGUNA: 1530 case BT_LAGUNAB: 1531 break; 1532 case BT_SD64: 1533 #ifdef CONFIG_ZORRO 1534 vga_wseq(cinfo->regbase, CL_SEQRF, 0xb8); 1535 #endif 1536 break; 1537 default: 1538 vga_wseq(cinfo->regbase, CL_SEQR16, 0x0f); 1539 vga_wseq(cinfo->regbase, CL_SEQRF, 0xb0); 1540 break; 1541 } 1542 } 1543 /* plane mask: nothing */ 1544 vga_wseq(cinfo->regbase, VGA_SEQ_PLANE_WRITE, 0xff); 1545 /* character map select: doesn't even matter in gx mode */ 1546 vga_wseq(cinfo->regbase, VGA_SEQ_CHARACTER_MAP, 0x00); 1547 /* memory mode: chain4, ext. memory */ 1548 vga_wseq(cinfo->regbase, VGA_SEQ_MEMORY_MODE, 0x0a); 1549 1550 /* controller-internal base address of video memory */ 1551 if (bi->init_sr07) 1552 vga_wseq(cinfo->regbase, CL_SEQR7, bi->sr07); 1553 1554 /* vga_wseq(cinfo->regbase, CL_SEQR8, 0x00); */ 1555 /* EEPROM control: shouldn't be necessary to write to this at all.. */ 1556 1557 /* graphics cursor X position (incomplete; position gives rem. 3 bits */ 1558 vga_wseq(cinfo->regbase, CL_SEQR10, 0x00); 1559 /* graphics cursor Y position (..."... ) */ 1560 vga_wseq(cinfo->regbase, CL_SEQR11, 0x00); 1561 /* graphics cursor attributes */ 1562 vga_wseq(cinfo->regbase, CL_SEQR12, 0x00); 1563 /* graphics cursor pattern address */ 1564 vga_wseq(cinfo->regbase, CL_SEQR13, 0x00); 1565 1566 /* writing these on a P4 might give problems.. */ 1567 if (cinfo->btype != BT_PICASSO4) { 1568 /* configuration readback and ext. color */ 1569 vga_wseq(cinfo->regbase, CL_SEQR17, 0x00); 1570 /* signature generator */ 1571 vga_wseq(cinfo->regbase, CL_SEQR18, 0x02); 1572 } 1573 1574 /* Screen A preset row scan: none */ 1575 vga_wcrt(cinfo->regbase, VGA_CRTC_PRESET_ROW, 0x00); 1576 /* Text cursor start: disable text cursor */ 1577 vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_START, 0x20); 1578 /* Text cursor end: - */ 1579 vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_END, 0x00); 1580 /* text cursor location high: 0 */ 1581 vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_HI, 0x00); 1582 /* text cursor location low: 0 */ 1583 vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_LO, 0x00); 1584 1585 /* Underline Row scanline: - */ 1586 vga_wcrt(cinfo->regbase, VGA_CRTC_UNDERLINE, 0x00); 1587 /* ### add 0x40 for text modes with > 30 MHz pixclock */ 1588 /* ext. display controls: ext.adr. wrap */ 1589 vga_wcrt(cinfo->regbase, CL_CRT1B, 0x02); 1590 1591 /* Set/Reset registers: - */ 1592 vga_wgfx(cinfo->regbase, VGA_GFX_SR_VALUE, 0x00); 1593 /* Set/Reset enable: - */ 1594 vga_wgfx(cinfo->regbase, VGA_GFX_SR_ENABLE, 0x00); 1595 /* Color Compare: - */ 1596 vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_VALUE, 0x00); 1597 /* Data Rotate: - */ 1598 vga_wgfx(cinfo->regbase, VGA_GFX_DATA_ROTATE, 0x00); 1599 /* Read Map Select: - */ 1600 vga_wgfx(cinfo->regbase, VGA_GFX_PLANE_READ, 0x00); 1601 /* Mode: conf. for 16/4/2 color mode, no odd/even, read/write mode 0 */ 1602 vga_wgfx(cinfo->regbase, VGA_GFX_MODE, 0x00); 1603 /* Miscellaneous: memory map base address, graphics mode */ 1604 vga_wgfx(cinfo->regbase, VGA_GFX_MISC, 0x01); 1605 /* Color Don't care: involve all planes */ 1606 vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_MASK, 0x0f); 1607 /* Bit Mask: no mask at all */ 1608 vga_wgfx(cinfo->regbase, VGA_GFX_BIT_MASK, 0xff); 1609 1610 if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64 || 1611 is_laguna(cinfo)) 1612 /* (5434 can't have bit 3 set for bitblt) */ 1613 vga_wgfx(cinfo->regbase, CL_GRB, 0x20); 1614 else 1615 /* Graphics controller mode extensions: finer granularity, 1616 * 8byte data latches 1617 */ 1618 vga_wgfx(cinfo->regbase, CL_GRB, 0x28); 1619 1620 vga_wgfx(cinfo->regbase, CL_GRC, 0xff); /* Color Key compare: - */ 1621 vga_wgfx(cinfo->regbase, CL_GRD, 0x00); /* Color Key compare mask: - */ 1622 vga_wgfx(cinfo->regbase, CL_GRE, 0x00); /* Miscellaneous control: - */ 1623 /* Background color byte 1: - */ 1624 /* vga_wgfx (cinfo->regbase, CL_GR10, 0x00); */ 1625 /* vga_wgfx (cinfo->regbase, CL_GR11, 0x00); */ 1626 1627 /* Attribute Controller palette registers: "identity mapping" */ 1628 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE0, 0x00); 1629 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE1, 0x01); 1630 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE2, 0x02); 1631 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE3, 0x03); 1632 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE4, 0x04); 1633 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE5, 0x05); 1634 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE6, 0x06); 1635 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE7, 0x07); 1636 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE8, 0x08); 1637 vga_wattr(cinfo->regbase, VGA_ATC_PALETTE9, 0x09); 1638 vga_wattr(cinfo->regbase, VGA_ATC_PALETTEA, 0x0a); 1639 vga_wattr(cinfo->regbase, VGA_ATC_PALETTEB, 0x0b); 1640 vga_wattr(cinfo->regbase, VGA_ATC_PALETTEC, 0x0c); 1641 vga_wattr(cinfo->regbase, VGA_ATC_PALETTED, 0x0d); 1642 vga_wattr(cinfo->regbase, VGA_ATC_PALETTEE, 0x0e); 1643 vga_wattr(cinfo->regbase, VGA_ATC_PALETTEF, 0x0f); 1644 1645 /* Attribute Controller mode: graphics mode */ 1646 vga_wattr(cinfo->regbase, VGA_ATC_MODE, 0x01); 1647 /* Overscan color reg.: reg. 0 */ 1648 vga_wattr(cinfo->regbase, VGA_ATC_OVERSCAN, 0x00); 1649 /* Color Plane enable: Enable all 4 planes */ 1650 vga_wattr(cinfo->regbase, VGA_ATC_PLANE_ENABLE, 0x0f); 1651 /* Color Select: - */ 1652 vga_wattr(cinfo->regbase, VGA_ATC_COLOR_PAGE, 0x00); 1653 1654 WGen(cinfo, VGA_PEL_MSK, 0xff); /* Pixel mask: no mask */ 1655 1656 /* BLT Start/status: Blitter reset */ 1657 vga_wgfx(cinfo->regbase, CL_GR31, 0x04); 1658 /* - " - : "end-of-reset" */ 1659 vga_wgfx(cinfo->regbase, CL_GR31, 0x00); 1660 1661 /* misc... */ 1662 WHDR(cinfo, 0); /* Hidden DAC register: - */ 1663 return; 1664 } 1665 1666 static void switch_monitor(struct cirrusfb_info *cinfo, int on) 1667 { 1668 #ifdef CONFIG_ZORRO /* only works on Zorro boards */ 1669 static int IsOn = 0; /* XXX not ok for multiple boards */ 1670 1671 if (cinfo->btype == BT_PICASSO4) 1672 return; /* nothing to switch */ 1673 if (cinfo->btype == BT_ALPINE) 1674 return; /* nothing to switch */ 1675 if (cinfo->btype == BT_GD5480) 1676 return; /* nothing to switch */ 1677 if (cinfo->btype == BT_PICASSO) { 1678 if ((on && !IsOn) || (!on && IsOn)) 1679 WSFR(cinfo, 0xff); 1680 return; 1681 } 1682 if (on) { 1683 switch (cinfo->btype) { 1684 case BT_SD64: 1685 WSFR(cinfo, cinfo->SFR | 0x21); 1686 break; 1687 case BT_PICCOLO: 1688 WSFR(cinfo, cinfo->SFR | 0x28); 1689 break; 1690 case BT_SPECTRUM: 1691 WSFR(cinfo, 0x6f); 1692 break; 1693 default: /* do nothing */ break; 1694 } 1695 } else { 1696 switch (cinfo->btype) { 1697 case BT_SD64: 1698 WSFR(cinfo, cinfo->SFR & 0xde); 1699 break; 1700 case BT_PICCOLO: 1701 WSFR(cinfo, cinfo->SFR & 0xd7); 1702 break; 1703 case BT_SPECTRUM: 1704 WSFR(cinfo, 0x4f); 1705 break; 1706 default: /* do nothing */ 1707 break; 1708 } 1709 } 1710 #endif /* CONFIG_ZORRO */ 1711 } 1712 1713 /******************************************/ 1714 /* Linux 2.6-style accelerated functions */ 1715 /******************************************/ 1716 1717 static int cirrusfb_sync(struct fb_info *info) 1718 { 1719 struct cirrusfb_info *cinfo = info->par; 1720 1721 if (!is_laguna(cinfo)) { 1722 while (vga_rgfx(cinfo->regbase, CL_GR31) & 0x03) 1723 cpu_relax(); 1724 } 1725 return 0; 1726 } 1727 1728 static void cirrusfb_fillrect(struct fb_info *info, 1729 const struct fb_fillrect *region) 1730 { 1731 struct fb_fillrect modded; 1732 int vxres, vyres; 1733 struct cirrusfb_info *cinfo = info->par; 1734 int m = info->var.bits_per_pixel; 1735 u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ? 1736 cinfo->pseudo_palette[region->color] : region->color; 1737 1738 if (info->state != FBINFO_STATE_RUNNING) 1739 return; 1740 if (info->flags & FBINFO_HWACCEL_DISABLED) { 1741 cfb_fillrect(info, region); 1742 return; 1743 } 1744 1745 vxres = info->var.xres_virtual; 1746 vyres = info->var.yres_virtual; 1747 1748 memcpy(&modded, region, sizeof(struct fb_fillrect)); 1749 1750 if (!modded.width || !modded.height || 1751 modded.dx >= vxres || modded.dy >= vyres) 1752 return; 1753 1754 if (modded.dx + modded.width > vxres) 1755 modded.width = vxres - modded.dx; 1756 if (modded.dy + modded.height > vyres) 1757 modded.height = vyres - modded.dy; 1758 1759 cirrusfb_RectFill(cinfo->regbase, 1760 info->var.bits_per_pixel, 1761 (region->dx * m) / 8, region->dy, 1762 (region->width * m) / 8, region->height, 1763 color, color, 1764 info->fix.line_length, 0x40); 1765 } 1766 1767 static void cirrusfb_copyarea(struct fb_info *info, 1768 const struct fb_copyarea *area) 1769 { 1770 struct fb_copyarea modded; 1771 u32 vxres, vyres; 1772 struct cirrusfb_info *cinfo = info->par; 1773 int m = info->var.bits_per_pixel; 1774 1775 if (info->state != FBINFO_STATE_RUNNING) 1776 return; 1777 if (info->flags & FBINFO_HWACCEL_DISABLED) { 1778 cfb_copyarea(info, area); 1779 return; 1780 } 1781 1782 vxres = info->var.xres_virtual; 1783 vyres = info->var.yres_virtual; 1784 memcpy(&modded, area, sizeof(struct fb_copyarea)); 1785 1786 if (!modded.width || !modded.height || 1787 modded.sx >= vxres || modded.sy >= vyres || 1788 modded.dx >= vxres || modded.dy >= vyres) 1789 return; 1790 1791 if (modded.sx + modded.width > vxres) 1792 modded.width = vxres - modded.sx; 1793 if (modded.dx + modded.width > vxres) 1794 modded.width = vxres - modded.dx; 1795 if (modded.sy + modded.height > vyres) 1796 modded.height = vyres - modded.sy; 1797 if (modded.dy + modded.height > vyres) 1798 modded.height = vyres - modded.dy; 1799 1800 cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel, 1801 (area->sx * m) / 8, area->sy, 1802 (area->dx * m) / 8, area->dy, 1803 (area->width * m) / 8, area->height, 1804 info->fix.line_length); 1805 1806 } 1807 1808 static void cirrusfb_imageblit(struct fb_info *info, 1809 const struct fb_image *image) 1810 { 1811 struct cirrusfb_info *cinfo = info->par; 1812 unsigned char op = (info->var.bits_per_pixel == 24) ? 0xc : 0x4; 1813 1814 if (info->state != FBINFO_STATE_RUNNING) 1815 return; 1816 /* Alpine/SD64 does not work at 24bpp ??? */ 1817 if (info->flags & FBINFO_HWACCEL_DISABLED || image->depth != 1) 1818 cfb_imageblit(info, image); 1819 else if ((cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64) && 1820 op == 0xc) 1821 cfb_imageblit(info, image); 1822 else { 1823 unsigned size = ((image->width + 7) >> 3) * image->height; 1824 int m = info->var.bits_per_pixel; 1825 u32 fg, bg; 1826 1827 if (info->var.bits_per_pixel == 8) { 1828 fg = image->fg_color; 1829 bg = image->bg_color; 1830 } else { 1831 fg = ((u32 *)(info->pseudo_palette))[image->fg_color]; 1832 bg = ((u32 *)(info->pseudo_palette))[image->bg_color]; 1833 } 1834 if (info->var.bits_per_pixel == 24) { 1835 /* clear background first */ 1836 cirrusfb_RectFill(cinfo->regbase, 1837 info->var.bits_per_pixel, 1838 (image->dx * m) / 8, image->dy, 1839 (image->width * m) / 8, 1840 image->height, 1841 bg, bg, 1842 info->fix.line_length, 0x40); 1843 } 1844 cirrusfb_RectFill(cinfo->regbase, 1845 info->var.bits_per_pixel, 1846 (image->dx * m) / 8, image->dy, 1847 (image->width * m) / 8, image->height, 1848 fg, bg, 1849 info->fix.line_length, op); 1850 memcpy(info->screen_base, image->data, size); 1851 } 1852 } 1853 1854 #ifdef CONFIG_PCI 1855 static int release_io_ports; 1856 1857 /* Pulled the logic from XFree86 Cirrus driver to get the memory size, 1858 * based on the DRAM bandwidth bit and DRAM bank switching bit. This 1859 * works with 1MB, 2MB and 4MB configurations (which the Motorola boards 1860 * seem to have. */ 1861 static unsigned int cirrusfb_get_memsize(struct fb_info *info, 1862 u8 __iomem *regbase) 1863 { 1864 unsigned long mem; 1865 struct cirrusfb_info *cinfo = info->par; 1866 1867 if (is_laguna(cinfo)) { 1868 unsigned char SR14 = vga_rseq(regbase, CL_SEQR14); 1869 1870 mem = ((SR14 & 7) + 1) << 20; 1871 } else { 1872 unsigned char SRF = vga_rseq(regbase, CL_SEQRF); 1873 switch ((SRF & 0x18)) { 1874 case 0x08: 1875 mem = 512 * 1024; 1876 break; 1877 case 0x10: 1878 mem = 1024 * 1024; 1879 break; 1880 /* 64-bit DRAM data bus width; assume 2MB. 1881 * Also indicates 2MB memory on the 5430. 1882 */ 1883 case 0x18: 1884 mem = 2048 * 1024; 1885 break; 1886 default: 1887 dev_warn(info->device, "Unknown memory size!\n"); 1888 mem = 1024 * 1024; 1889 } 1890 /* If DRAM bank switching is enabled, there must be 1891 * twice as much memory installed. (4MB on the 5434) 1892 */ 1893 if (cinfo->btype != BT_ALPINE && (SRF & 0x80) != 0) 1894 mem *= 2; 1895 } 1896 1897 /* TODO: Handling of GD5446/5480 (see XF86 sources ...) */ 1898 return mem; 1899 } 1900 1901 static void get_pci_addrs(const struct pci_dev *pdev, 1902 unsigned long *display, unsigned long *registers) 1903 { 1904 assert(pdev != NULL); 1905 assert(display != NULL); 1906 assert(registers != NULL); 1907 1908 *display = 0; 1909 *registers = 0; 1910 1911 /* This is a best-guess for now */ 1912 1913 if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) { 1914 *display = pci_resource_start(pdev, 1); 1915 *registers = pci_resource_start(pdev, 0); 1916 } else { 1917 *display = pci_resource_start(pdev, 0); 1918 *registers = pci_resource_start(pdev, 1); 1919 } 1920 1921 assert(*display != 0); 1922 } 1923 1924 static void cirrusfb_pci_unmap(struct fb_info *info) 1925 { 1926 struct pci_dev *pdev = to_pci_dev(info->device); 1927 struct cirrusfb_info *cinfo = info->par; 1928 1929 if (cinfo->laguna_mmio == NULL) 1930 iounmap(cinfo->laguna_mmio); 1931 iounmap(info->screen_base); 1932 #if 0 /* if system didn't claim this region, we would... */ 1933 release_mem_region(0xA0000, 65535); 1934 #endif 1935 if (release_io_ports) 1936 release_region(0x3C0, 32); 1937 pci_release_regions(pdev); 1938 } 1939 #endif /* CONFIG_PCI */ 1940 1941 #ifdef CONFIG_ZORRO 1942 static void cirrusfb_zorro_unmap(struct fb_info *info) 1943 { 1944 struct cirrusfb_info *cinfo = info->par; 1945 struct zorro_dev *zdev = to_zorro_dev(info->device); 1946 1947 if (info->fix.smem_start > 16 * MB_) 1948 iounmap(info->screen_base); 1949 if (info->fix.mmio_start > 16 * MB_) 1950 iounmap(cinfo->regbase); 1951 1952 zorro_release_device(zdev); 1953 } 1954 #endif /* CONFIG_ZORRO */ 1955 1956 /* function table of the above functions */ 1957 static struct fb_ops cirrusfb_ops = { 1958 .owner = THIS_MODULE, 1959 .fb_open = cirrusfb_open, 1960 .fb_release = cirrusfb_release, 1961 .fb_setcolreg = cirrusfb_setcolreg, 1962 .fb_check_var = cirrusfb_check_var, 1963 .fb_set_par = cirrusfb_set_par, 1964 .fb_pan_display = cirrusfb_pan_display, 1965 .fb_blank = cirrusfb_blank, 1966 .fb_fillrect = cirrusfb_fillrect, 1967 .fb_copyarea = cirrusfb_copyarea, 1968 .fb_sync = cirrusfb_sync, 1969 .fb_imageblit = cirrusfb_imageblit, 1970 }; 1971 1972 static int cirrusfb_set_fbinfo(struct fb_info *info) 1973 { 1974 struct cirrusfb_info *cinfo = info->par; 1975 struct fb_var_screeninfo *var = &info->var; 1976 1977 info->pseudo_palette = cinfo->pseudo_palette; 1978 info->flags = FBINFO_DEFAULT 1979 | FBINFO_HWACCEL_XPAN 1980 | FBINFO_HWACCEL_YPAN 1981 | FBINFO_HWACCEL_FILLRECT 1982 | FBINFO_HWACCEL_IMAGEBLIT 1983 | FBINFO_HWACCEL_COPYAREA; 1984 if (noaccel || is_laguna(cinfo)) { 1985 info->flags |= FBINFO_HWACCEL_DISABLED; 1986 info->fix.accel = FB_ACCEL_NONE; 1987 } else 1988 info->fix.accel = FB_ACCEL_CIRRUS_ALPINE; 1989 1990 info->fbops = &cirrusfb_ops; 1991 1992 if (cinfo->btype == BT_GD5480) { 1993 if (var->bits_per_pixel == 16) 1994 info->screen_base += 1 * MB_; 1995 if (var->bits_per_pixel == 32) 1996 info->screen_base += 2 * MB_; 1997 } 1998 1999 /* Fill fix common fields */ 2000 strlcpy(info->fix.id, cirrusfb_board_info[cinfo->btype].name, 2001 sizeof(info->fix.id)); 2002 2003 /* monochrome: only 1 memory plane */ 2004 /* 8 bit and above: Use whole memory area */ 2005 info->fix.smem_len = info->screen_size; 2006 if (var->bits_per_pixel == 1) 2007 info->fix.smem_len /= 4; 2008 info->fix.type_aux = 0; 2009 info->fix.xpanstep = 1; 2010 info->fix.ypanstep = 1; 2011 info->fix.ywrapstep = 0; 2012 2013 /* FIXME: map region at 0xB8000 if available, fill in here */ 2014 info->fix.mmio_len = 0; 2015 2016 fb_alloc_cmap(&info->cmap, 256, 0); 2017 2018 return 0; 2019 } 2020 2021 static int cirrusfb_register(struct fb_info *info) 2022 { 2023 struct cirrusfb_info *cinfo = info->par; 2024 int err; 2025 2026 /* sanity checks */ 2027 assert(cinfo->btype != BT_NONE); 2028 2029 /* set all the vital stuff */ 2030 cirrusfb_set_fbinfo(info); 2031 2032 dev_dbg(info->device, "(RAM start set to: 0x%p)\n", info->screen_base); 2033 2034 err = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8); 2035 if (!err) { 2036 dev_dbg(info->device, "wrong initial video mode\n"); 2037 err = -EINVAL; 2038 goto err_dealloc_cmap; 2039 } 2040 2041 info->var.activate = FB_ACTIVATE_NOW; 2042 2043 err = cirrusfb_check_var(&info->var, info); 2044 if (err < 0) { 2045 /* should never happen */ 2046 dev_dbg(info->device, 2047 "choking on default var... umm, no good.\n"); 2048 goto err_dealloc_cmap; 2049 } 2050 2051 err = register_framebuffer(info); 2052 if (err < 0) { 2053 dev_err(info->device, 2054 "could not register fb device; err = %d!\n", err); 2055 goto err_dealloc_cmap; 2056 } 2057 2058 return 0; 2059 2060 err_dealloc_cmap: 2061 fb_dealloc_cmap(&info->cmap); 2062 return err; 2063 } 2064 2065 static void cirrusfb_cleanup(struct fb_info *info) 2066 { 2067 struct cirrusfb_info *cinfo = info->par; 2068 2069 switch_monitor(cinfo, 0); 2070 unregister_framebuffer(info); 2071 fb_dealloc_cmap(&info->cmap); 2072 dev_dbg(info->device, "Framebuffer unregistered\n"); 2073 cinfo->unmap(info); 2074 framebuffer_release(info); 2075 } 2076 2077 #ifdef CONFIG_PCI 2078 static int cirrusfb_pci_register(struct pci_dev *pdev, 2079 const struct pci_device_id *ent) 2080 { 2081 struct cirrusfb_info *cinfo; 2082 struct fb_info *info; 2083 unsigned long board_addr, board_size; 2084 int ret; 2085 2086 ret = pci_enable_device(pdev); 2087 if (ret < 0) { 2088 printk(KERN_ERR "cirrusfb: Cannot enable PCI device\n"); 2089 goto err_out; 2090 } 2091 2092 info = framebuffer_alloc(sizeof(struct cirrusfb_info), &pdev->dev); 2093 if (!info) { 2094 printk(KERN_ERR "cirrusfb: could not allocate memory\n"); 2095 ret = -ENOMEM; 2096 goto err_out; 2097 } 2098 2099 cinfo = info->par; 2100 cinfo->btype = (enum cirrus_board) ent->driver_data; 2101 2102 dev_dbg(info->device, 2103 " Found PCI device, base address 0 is 0x%Lx, btype set to %d\n", 2104 (unsigned long long)pdev->resource[0].start, cinfo->btype); 2105 dev_dbg(info->device, " base address 1 is 0x%Lx\n", 2106 (unsigned long long)pdev->resource[1].start); 2107 2108 dev_dbg(info->device, 2109 "Attempt to get PCI info for Cirrus Graphics Card\n"); 2110 get_pci_addrs(pdev, &board_addr, &info->fix.mmio_start); 2111 /* FIXME: this forces VGA. alternatives? */ 2112 cinfo->regbase = NULL; 2113 cinfo->laguna_mmio = ioremap(info->fix.mmio_start, 0x1000); 2114 2115 dev_dbg(info->device, "Board address: 0x%lx, register address: 0x%lx\n", 2116 board_addr, info->fix.mmio_start); 2117 2118 board_size = (cinfo->btype == BT_GD5480) ? 2119 32 * MB_ : cirrusfb_get_memsize(info, cinfo->regbase); 2120 2121 ret = pci_request_regions(pdev, "cirrusfb"); 2122 if (ret < 0) { 2123 dev_err(info->device, "cannot reserve region 0x%lx, abort\n", 2124 board_addr); 2125 goto err_release_fb; 2126 } 2127 #if 0 /* if the system didn't claim this region, we would... */ 2128 if (!request_mem_region(0xA0000, 65535, "cirrusfb")) { 2129 dev_err(info->device, "cannot reserve region 0x%lx, abort\n", 2130 0xA0000L); 2131 ret = -EBUSY; 2132 goto err_release_regions; 2133 } 2134 #endif 2135 if (request_region(0x3C0, 32, "cirrusfb")) 2136 release_io_ports = 1; 2137 2138 info->screen_base = ioremap(board_addr, board_size); 2139 if (!info->screen_base) { 2140 ret = -EIO; 2141 goto err_release_legacy; 2142 } 2143 2144 info->fix.smem_start = board_addr; 2145 info->screen_size = board_size; 2146 cinfo->unmap = cirrusfb_pci_unmap; 2147 2148 dev_info(info->device, 2149 "Cirrus Logic chipset on PCI bus, RAM (%lu kB) at 0x%lx\n", 2150 info->screen_size >> 10, board_addr); 2151 pci_set_drvdata(pdev, info); 2152 2153 ret = cirrusfb_register(info); 2154 if (!ret) 2155 return 0; 2156 2157 iounmap(info->screen_base); 2158 err_release_legacy: 2159 if (release_io_ports) 2160 release_region(0x3C0, 32); 2161 #if 0 2162 release_mem_region(0xA0000, 65535); 2163 err_release_regions: 2164 #endif 2165 pci_release_regions(pdev); 2166 err_release_fb: 2167 if (cinfo->laguna_mmio != NULL) 2168 iounmap(cinfo->laguna_mmio); 2169 framebuffer_release(info); 2170 err_out: 2171 return ret; 2172 } 2173 2174 static void cirrusfb_pci_unregister(struct pci_dev *pdev) 2175 { 2176 struct fb_info *info = pci_get_drvdata(pdev); 2177 2178 cirrusfb_cleanup(info); 2179 } 2180 2181 static struct pci_driver cirrusfb_pci_driver = { 2182 .name = "cirrusfb", 2183 .id_table = cirrusfb_pci_table, 2184 .probe = cirrusfb_pci_register, 2185 .remove = cirrusfb_pci_unregister, 2186 #ifdef CONFIG_PM 2187 #if 0 2188 .suspend = cirrusfb_pci_suspend, 2189 .resume = cirrusfb_pci_resume, 2190 #endif 2191 #endif 2192 }; 2193 #endif /* CONFIG_PCI */ 2194 2195 #ifdef CONFIG_ZORRO 2196 static int cirrusfb_zorro_register(struct zorro_dev *z, 2197 const struct zorro_device_id *ent) 2198 { 2199 struct fb_info *info; 2200 int error; 2201 const struct zorrocl *zcl; 2202 enum cirrus_board btype; 2203 unsigned long regbase, ramsize, rambase; 2204 struct cirrusfb_info *cinfo; 2205 2206 info = framebuffer_alloc(sizeof(struct cirrusfb_info), &z->dev); 2207 if (!info) { 2208 printk(KERN_ERR "cirrusfb: could not allocate memory\n"); 2209 return -ENOMEM; 2210 } 2211 2212 zcl = (const struct zorrocl *)ent->driver_data; 2213 btype = zcl->type; 2214 regbase = zorro_resource_start(z) + zcl->regoffset; 2215 ramsize = zcl->ramsize; 2216 if (ramsize) { 2217 rambase = zorro_resource_start(z) + zcl->ramoffset; 2218 if (zorro_resource_len(z) == 64 * MB_) { 2219 /* Quirk for 64 MiB Picasso IV */ 2220 rambase += zcl->ramoffset; 2221 } 2222 } else { 2223 struct zorro_dev *ram = zorro_find_device(zcl->ramid, NULL); 2224 if (!ram || !zorro_resource_len(ram)) { 2225 dev_err(info->device, "No video RAM found\n"); 2226 error = -ENODEV; 2227 goto err_release_fb; 2228 } 2229 rambase = zorro_resource_start(ram); 2230 ramsize = zorro_resource_len(ram); 2231 if (zcl->ramid2 && 2232 (ram = zorro_find_device(zcl->ramid2, NULL))) { 2233 if (zorro_resource_start(ram) != rambase + ramsize) { 2234 dev_warn(info->device, 2235 "Skipping non-contiguous RAM at %pR\n", 2236 &ram->resource); 2237 } else { 2238 ramsize += zorro_resource_len(ram); 2239 } 2240 } 2241 } 2242 2243 dev_info(info->device, 2244 "%s board detected, REG at 0x%lx, %lu MiB RAM at 0x%lx\n", 2245 cirrusfb_board_info[btype].name, regbase, ramsize / MB_, 2246 rambase); 2247 2248 if (!zorro_request_device(z, "cirrusfb")) { 2249 dev_err(info->device, "Cannot reserve %pR\n", &z->resource); 2250 error = -EBUSY; 2251 goto err_release_fb; 2252 } 2253 2254 cinfo = info->par; 2255 cinfo->btype = btype; 2256 2257 info->fix.mmio_start = regbase; 2258 cinfo->regbase = regbase > 16 * MB_ ? ioremap(regbase, 64 * 1024) 2259 : ZTWO_VADDR(regbase); 2260 if (!cinfo->regbase) { 2261 dev_err(info->device, "Cannot map registers\n"); 2262 error = -EIO; 2263 goto err_release_dev; 2264 } 2265 2266 info->fix.smem_start = rambase; 2267 info->screen_size = ramsize; 2268 info->screen_base = rambase > 16 * MB_ ? ioremap(rambase, ramsize) 2269 : ZTWO_VADDR(rambase); 2270 if (!info->screen_base) { 2271 dev_err(info->device, "Cannot map video RAM\n"); 2272 error = -EIO; 2273 goto err_unmap_reg; 2274 } 2275 2276 cinfo->unmap = cirrusfb_zorro_unmap; 2277 2278 dev_info(info->device, 2279 "Cirrus Logic chipset on Zorro bus, RAM (%lu MiB) at 0x%lx\n", 2280 ramsize / MB_, rambase); 2281 2282 /* MCLK select etc. */ 2283 if (cirrusfb_board_info[btype].init_sr1f) 2284 vga_wseq(cinfo->regbase, CL_SEQR1F, 2285 cirrusfb_board_info[btype].sr1f); 2286 2287 error = cirrusfb_register(info); 2288 if (error) { 2289 dev_err(info->device, "Failed to register device, error %d\n", 2290 error); 2291 goto err_unmap_ram; 2292 } 2293 2294 zorro_set_drvdata(z, info); 2295 return 0; 2296 2297 err_unmap_ram: 2298 if (rambase > 16 * MB_) 2299 iounmap(info->screen_base); 2300 2301 err_unmap_reg: 2302 if (regbase > 16 * MB_) 2303 iounmap(cinfo->regbase); 2304 err_release_dev: 2305 zorro_release_device(z); 2306 err_release_fb: 2307 framebuffer_release(info); 2308 return error; 2309 } 2310 2311 void cirrusfb_zorro_unregister(struct zorro_dev *z) 2312 { 2313 struct fb_info *info = zorro_get_drvdata(z); 2314 2315 cirrusfb_cleanup(info); 2316 zorro_set_drvdata(z, NULL); 2317 } 2318 2319 static struct zorro_driver cirrusfb_zorro_driver = { 2320 .name = "cirrusfb", 2321 .id_table = cirrusfb_zorro_table, 2322 .probe = cirrusfb_zorro_register, 2323 .remove = cirrusfb_zorro_unregister, 2324 }; 2325 #endif /* CONFIG_ZORRO */ 2326 2327 #ifndef MODULE 2328 static int __init cirrusfb_setup(char *options) 2329 { 2330 char *this_opt; 2331 2332 if (!options || !*options) 2333 return 0; 2334 2335 while ((this_opt = strsep(&options, ",")) != NULL) { 2336 if (!*this_opt) 2337 continue; 2338 2339 if (!strcmp(this_opt, "noaccel")) 2340 noaccel = 1; 2341 else if (!strncmp(this_opt, "mode:", 5)) 2342 mode_option = this_opt + 5; 2343 else 2344 mode_option = this_opt; 2345 } 2346 return 0; 2347 } 2348 #endif 2349 2350 /* 2351 * Modularization 2352 */ 2353 2354 MODULE_AUTHOR("Copyright 1999,2000 Jeff Garzik <jgarzik@pobox.com>"); 2355 MODULE_DESCRIPTION("Accelerated FBDev driver for Cirrus Logic chips"); 2356 MODULE_LICENSE("GPL"); 2357 2358 static int __init cirrusfb_init(void) 2359 { 2360 int error = 0; 2361 2362 #ifndef MODULE 2363 char *option = NULL; 2364 2365 if (fb_get_options("cirrusfb", &option)) 2366 return -ENODEV; 2367 cirrusfb_setup(option); 2368 #endif 2369 2370 #ifdef CONFIG_ZORRO 2371 error |= zorro_register_driver(&cirrusfb_zorro_driver); 2372 #endif 2373 #ifdef CONFIG_PCI 2374 error |= pci_register_driver(&cirrusfb_pci_driver); 2375 #endif 2376 return error; 2377 } 2378 2379 static void __exit cirrusfb_exit(void) 2380 { 2381 #ifdef CONFIG_PCI 2382 pci_unregister_driver(&cirrusfb_pci_driver); 2383 #endif 2384 #ifdef CONFIG_ZORRO 2385 zorro_unregister_driver(&cirrusfb_zorro_driver); 2386 #endif 2387 } 2388 2389 module_init(cirrusfb_init); 2390 2391 module_param(mode_option, charp, 0); 2392 MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'"); 2393 module_param(noaccel, bool, 0); 2394 MODULE_PARM_DESC(noaccel, "Disable acceleration"); 2395 2396 #ifdef MODULE 2397 module_exit(cirrusfb_exit); 2398 #endif 2399 2400 /**********************************************************************/ 2401 /* about the following functions - I have used the same names for the */ 2402 /* functions as Markus Wild did in his Retina driver for NetBSD as */ 2403 /* they just made sense for this purpose. Apart from that, I wrote */ 2404 /* these functions myself. */ 2405 /**********************************************************************/ 2406 2407 /*** WGen() - write into one of the external/general registers ***/ 2408 static void WGen(const struct cirrusfb_info *cinfo, 2409 int regnum, unsigned char val) 2410 { 2411 unsigned long regofs = 0; 2412 2413 if (cinfo->btype == BT_PICASSO) { 2414 /* Picasso II specific hack */ 2415 /* if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D || 2416 regnum == CL_VSSM2) */ 2417 if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D) 2418 regofs = 0xfff; 2419 } 2420 2421 vga_w(cinfo->regbase, regofs + regnum, val); 2422 } 2423 2424 /*** RGen() - read out one of the external/general registers ***/ 2425 static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum) 2426 { 2427 unsigned long regofs = 0; 2428 2429 if (cinfo->btype == BT_PICASSO) { 2430 /* Picasso II specific hack */ 2431 /* if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D || 2432 regnum == CL_VSSM2) */ 2433 if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D) 2434 regofs = 0xfff; 2435 } 2436 2437 return vga_r(cinfo->regbase, regofs + regnum); 2438 } 2439 2440 /*** AttrOn() - turn on VideoEnable for Attribute controller ***/ 2441 static void AttrOn(const struct cirrusfb_info *cinfo) 2442 { 2443 assert(cinfo != NULL); 2444 2445 if (vga_rcrt(cinfo->regbase, CL_CRT24) & 0x80) { 2446 /* if we're just in "write value" mode, write back the */ 2447 /* same value as before to not modify anything */ 2448 vga_w(cinfo->regbase, VGA_ATT_IW, 2449 vga_r(cinfo->regbase, VGA_ATT_R)); 2450 } 2451 /* turn on video bit */ 2452 /* vga_w(cinfo->regbase, VGA_ATT_IW, 0x20); */ 2453 vga_w(cinfo->regbase, VGA_ATT_IW, 0x33); 2454 2455 /* dummy write on Reg0 to be on "write index" mode next time */ 2456 vga_w(cinfo->regbase, VGA_ATT_IW, 0x00); 2457 } 2458 2459 /*** WHDR() - write into the Hidden DAC register ***/ 2460 /* as the HDR is the only extension register that requires special treatment 2461 * (the other extension registers are accessible just like the "ordinary" 2462 * registers of their functional group) here is a specialized routine for 2463 * accessing the HDR 2464 */ 2465 static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val) 2466 { 2467 unsigned char dummy; 2468 2469 if (is_laguna(cinfo)) 2470 return; 2471 if (cinfo->btype == BT_PICASSO) { 2472 /* Klaus' hint for correct access to HDR on some boards */ 2473 /* first write 0 to pixel mask (3c6) */ 2474 WGen(cinfo, VGA_PEL_MSK, 0x00); 2475 udelay(200); 2476 /* next read dummy from pixel address (3c8) */ 2477 dummy = RGen(cinfo, VGA_PEL_IW); 2478 udelay(200); 2479 } 2480 /* now do the usual stuff to access the HDR */ 2481 2482 dummy = RGen(cinfo, VGA_PEL_MSK); 2483 udelay(200); 2484 dummy = RGen(cinfo, VGA_PEL_MSK); 2485 udelay(200); 2486 dummy = RGen(cinfo, VGA_PEL_MSK); 2487 udelay(200); 2488 dummy = RGen(cinfo, VGA_PEL_MSK); 2489 udelay(200); 2490 2491 WGen(cinfo, VGA_PEL_MSK, val); 2492 udelay(200); 2493 2494 if (cinfo->btype == BT_PICASSO) { 2495 /* now first reset HDR access counter */ 2496 dummy = RGen(cinfo, VGA_PEL_IW); 2497 udelay(200); 2498 2499 /* and at the end, restore the mask value */ 2500 /* ## is this mask always 0xff? */ 2501 WGen(cinfo, VGA_PEL_MSK, 0xff); 2502 udelay(200); 2503 } 2504 } 2505 2506 /*** WSFR() - write to the "special function register" (SFR) ***/ 2507 static void WSFR(struct cirrusfb_info *cinfo, unsigned char val) 2508 { 2509 #ifdef CONFIG_ZORRO 2510 assert(cinfo->regbase != NULL); 2511 cinfo->SFR = val; 2512 z_writeb(val, cinfo->regbase + 0x8000); 2513 #endif 2514 } 2515 2516 /* The Picasso has a second register for switching the monitor bit */ 2517 static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val) 2518 { 2519 #ifdef CONFIG_ZORRO 2520 /* writing an arbitrary value to this one causes the monitor switcher */ 2521 /* to flip to Amiga display */ 2522 assert(cinfo->regbase != NULL); 2523 cinfo->SFR = val; 2524 z_writeb(val, cinfo->regbase + 0x9000); 2525 #endif 2526 } 2527 2528 /*** WClut - set CLUT entry (range: 0..63) ***/ 2529 static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char red, 2530 unsigned char green, unsigned char blue) 2531 { 2532 unsigned int data = VGA_PEL_D; 2533 2534 /* address write mode register is not translated.. */ 2535 vga_w(cinfo->regbase, VGA_PEL_IW, regnum); 2536 2537 if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 || 2538 cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480 || 2539 cinfo->btype == BT_SD64 || is_laguna(cinfo)) { 2540 /* but DAC data register IS, at least for Picasso II */ 2541 if (cinfo->btype == BT_PICASSO) 2542 data += 0xfff; 2543 vga_w(cinfo->regbase, data, red); 2544 vga_w(cinfo->regbase, data, green); 2545 vga_w(cinfo->regbase, data, blue); 2546 } else { 2547 vga_w(cinfo->regbase, data, blue); 2548 vga_w(cinfo->regbase, data, green); 2549 vga_w(cinfo->regbase, data, red); 2550 } 2551 } 2552 2553 #if 0 2554 /*** RClut - read CLUT entry (range 0..63) ***/ 2555 static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char *red, 2556 unsigned char *green, unsigned char *blue) 2557 { 2558 unsigned int data = VGA_PEL_D; 2559 2560 vga_w(cinfo->regbase, VGA_PEL_IR, regnum); 2561 2562 if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 || 2563 cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480) { 2564 if (cinfo->btype == BT_PICASSO) 2565 data += 0xfff; 2566 *red = vga_r(cinfo->regbase, data); 2567 *green = vga_r(cinfo->regbase, data); 2568 *blue = vga_r(cinfo->regbase, data); 2569 } else { 2570 *blue = vga_r(cinfo->regbase, data); 2571 *green = vga_r(cinfo->regbase, data); 2572 *red = vga_r(cinfo->regbase, data); 2573 } 2574 } 2575 #endif 2576 2577 /******************************************************************* 2578 cirrusfb_WaitBLT() 2579 2580 Wait for the BitBLT engine to complete a possible earlier job 2581 *********************************************************************/ 2582 2583 /* FIXME: use interrupts instead */ 2584 static void cirrusfb_WaitBLT(u8 __iomem *regbase) 2585 { 2586 while (vga_rgfx(regbase, CL_GR31) & 0x08) 2587 cpu_relax(); 2588 } 2589 2590 /******************************************************************* 2591 cirrusfb_BitBLT() 2592 2593 perform accelerated "scrolling" 2594 ********************************************************************/ 2595 2596 static void cirrusfb_set_blitter(u8 __iomem *regbase, 2597 u_short nwidth, u_short nheight, 2598 u_long nsrc, u_long ndest, 2599 u_short bltmode, u_short line_length) 2600 2601 { 2602 /* pitch: set to line_length */ 2603 /* dest pitch low */ 2604 vga_wgfx(regbase, CL_GR24, line_length & 0xff); 2605 /* dest pitch hi */ 2606 vga_wgfx(regbase, CL_GR25, line_length >> 8); 2607 /* source pitch low */ 2608 vga_wgfx(regbase, CL_GR26, line_length & 0xff); 2609 /* source pitch hi */ 2610 vga_wgfx(regbase, CL_GR27, line_length >> 8); 2611 2612 /* BLT width: actual number of pixels - 1 */ 2613 /* BLT width low */ 2614 vga_wgfx(regbase, CL_GR20, nwidth & 0xff); 2615 /* BLT width hi */ 2616 vga_wgfx(regbase, CL_GR21, nwidth >> 8); 2617 2618 /* BLT height: actual number of lines -1 */ 2619 /* BLT height low */ 2620 vga_wgfx(regbase, CL_GR22, nheight & 0xff); 2621 /* BLT width hi */ 2622 vga_wgfx(regbase, CL_GR23, nheight >> 8); 2623 2624 /* BLT destination */ 2625 /* BLT dest low */ 2626 vga_wgfx(regbase, CL_GR28, (u_char) (ndest & 0xff)); 2627 /* BLT dest mid */ 2628 vga_wgfx(regbase, CL_GR29, (u_char) (ndest >> 8)); 2629 /* BLT dest hi */ 2630 vga_wgfx(regbase, CL_GR2A, (u_char) (ndest >> 16)); 2631 2632 /* BLT source */ 2633 /* BLT src low */ 2634 vga_wgfx(regbase, CL_GR2C, (u_char) (nsrc & 0xff)); 2635 /* BLT src mid */ 2636 vga_wgfx(regbase, CL_GR2D, (u_char) (nsrc >> 8)); 2637 /* BLT src hi */ 2638 vga_wgfx(regbase, CL_GR2E, (u_char) (nsrc >> 16)); 2639 2640 /* BLT mode */ 2641 vga_wgfx(regbase, CL_GR30, bltmode); /* BLT mode */ 2642 2643 /* BLT ROP: SrcCopy */ 2644 vga_wgfx(regbase, CL_GR32, 0x0d); /* BLT ROP */ 2645 2646 /* and finally: GO! */ 2647 vga_wgfx(regbase, CL_GR31, 0x02); /* BLT Start/status */ 2648 } 2649 2650 /******************************************************************* 2651 cirrusfb_BitBLT() 2652 2653 perform accelerated "scrolling" 2654 ********************************************************************/ 2655 2656 static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel, 2657 u_short curx, u_short cury, 2658 u_short destx, u_short desty, 2659 u_short width, u_short height, 2660 u_short line_length) 2661 { 2662 u_short nwidth = width - 1; 2663 u_short nheight = height - 1; 2664 u_long nsrc, ndest; 2665 u_char bltmode; 2666 2667 bltmode = 0x00; 2668 /* if source adr < dest addr, do the Blt backwards */ 2669 if (cury <= desty) { 2670 if (cury == desty) { 2671 /* if src and dest are on the same line, check x */ 2672 if (curx < destx) 2673 bltmode |= 0x01; 2674 } else 2675 bltmode |= 0x01; 2676 } 2677 /* standard case: forward blitting */ 2678 nsrc = (cury * line_length) + curx; 2679 ndest = (desty * line_length) + destx; 2680 if (bltmode) { 2681 /* this means start addresses are at the end, 2682 * counting backwards 2683 */ 2684 nsrc += nheight * line_length + nwidth; 2685 ndest += nheight * line_length + nwidth; 2686 } 2687 2688 cirrusfb_WaitBLT(regbase); 2689 2690 cirrusfb_set_blitter(regbase, nwidth, nheight, 2691 nsrc, ndest, bltmode, line_length); 2692 } 2693 2694 /******************************************************************* 2695 cirrusfb_RectFill() 2696 2697 perform accelerated rectangle fill 2698 ********************************************************************/ 2699 2700 static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel, 2701 u_short x, u_short y, u_short width, u_short height, 2702 u32 fg_color, u32 bg_color, u_short line_length, 2703 u_char blitmode) 2704 { 2705 u_long ndest = (y * line_length) + x; 2706 u_char op; 2707 2708 cirrusfb_WaitBLT(regbase); 2709 2710 /* This is a ColorExpand Blt, using the */ 2711 /* same color for foreground and background */ 2712 vga_wgfx(regbase, VGA_GFX_SR_VALUE, bg_color); 2713 vga_wgfx(regbase, VGA_GFX_SR_ENABLE, fg_color); 2714 2715 op = 0x80; 2716 if (bits_per_pixel >= 16) { 2717 vga_wgfx(regbase, CL_GR10, bg_color >> 8); 2718 vga_wgfx(regbase, CL_GR11, fg_color >> 8); 2719 op = 0x90; 2720 } 2721 if (bits_per_pixel >= 24) { 2722 vga_wgfx(regbase, CL_GR12, bg_color >> 16); 2723 vga_wgfx(regbase, CL_GR13, fg_color >> 16); 2724 op = 0xa0; 2725 } 2726 if (bits_per_pixel == 32) { 2727 vga_wgfx(regbase, CL_GR14, bg_color >> 24); 2728 vga_wgfx(regbase, CL_GR15, fg_color >> 24); 2729 op = 0xb0; 2730 } 2731 cirrusfb_set_blitter(regbase, width - 1, height - 1, 2732 0, ndest, op | blitmode, line_length); 2733 } 2734 2735 /************************************************************************** 2736 * bestclock() - determine closest possible clock lower(?) than the 2737 * desired pixel clock 2738 **************************************************************************/ 2739 static void bestclock(long freq, int *nom, int *den, int *div) 2740 { 2741 int n, d; 2742 long h, diff; 2743 2744 assert(nom != NULL); 2745 assert(den != NULL); 2746 assert(div != NULL); 2747 2748 *nom = 0; 2749 *den = 0; 2750 *div = 0; 2751 2752 if (freq < 8000) 2753 freq = 8000; 2754 2755 diff = freq; 2756 2757 for (n = 32; n < 128; n++) { 2758 int s = 0; 2759 2760 d = (14318 * n) / freq; 2761 if ((d >= 7) && (d <= 63)) { 2762 int temp = d; 2763 2764 if (temp > 31) { 2765 s = 1; 2766 temp >>= 1; 2767 } 2768 h = ((14318 * n) / temp) >> s; 2769 h = h > freq ? h - freq : freq - h; 2770 if (h < diff) { 2771 diff = h; 2772 *nom = n; 2773 *den = temp; 2774 *div = s; 2775 } 2776 } 2777 d++; 2778 if ((d >= 7) && (d <= 63)) { 2779 if (d > 31) { 2780 s = 1; 2781 d >>= 1; 2782 } 2783 h = ((14318 * n) / d) >> s; 2784 h = h > freq ? h - freq : freq - h; 2785 if (h < diff) { 2786 diff = h; 2787 *nom = n; 2788 *den = d; 2789 *div = s; 2790 } 2791 } 2792 } 2793 } 2794 2795 /* ------------------------------------------------------------------------- 2796 * 2797 * debugging functions 2798 * 2799 * ------------------------------------------------------------------------- 2800 */ 2801 2802 #ifdef CIRRUSFB_DEBUG 2803 2804 /** 2805 * cirrusfb_dbg_print_regs 2806 * @base: If using newmmio, the newmmio base address, otherwise %NULL 2807 * @reg_class: type of registers to read: %CRT, or %SEQ 2808 * 2809 * DESCRIPTION: 2810 * Dumps the given list of VGA CRTC registers. If @base is %NULL, 2811 * old-style I/O ports are queried for information, otherwise MMIO is 2812 * used at the given @base address to query the information. 2813 */ 2814 2815 static void cirrusfb_dbg_print_regs(struct fb_info *info, 2816 caddr_t regbase, 2817 enum cirrusfb_dbg_reg_class reg_class, ...) 2818 { 2819 va_list list; 2820 unsigned char val = 0; 2821 unsigned reg; 2822 char *name; 2823 2824 va_start(list, reg_class); 2825 2826 name = va_arg(list, char *); 2827 while (name != NULL) { 2828 reg = va_arg(list, int); 2829 2830 switch (reg_class) { 2831 case CRT: 2832 val = vga_rcrt(regbase, (unsigned char) reg); 2833 break; 2834 case SEQ: 2835 val = vga_rseq(regbase, (unsigned char) reg); 2836 break; 2837 default: 2838 /* should never occur */ 2839 assert(false); 2840 break; 2841 } 2842 2843 dev_dbg(info->device, "%8s = 0x%02X\n", name, val); 2844 2845 name = va_arg(list, char *); 2846 } 2847 2848 va_end(list); 2849 } 2850 2851 /** 2852 * cirrusfb_dbg_reg_dump 2853 * @base: If using newmmio, the newmmio base address, otherwise %NULL 2854 * 2855 * DESCRIPTION: 2856 * Dumps a list of interesting VGA and CIRRUSFB registers. If @base is %NULL, 2857 * old-style I/O ports are queried for information, otherwise MMIO is 2858 * used at the given @base address to query the information. 2859 */ 2860 2861 static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase) 2862 { 2863 dev_dbg(info->device, "VGA CRTC register dump:\n"); 2864 2865 cirrusfb_dbg_print_regs(info, regbase, CRT, 2866 "CR00", 0x00, 2867 "CR01", 0x01, 2868 "CR02", 0x02, 2869 "CR03", 0x03, 2870 "CR04", 0x04, 2871 "CR05", 0x05, 2872 "CR06", 0x06, 2873 "CR07", 0x07, 2874 "CR08", 0x08, 2875 "CR09", 0x09, 2876 "CR0A", 0x0A, 2877 "CR0B", 0x0B, 2878 "CR0C", 0x0C, 2879 "CR0D", 0x0D, 2880 "CR0E", 0x0E, 2881 "CR0F", 0x0F, 2882 "CR10", 0x10, 2883 "CR11", 0x11, 2884 "CR12", 0x12, 2885 "CR13", 0x13, 2886 "CR14", 0x14, 2887 "CR15", 0x15, 2888 "CR16", 0x16, 2889 "CR17", 0x17, 2890 "CR18", 0x18, 2891 "CR22", 0x22, 2892 "CR24", 0x24, 2893 "CR26", 0x26, 2894 "CR2D", 0x2D, 2895 "CR2E", 0x2E, 2896 "CR2F", 0x2F, 2897 "CR30", 0x30, 2898 "CR31", 0x31, 2899 "CR32", 0x32, 2900 "CR33", 0x33, 2901 "CR34", 0x34, 2902 "CR35", 0x35, 2903 "CR36", 0x36, 2904 "CR37", 0x37, 2905 "CR38", 0x38, 2906 "CR39", 0x39, 2907 "CR3A", 0x3A, 2908 "CR3B", 0x3B, 2909 "CR3C", 0x3C, 2910 "CR3D", 0x3D, 2911 "CR3E", 0x3E, 2912 "CR3F", 0x3F, 2913 NULL); 2914 2915 dev_dbg(info->device, "\n"); 2916 2917 dev_dbg(info->device, "VGA SEQ register dump:\n"); 2918 2919 cirrusfb_dbg_print_regs(info, regbase, SEQ, 2920 "SR00", 0x00, 2921 "SR01", 0x01, 2922 "SR02", 0x02, 2923 "SR03", 0x03, 2924 "SR04", 0x04, 2925 "SR08", 0x08, 2926 "SR09", 0x09, 2927 "SR0A", 0x0A, 2928 "SR0B", 0x0B, 2929 "SR0D", 0x0D, 2930 "SR10", 0x10, 2931 "SR11", 0x11, 2932 "SR12", 0x12, 2933 "SR13", 0x13, 2934 "SR14", 0x14, 2935 "SR15", 0x15, 2936 "SR16", 0x16, 2937 "SR17", 0x17, 2938 "SR18", 0x18, 2939 "SR19", 0x19, 2940 "SR1A", 0x1A, 2941 "SR1B", 0x1B, 2942 "SR1C", 0x1C, 2943 "SR1D", 0x1D, 2944 "SR1E", 0x1E, 2945 "SR1F", 0x1F, 2946 NULL); 2947 2948 dev_dbg(info->device, "\n"); 2949 } 2950 2951 #endif /* CIRRUSFB_DEBUG */ 2952 2953