ct_regs.c revision c06b6b69
1/* 2 * Created 1998 by David Bateman <dbateman@eng.uts.edu.au> 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of the authors not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. The authors makes no representations 11 * about the suitability of this software for any purpose. It is provided 12 * "as is" without express or implied warranty. 13 * 14 * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 */ 22/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/ct_regs.c,v 1.8tsi Exp $ */ 23 24#ifdef HAVE_CONFIG_H 25#include "config.h" 26#endif 27 28/* 29 * The functions in this file are used to read/write the C&T extension register 30 * and supply MMIO replacements of the VGA register access functions in 31 * vgaHW.c for chips that support MMIO access (eg 69000). Unlike the MGA 32 * chips, for instance, the C&T chipsets don't have a direct mapping between 33 * the MMIO mapped vga registers and the PIO versions. 34 * 35 * In General, these are the ONLY supported way of access the video processors 36 * registers. Exception are 37 * 38 * 1) chipsFindIsaDevice, where we don't know the chipset and so we don't know 39 * if the chipset supports MMIO access to its VGA registers, and we don't 40 * know the chips MemBase address and so can't map the VGA registers even 41 * if the chip did support MMIO. This effectively limits the use of non-PCI 42 * MMIO and multihead to a single card accessing 0x3D6/0x3D7. I.E. You can 43 * only have a single C&T card in a non-PCI multihead arrangement. Also as 44 * ISA has no method to disable I/O access to a card ISA multihead will 45 * never be supported. 46 * 47 * 2) ct_Blitter.h, ct_BlitMM.h and ct_BltHiQV.h, where speed is crucial and 48 * we know exactly whether we are using MMIO or PIO. 49 * 50 * 3) The 6554x 32bit DRxx in ct_cursor.c where the choice between MMIO and 51 * PIO is made explicitly 52 */ 53 54 55/* All drivers should typically include these */ 56#include "xf86.h" 57#include "xf86_OSproc.h" 58 59/* Everything using inb/outb, etc needs "compiler.h" */ 60#include "compiler.h" 61 62/* Drivers for PCI hardware need this */ 63#include "xf86PciInfo.h" 64 65/* Drivers that need to access the PCI config space directly need this */ 66#include "xf86Pci.h" 67 68/* This is used for module versioning */ 69#include "xf86Version.h" 70 71/* Driver specific headers */ 72#include "ct_driver.h" 73 74#define CHIPS_MONO_STAT_1 0x3BA 75#define CHIPS_STAT_0 0x3BA 76#define CHIPS_MSS 0x3CB 77#define CHIPS_IOSS 0x3CD 78#define CHIPS_FR_INDEX 0x3D0 79#define CHIPS_FR_DATA 0x3D1 80#define CHIPS_MR_INDEX 0x3D2 81#define CHIPS_MR_DATA 0x3D3 82#define CHIPS_XR_INDEX 0x3D6 83#define CHIPS_XR_DATA 0x3D7 84#define CHIPS_COLOR_STAT_1 0x3DA 85 86#define CHIPS_MMIO_MONO_CRTC_INDEX 0x768 87#define CHIPS_MMIO_MONO_CRTC_DATA 0x769 88#define CHIPS_MMIO_MONO_STAT_1 0x774 89#define CHIPS_MMIO_ATTR_INDEX 0x780 90#define CHIPS_MMIO_ATTR_DATA_W 0x780 91#define CHIPS_MMIO_ATTR_DATA_R 0x781 92#define CHIPS_MMIO_STAT_0 0x784 93#define CHIPS_MMIO_MISC_OUT_W 0x784 94#define CHIPS_MMIO_SEQ_INDEX 0x788 95#define CHIPS_MMIO_SEQ_DATA 0x789 96#define CHIPS_MMIO_DAC_MASK 0x78C 97#define CHIPS_MMIO_DAC_READ_ADDR 0x78D 98#define CHIPS_MMIO_DAC_WRITE_ADDR 0x790 99#define CHIPS_MMIO_DAC_DATA 0x791 100#define CHIPS_MMIO_FEATURE_R 0x794 101#define CHIPS_MMIO_MSS 0x795 102#define CHIPS_MMIO_MISC_OUT_R 0x798 103#define CHIPS_MMIO_IOSS 0x799 104#define CHIPS_MMIO_GRAPH_INDEX 0x79C 105#define CHIPS_MMIO_GRAPH_DATA 0x79D 106#define CHIPS_MMIO_FR_INDEX 0x7A0 107#define CHIPS_MMIO_FR_DATA 0x7A1 108#define CHIPS_MMIO_MR_INDEX 0x7A4 109#define CHIPS_MMIO_MR_DATA 0x7A5 110#define CHIPS_MMIO_COLOR_CRTC_INDEX 0x7A8 111#define CHIPS_MMIO_COLOR_CRTC_DATA 0x7A9 112#define CHIPS_MMIO_XR_INDEX 0x7AC 113#define CHIPS_MMIO_XR_DATA 0x7AD 114#define CHIPS_MMIO_COLOR_STAT_1 0x7B4 115 116/* 117 * PIO Access to the C&T extension registers 118 */ 119void 120chipsStdWriteXR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 121{ 122 outb(cPtr->PIOBase + CHIPS_XR_INDEX, index); 123 outb(cPtr->PIOBase + CHIPS_XR_DATA, value); 124} 125 126static CARD8 127chipsStdReadXR(CHIPSPtr cPtr, CARD8 index) 128{ 129 outb(cPtr->PIOBase + CHIPS_XR_INDEX, index); 130 return inb(cPtr->PIOBase + CHIPS_XR_DATA); 131} 132 133static void 134chipsStdWriteFR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 135{ 136 outb(cPtr->PIOBase + CHIPS_FR_INDEX, index); 137 outb(cPtr->PIOBase + CHIPS_FR_DATA, value); 138} 139 140static CARD8 141chipsStdReadFR(CHIPSPtr cPtr, CARD8 index) 142{ 143 outb(cPtr->PIOBase + CHIPS_FR_INDEX, index); 144 return inb(cPtr->PIOBase + CHIPS_FR_DATA); 145} 146 147static void 148chipsStdWriteMR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 149{ 150 outb(cPtr->PIOBase + CHIPS_MR_INDEX, index); 151 outb(cPtr->PIOBase + CHIPS_MR_DATA, value); 152} 153 154static CARD8 155chipsStdReadMR(CHIPSPtr cPtr, CARD8 index) 156{ 157 outb(cPtr->PIOBase + CHIPS_MR_INDEX, index); 158 return inb(cPtr->PIOBase + CHIPS_MR_DATA); 159} 160 161static void 162chipsStdWriteMSS(CHIPSPtr cPtr, vgaHWPtr hwp, CARD8 value) 163{ 164 outb(cPtr->PIOBase + CHIPS_MSS, value); 165} 166 167static CARD8 168chipsStdReadMSS(CHIPSPtr cPtr) 169{ 170 return inb(cPtr->PIOBase + CHIPS_MSS); 171} 172 173static void 174chipsStdWriteIOSS(CHIPSPtr cPtr, CARD8 value) 175{ 176 outb(cPtr->PIOBase + CHIPS_IOSS, value); 177} 178 179static CARD8 180chipsStdReadIOSS(CHIPSPtr cPtr) 181{ 182 return inb(cPtr->PIOBase + CHIPS_IOSS); 183} 184 185void 186CHIPSSetStdExtFuncs(CHIPSPtr cPtr) 187{ 188 cPtr->writeFR = chipsStdWriteFR; 189 cPtr->readFR = chipsStdReadFR; 190 cPtr->writeMR = chipsStdWriteMR; 191 cPtr->readMR = chipsStdReadMR; 192 cPtr->writeXR = chipsStdWriteXR; 193 cPtr->readXR = chipsStdReadXR; 194 cPtr->writeMSS = chipsStdWriteMSS; 195 cPtr->readMSS = chipsStdReadMSS; 196 cPtr->writeIOSS = chipsStdWriteIOSS; 197 cPtr->readIOSS = chipsStdReadIOSS; 198} 199 200/* 201 * MMIO Access to the C&T extension registers 202 */ 203 204#define chipsminb(p) MMIO_IN8(cPtr->MMIOBaseVGA, (p)) 205#define chipsmoutb(p,v) MMIO_OUT8(cPtr->MMIOBaseVGA, (p),(v)) 206 207static void 208chipsMmioWriteXR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 209{ 210 chipsmoutb(CHIPS_MMIO_XR_INDEX, index); 211 chipsmoutb(CHIPS_MMIO_XR_DATA, value); 212} 213 214static CARD8 215chipsMmioReadXR(CHIPSPtr cPtr, CARD8 index) 216{ 217 chipsmoutb(CHIPS_MMIO_XR_INDEX, index); 218 return chipsminb(CHIPS_MMIO_XR_DATA); 219} 220 221static void 222chipsMmioWriteFR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 223{ 224 chipsmoutb(CHIPS_MMIO_FR_INDEX, index); 225 chipsmoutb(CHIPS_MMIO_FR_DATA, value); 226} 227 228static CARD8 229chipsMmioReadFR(CHIPSPtr cPtr, CARD8 index) 230{ 231 chipsmoutb(CHIPS_MMIO_FR_INDEX, index); 232 return chipsminb(CHIPS_MMIO_FR_DATA); 233} 234 235static void 236chipsMmioWriteMR(CHIPSPtr cPtr, CARD8 index, CARD8 value) 237{ 238 chipsmoutb(CHIPS_MMIO_MR_INDEX, index); 239 chipsmoutb(CHIPS_MMIO_MR_DATA, value); 240} 241 242static CARD8 243chipsMmioReadMR(CHIPSPtr cPtr, CARD8 index) 244{ 245 chipsmoutb(CHIPS_MMIO_MR_INDEX, index); 246 return chipsminb(CHIPS_MMIO_MR_DATA); 247} 248 249static void 250chipsMmioWriteMSS(CHIPSPtr cPtr, vgaHWPtr hwp, CARD8 value) 251{ 252 /* 69030 MMIO Fix. 253 * 254 * <value> determines which MMIOBase to use; either 255 * Pipe A or Pipe B. -GHB 256 */ 257 if ((value & MSS_SHADOW) == MSS_PIPE_B) 258 cPtr->MMIOBaseVGA = cPtr->MMIOBasePipeB; 259 else 260 cPtr->MMIOBaseVGA = cPtr->MMIOBasePipeA; 261 262 hwp->MMIOBase = cPtr->MMIOBaseVGA; 263 264 /* Since our Pipe constants don't set bit 3 of MSS, the value 265 * written here has no effect on the hardware's behavior. It 266 * does allow us to use the value returned by readMSS() to key 267 * the above logic, though. -GHB 268 */ 269 chipsmoutb(CHIPS_MMIO_MSS, value); 270} 271 272static CARD8 273chipsMmioReadMSS(CHIPSPtr cPtr) 274{ 275 return chipsminb(CHIPS_MMIO_MSS); 276} 277 278static void 279chipsMmioWriteIOSS(CHIPSPtr cPtr, CARD8 value) 280{ 281 chipsmoutb(CHIPS_MMIO_IOSS, value); 282} 283 284static CARD8 285chipsMmioReadIOSS(CHIPSPtr cPtr) 286{ 287 return chipsminb(CHIPS_MMIO_IOSS); 288} 289 290void 291CHIPSSetMmioExtFuncs(CHIPSPtr cPtr) 292{ 293 cPtr->writeFR = chipsMmioWriteFR; 294 cPtr->readFR = chipsMmioReadFR; 295 cPtr->writeMR = chipsMmioWriteMR; 296 cPtr->readMR = chipsMmioReadMR; 297 cPtr->writeXR = chipsMmioWriteXR; 298 cPtr->readXR = chipsMmioReadXR; 299 cPtr->writeMSS = chipsMmioWriteMSS; 300 cPtr->readMSS = chipsMmioReadMSS; 301 cPtr->writeIOSS = chipsMmioWriteIOSS; 302 cPtr->readIOSS = chipsMmioReadIOSS; 303} 304 305/* 306 * MMIO versions of the VGA register access functions. 307 */ 308 309#define minb(p) MMIO_IN8(hwp->MMIOBase, (p)) 310#define moutb(p,v) MMIO_OUT8(hwp->MMIOBase, (p),(v)) 311 312static void 313chipsMmioWriteCrtc(vgaHWPtr hwp, CARD8 index, CARD8 value) 314{ 315 if (hwp->IOBase == VGA_IOBASE_MONO) { 316 moutb(CHIPS_MMIO_MONO_CRTC_INDEX, index); 317 moutb(CHIPS_MMIO_MONO_CRTC_DATA, value); 318 } else { 319 moutb(CHIPS_MMIO_COLOR_CRTC_INDEX, index); 320 moutb(CHIPS_MMIO_COLOR_CRTC_DATA, value); 321 } 322} 323 324static CARD8 325chipsMmioReadCrtc(vgaHWPtr hwp, CARD8 index) 326{ 327 if (hwp->IOBase == VGA_IOBASE_MONO) { 328 moutb(CHIPS_MMIO_MONO_CRTC_INDEX, index); 329 return minb(CHIPS_MMIO_MONO_CRTC_DATA); 330 } else { 331 moutb(CHIPS_MMIO_COLOR_CRTC_INDEX, index); 332 return minb(CHIPS_MMIO_COLOR_CRTC_DATA); 333 } 334} 335 336static void 337chipsMmioWriteGr(vgaHWPtr hwp, CARD8 index, CARD8 value) 338{ 339 moutb(CHIPS_MMIO_GRAPH_INDEX, index); 340 moutb(CHIPS_MMIO_GRAPH_DATA, value); 341} 342 343static CARD8 344chipsMmioReadGr(vgaHWPtr hwp, CARD8 index) 345{ 346 moutb(CHIPS_MMIO_GRAPH_INDEX, index); 347 return minb(CHIPS_MMIO_GRAPH_DATA); 348} 349 350static void 351chipsMmioWriteSeq(vgaHWPtr hwp, CARD8 index, CARD8 value) 352{ 353 moutb(CHIPS_MMIO_SEQ_INDEX, index); 354 moutb(CHIPS_MMIO_SEQ_DATA, value); 355} 356 357static CARD8 358chipsMmioReadSeq(vgaHWPtr hwp, CARD8 index) 359{ 360 moutb(CHIPS_MMIO_SEQ_INDEX, index); 361 return minb(CHIPS_MMIO_SEQ_DATA); 362} 363 364static void 365chipsMmioWriteAttr(vgaHWPtr hwp, CARD8 index, CARD8 value) 366{ 367 if (hwp->paletteEnabled) 368 index &= ~0x20; 369 else 370 index |= 0x20; 371 372 if (hwp->IOBase == VGA_IOBASE_MONO) 373 (void) minb(CHIPS_MMIO_MONO_STAT_1); 374 else 375 (void) minb(CHIPS_MMIO_COLOR_STAT_1); 376 moutb(CHIPS_MMIO_ATTR_INDEX, index); 377 moutb(CHIPS_MMIO_ATTR_DATA_W, value); 378} 379 380static CARD8 381chipsMmioReadAttr(vgaHWPtr hwp, CARD8 index) 382{ 383 if (hwp->paletteEnabled) 384 index &= ~0x20; 385 else 386 index |= 0x20; 387 388 if (hwp->IOBase == VGA_IOBASE_MONO) 389 (void) minb(CHIPS_MMIO_MONO_STAT_1); 390 else 391 (void) minb(CHIPS_MMIO_COLOR_STAT_1); 392 moutb(CHIPS_MMIO_ATTR_INDEX, index); 393 return minb(CHIPS_MMIO_ATTR_DATA_R); 394} 395 396static void 397chipsMmioWriteMiscOut(vgaHWPtr hwp, CARD8 value) 398{ 399 moutb(CHIPS_MMIO_MISC_OUT_W, value); 400} 401 402static CARD8 403chipsMmioReadMiscOut(vgaHWPtr hwp) 404{ 405 return minb(CHIPS_MMIO_MISC_OUT_R); 406} 407 408static void 409chipsMmioEnablePalette(vgaHWPtr hwp) 410{ 411 if (hwp->IOBase == VGA_IOBASE_MONO) 412 (void) minb(CHIPS_MMIO_MONO_STAT_1); 413 else 414 (void) minb(CHIPS_MMIO_COLOR_STAT_1); 415 moutb(CHIPS_MMIO_ATTR_INDEX, 0x00); 416 hwp->paletteEnabled = TRUE; 417} 418 419static void 420chipsMmioDisablePalette(vgaHWPtr hwp) 421{ 422 if (hwp->IOBase == VGA_IOBASE_MONO) 423 (void) minb(CHIPS_MMIO_MONO_STAT_1); 424 else 425 (void) minb(CHIPS_MMIO_COLOR_STAT_1); 426 moutb(CHIPS_MMIO_ATTR_INDEX, 0x20); 427 hwp->paletteEnabled = FALSE; 428} 429 430static void 431chipsMmioWriteDacMask(vgaHWPtr hwp, CARD8 value) 432{ 433 moutb(CHIPS_MMIO_DAC_MASK, value); 434} 435 436static CARD8 437chipsMmioReadDacMask(vgaHWPtr hwp) 438{ 439 return minb(CHIPS_MMIO_DAC_MASK); 440} 441 442static void 443chipsMmioWriteDacReadAddr(vgaHWPtr hwp, CARD8 value) 444{ 445 moutb(CHIPS_MMIO_DAC_READ_ADDR, value); 446} 447 448static void 449chipsMmioWriteDacWriteAddr(vgaHWPtr hwp, CARD8 value) 450{ 451 moutb(CHIPS_MMIO_DAC_WRITE_ADDR, value); 452} 453 454static void 455chipsMmioWriteDacData(vgaHWPtr hwp, CARD8 value) 456{ 457 moutb(CHIPS_MMIO_DAC_DATA, value); 458} 459 460static CARD8 461chipsMmioReadDacData(vgaHWPtr hwp) 462{ 463 return minb(CHIPS_MMIO_DAC_DATA); 464} 465 466static CARD8 467chipsMmioReadST00(vgaHWPtr hwp) 468{ 469 return minb(CHIPS_MMIO_STAT_0); 470} 471 472static CARD8 473chipsMmioReadST01(vgaHWPtr hwp) 474{ 475 if (hwp->IOBase == VGA_IOBASE_MONO) 476 return minb(CHIPS_MMIO_MONO_STAT_1); 477 else 478 return minb(CHIPS_MMIO_COLOR_STAT_1); 479} 480 481static CARD8 482chipsMmioReadFCR(vgaHWPtr hwp) 483{ 484 return minb(CHIPS_MMIO_FEATURE_R); 485} 486 487static void 488chipsMmioWriteFCR(vgaHWPtr hwp, CARD8 value) 489{ 490 if (hwp->IOBase == VGA_IOBASE_MONO) { 491 moutb(CHIPS_MMIO_MONO_STAT_1, value); 492 } else { 493 moutb(CHIPS_MMIO_COLOR_STAT_1, value); 494 } 495} 496 497void 498CHIPSHWSetMmioFuncs(ScrnInfoPtr pScrn, CARD8 *base, int offset) 499{ 500 vgaHWPtr hwp = VGAHWPTR(pScrn); 501 502 hwp->writeCrtc = chipsMmioWriteCrtc; 503 hwp->readCrtc = chipsMmioReadCrtc; 504 hwp->writeGr = chipsMmioWriteGr; 505 hwp->readGr = chipsMmioReadGr; 506 hwp->writeAttr = chipsMmioWriteAttr; 507 hwp->readAttr = chipsMmioReadAttr; 508 hwp->writeSeq = chipsMmioWriteSeq; 509 hwp->readSeq = chipsMmioReadSeq; 510 hwp->writeMiscOut = chipsMmioWriteMiscOut; 511 hwp->readMiscOut = chipsMmioReadMiscOut; 512 hwp->enablePalette = chipsMmioEnablePalette; 513 hwp->disablePalette = chipsMmioDisablePalette; 514 hwp->writeDacMask = chipsMmioWriteDacMask; 515 hwp->readDacMask = chipsMmioReadDacMask; 516 hwp->writeDacWriteAddr = chipsMmioWriteDacWriteAddr; 517 hwp->writeDacReadAddr = chipsMmioWriteDacReadAddr; 518 hwp->writeDacData = chipsMmioWriteDacData; 519 hwp->readDacData = chipsMmioReadDacData; 520 hwp->readST00 = chipsMmioReadST00; 521 hwp->readST01 = chipsMmioReadST01; 522 hwp->readFCR = chipsMmioReadFCR; 523 hwp->writeFCR = chipsMmioWriteFCR; 524 hwp->MMIOBase = base; 525 hwp->MMIOOffset = offset; 526} 527 528 529 530 531