1 2/* 3 * Copyright 1997 4 * Digital Equipment Corporation. All rights reserved. 5 * This software is furnished under license and may be used and copied only in 6 * accordance with the following terms and conditions. Subject to these 7 * conditions, you may download, copy, install, use, modify and distribute 8 * this software in source and/or binary form. No title or ownership is 9 * transferred hereby. 10 * 1) Any source code used, modified or distributed must reproduce and retain 11 * this copyright notice and list of conditions as they appear in the 12 * source file. 13 * 14 * 2) No right is granted to use any trade name, trademark, or logo of Digital 15 * Equipment Corporation. Neither the "Digital Equipment Corporation" name 16 * nor any trademark or logo of Digital Equipment Corporation may be used 17 * to endorse or promote products derived from this software without the 18 * prior written permission of Digital Equipment Corporation. 19 * 20 * 3) This software is provided "AS-IS" and any express or implied warranties, 21 * including but not limited to, any implied warranties of merchantability, 22 * fitness for a particular purpose, or non-infringement are disclaimed. In 23 * no event shall DIGITAL be liable for any damages whatsoever, and in 24 * particular, DIGITAL shall not be liable for special, indirect, 25 * consequential, or incidental damages or damages for lost profits, loss 26 * of revenue or loss of use, whether such damages arise in contract, 27 * negligence, tort, under statute, in equity, at law or otherwise, even if 28 * advised of the possibility of such damage. 29 */ 30 31#ifdef HAVE_CONFIG_H 32#include "config.h" 33#endif 34 35#define PSZ 8 36 37/* 38 * Define DIRECT_REGISTER_ACCESS if you want to bypass the wrapped register 39 * access functions 40 */ 41/* #define DIRECT_REGISTER_ACCESS */ 42 43/* All drivers should typically include these */ 44#include "xf86.h" 45#include "xf86_OSproc.h" 46 47/* Everything using inb/outb, etc needs "compiler.h" */ 48#include "compiler.h" 49 50/* Drivers that need to access the PCI config space directly need this */ 51#include "xf86Pci.h" 52 53/* Driver specific headers */ 54#include "ct_driver.h" 55 56#if defined(__arm32__) && defined(__NetBSD__) 57#include <machine/sysarch.h> 58#define arm32_drain_writebuf() sysarch(1, 0) 59#elif defined(__arm32__) 60#define arm32_drain_writebuf() 61#endif 62 63#define ChipsBank(pScreen) CHIPSPTR(xf86ScreenToScrn(pScreen))->Bank 64 65#ifdef DIRECT_REGISTER_ACCESS 66int 67CHIPSSetRead(ScreenPtr pScreen, int bank) 68{ 69 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 70 71 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 72 73#ifdef __arm32__ 74 /* Must drain StrongARM write buffer on bank switch! */ 75 if (bank != ChipsBank(pScreen)) { 76 arm32_drain_writebuf(); 77 ChipsBank(pScreen) = bank; 78 } 79#endif 80 81 return 0; 82} 83 84 85int 86CHIPSSetWrite(ScreenPtr pScreen, int bank) 87{ 88 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 89 90 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 91 92#ifdef __arm32__ 93 /* Must drain StrongARM write buffer on bank switch! */ 94 if (bank != ChipsBank(pScreen)) { 95 arm32_drain_writebuf(); 96 ChipsBank(pScreen) = bank; 97 } 98#endif 99 100 return 0; 101} 102 103 104int 105CHIPSSetReadWrite(ScreenPtr pScreen, int bank) 106{ 107 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 108 109 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 110 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 111 112#ifdef __arm32__ 113 /* Must drain StrongARM write buffer on bank switch! */ 114 if (bank != ChipsBank(pScreen)) { 115 arm32_drain_writebuf(); 116 ChipsBank(pScreen) = bank; 117 } 118#endif 119 120 return 0; 121} 122 123int 124CHIPSSetReadPlanar(ScreenPtr pScreen, int bank) 125{ 126 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 127 128 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 129 130#ifdef __arm32__ 131 /* Must drain StrongARM write buffer on bank switch! */ 132 if (bank != ChipsBank(pScreen)) { 133 arm32_drain_writebuf(); 134 ChipsBank(pScreen) = bank; 135 } 136#endif 137 138 return 0; 139} 140 141int 142CHIPSSetWritePlanar(ScreenPtr pScreen, int bank) 143{ 144 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 145 146 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 147 148#ifdef __arm32__ 149 /* Must drain StrongARM write buffer on bank switch! */ 150 if (bank != ChipsBank(pScreen)) { 151 arm32_drain_writebuf(); 152 ChipsBank(pScreen) = bank; 153 } 154#endif 155 156 return 0; 157} 158 159int 160CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank) 161{ 162 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 163 164 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 165 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 166 167#ifdef __arm32__ 168 /* Must drain StrongARM write buffer on bank switch! */ 169 if (bank != ChipsBank(pScreen)) { 170 arm32_drain_writebuf(); 171 ChipsBank(pScreen) = bank; 172 } 173#endif 174 175 return 0; 176} 177 178int 179CHIPSWINSetRead(ScreenPtr pScreen, int bank) 180{ 181 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 182 register unsigned char tmp; 183 184 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 185 outb(cPtr->PIOBase + 0x3D6, 0x0C); 186 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xEF; 187 outw(cPtr->PIOBase + 0x3D6, (((((bank >> 1) & 0x10) | tmp) << 8) | 0x0C)); 188 189#ifdef __arm32__ 190 /* Must drain StrongARM write buffer on bank switch! */ 191 if (bank != ChipsBank(pScreen)) { 192 arm32_drain_writebuf(); 193 ChipsBank(pScreen) = bank; 194 } 195#endif 196 197 return 0; 198} 199 200 201int 202CHIPSWINSetWrite(ScreenPtr pScreen, int bank) 203{ 204 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 205 register unsigned char tmp; 206 207 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 208 outb(cPtr->PIOBase + 0x3D6, 0x0C); 209 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xBF; 210 outw(cPtr->PIOBase + 0x3D6, (((((bank << 1) & 0x40) | tmp) << 8) | 0x0C)); 211 212#ifdef __arm32__ 213 /* Must drain StrongARM write buffer on bank switch! */ 214 if (bank != ChipsBank(pScreen)) { 215 arm32_drain_writebuf(); 216 ChipsBank(pScreen) = bank; 217 } 218#endif 219 220 return 0; 221} 222 223int 224CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank) 225{ 226 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 227 register unsigned char tmp; 228 229 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 230 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 231 outb(cPtr->PIOBase + 0x3D6, 0x0C); 232 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xAF; 233 outw(cPtr->PIOBase + 0x3D6, 234 (((((bank << 1) & 0x40) | ((bank >> 1) & 0x10) | tmp) << 8) | 0x0C)); 235 236#ifdef __arm32__ 237 /* Must drain StrongARM write buffer on bank switch! */ 238 if (bank != ChipsBank(pScreen)) { 239 arm32_drain_writebuf(); 240 ChipsBank(pScreen) = bank; 241 } 242#endif 243 244 return 0; 245} 246 247int 248CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank) 249{ 250 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 251 register unsigned char tmp; 252 253 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 254 outb(cPtr->PIOBase + 0x3D6, 0x0C); 255 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xEF; 256 outw(cPtr->PIOBase + 0x3D6, (((((bank << 1) & 0x10) | tmp) << 8) | 0x0C)); 257 258#ifdef __arm32__ 259 /* Must drain StrongARM write buffer on bank switch! */ 260 if (bank != ChipsBank(pScreen)) { 261 arm32_drain_writebuf(); 262 ChipsBank(pScreen) = bank; 263 } 264#endif 265 266 return 0; 267} 268 269int 270CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank) 271{ 272 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 273 register unsigned char tmp; 274 275 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 276 outb(cPtr->PIOBase + 0x3D6, 0x0C); 277 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xBF; 278 outw(cPtr->PIOBase + 0x3D6, (((((bank << 3) & 0x40) | tmp) << 8) | 0x0C)); 279 280#ifdef __arm32__ 281 /* Must drain StrongARM write buffer on bank switch! */ 282 if (bank != ChipsBank(pScreen)) { 283 arm32_drain_writebuf(); 284 ChipsBank(pScreen) = bank; 285 } 286#endif 287 288 return 0; 289} 290 291int 292CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank) 293{ 294 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 295 register unsigned char tmp; 296 297 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 298 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 299 outb(cPtr->PIOBase + 0x3D6, 0x0C); 300 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xAF; 301 outw(cPtr->PIOBase + 0x3D6, 302 (((((bank << 3) & 0x40) | ((bank << 1) & 0x10) | tmp) << 8) | 0x0C)); 303 304#ifdef __arm32__ 305 /* Must drain StrongARM write buffer on bank switch! */ 306 if (bank != ChipsBank(pScreen)) { 307 arm32_drain_writebuf(); 308 ChipsBank(pScreen) = bank; 309 } 310#endif 311 312 return 0; 313} 314 315int 316CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank) 317{ 318 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 319 320 outw(cPtr->PIOBase + 0x3D6, (((bank & 0x7F) << 8) | 0x0E)); 321 322#ifdef __arm32__ 323 /* Must drain StrongARM write buffer on bank switch! */ 324 if (bank != ChipsBank(pScreen)) { 325 arm32_drain_writebuf(); 326 ChipsBank(pScreen) = bank; 327 } 328#endif 329 330 return 0; 331} 332 333int 334CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank) 335{ 336 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 337 338 outw(cPtr->PIOBase + 0x3D6, ((((bank << 2) & 0x7F) << 8) | 0x0E)); 339 340#ifdef __arm32__ 341 /* Must drain StrongARM write buffer on bank switch! */ 342 if (bank != ChipsBank(pScreen)) { 343 arm32_drain_writebuf(); 344 ChipsBank(pScreen) = bank; 345 } 346#endif 347 348 return 0; 349} 350 351#else /* DIRECT_REGISTER_ACCESS */ 352 353int 354CHIPSSetRead(ScreenPtr pScreen, int bank) 355{ 356 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 357 358 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 359 360#ifdef __arm32__ 361 /* Must drain StrongARM write buffer on bank switch! */ 362 if (bank != cPtr->Bank) { 363 arm32_drain_writebuf(); 364 cPtr->Bank = bank; 365 } 366#endif 367 368 return 0; 369} 370 371 372int 373CHIPSSetWrite(ScreenPtr pScreen, int bank) 374{ 375 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 376 377 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 378 379#ifdef __arm32__ 380 /* Must drain StrongARM write buffer on bank switch! */ 381 if (bank != cPtr->Bank) { 382 arm32_drain_writebuf(); 383 cPtr->Bank = bank; 384 } 385#endif 386 387 return 0; 388} 389 390 391int 392CHIPSSetReadWrite(ScreenPtr pScreen, int bank) 393{ 394 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 395 396 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 397 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 398 399#ifdef __arm32__ 400 /* Must drain StrongARM write buffer on bank switch! */ 401 if (bank != cPtr->Bank) { 402 arm32_drain_writebuf(); 403 cPtr->Bank = bank; 404 } 405#endif 406 407 return 0; 408} 409 410int 411CHIPSSetReadPlanar(ScreenPtr pScreen, int bank) 412{ 413 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 414 415 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 416 417#ifdef __arm32__ 418 /* Must drain StrongARM write buffer on bank switch! */ 419 if (bank != cPtr->Bank) { 420 arm32_drain_writebuf(); 421 cPtr->Bank = bank; 422 } 423#endif 424 425 return 0; 426} 427 428int 429CHIPSSetWritePlanar(ScreenPtr pScreen, int bank) 430{ 431 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 432 433 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 434 435#ifdef __arm32__ 436 /* Must drain StrongARM write buffer on bank switch! */ 437 if (bank != cPtr->Bank) { 438 arm32_drain_writebuf(); 439 cPtr->Bank = bank; 440 } 441#endif 442 443 return 0; 444} 445 446int 447CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank) 448{ 449 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 450 451 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 452 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 453 454#ifdef __arm32__ 455 /* Must drain StrongARM write buffer on bank switch! */ 456 if (bank != cPtr->Bank) { 457 arm32_drain_writebuf(); 458 cPtr->Bank = bank; 459 } 460#endif 461 462 return 0; 463} 464 465int 466CHIPSWINSetRead(ScreenPtr pScreen, int bank) 467{ 468 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 469 register unsigned char tmp; 470 471 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 472 tmp = cPtr->readXR(cPtr, 0x0C) & 0xEF; 473 cPtr->writeXR(cPtr, 0x0C, ((bank >> 1) & 0x10) | tmp); 474 475#ifdef __arm32__ 476 /* Must drain StrongARM write buffer on bank switch! */ 477 if (bank != cPtr->Bank) { 478 arm32_drain_writebuf(); 479 cPtr->Bank = bank; 480 } 481#endif 482 483 return 0; 484} 485 486 487int 488CHIPSWINSetWrite(ScreenPtr pScreen, int bank) 489{ 490 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 491 register unsigned char tmp; 492 493 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 494 tmp = cPtr->readXR(cPtr, 0x0C) & 0xBF; 495 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x40) | tmp); 496 497#ifdef __arm32__ 498 /* Must drain StrongARM write buffer on bank switch! */ 499 if (bank != cPtr->Bank) { 500 arm32_drain_writebuf(); 501 cPtr->Bank = bank; 502 } 503#endif 504 505 return 0; 506} 507 508int 509CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank) 510{ 511 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 512 register unsigned char tmp; 513 514 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 515 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 516 tmp = cPtr->readXR(cPtr, 0x0C) & 0xAF; 517 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x40) | ((bank >> 1) & 0x10) | tmp); 518 519#ifdef __arm32__ 520 /* Must drain StrongARM write buffer on bank switch! */ 521 if (bank != cPtr->Bank) { 522 arm32_drain_writebuf(); 523 cPtr->Bank = bank; 524 } 525#endif 526 527 return 0; 528} 529 530int 531CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank) 532{ 533 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 534 register unsigned char tmp; 535 536 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 537 tmp = cPtr->readXR(cPtr, 0x0C) & 0xEF; 538 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x10) | tmp); 539 540#ifdef __arm32__ 541 /* Must drain StrongARM write buffer on bank switch! */ 542 if (bank != cPtr->Bank) { 543 arm32_drain_writebuf(); 544 cPtr->Bank = bank; 545 } 546#endif 547 548 return 0; 549} 550 551int 552CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank) 553{ 554 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 555 register unsigned char tmp; 556 557 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 558 tmp = cPtr->readXR(cPtr, 0x0C) & 0xBF; 559 cPtr->writeXR(cPtr, 0x0C, ((bank << 3) & 0x40) | tmp); 560 561#ifdef __arm32__ 562 /* Must drain StrongARM write buffer on bank switch! */ 563 if (bank != cPtr->Bank) { 564 arm32_drain_writebuf(); 565 cPtr->Bank = bank; 566 } 567#endif 568 569 return 0; 570} 571 572int 573CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank) 574{ 575 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 576 register unsigned char tmp; 577 578 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 579 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 580 tmp = cPtr->readXR(cPtr, 0x0C) & 0xAF; 581 cPtr->writeXR(cPtr, 0x0C, ((bank << 3) & 0x40) | ((bank << 1) & 0x10) | tmp); 582 583#ifdef __arm32__ 584 /* Must drain StrongARM write buffer on bank switch! */ 585 if (bank != cPtr->Bank) { 586 arm32_drain_writebuf(); 587 cPtr->Bank = bank; 588 } 589#endif 590 591 return 0; 592} 593 594int 595CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank) 596{ 597 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 598 599 cPtr->writeXR(cPtr, 0x0E, bank & 0x7F); 600 601#ifdef __arm32__ 602 /* Must drain StrongARM write buffer on bank switch! */ 603 if (bank != cPtr->Bank) { 604 arm32_drain_writebuf(); 605 cPtr->Bank = bank; 606 } 607#endif 608 609 return 0; 610} 611 612int 613CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank) 614{ 615 CHIPSPtr cPtr = CHIPSPTR(xf86ScreenToScrn(pScreen)); 616 617 cPtr->writeXR(cPtr, 0x0E, (bank << 2) & 0x7F); 618 619#ifdef __arm32__ 620 /* Must drain StrongARM write buffer on bank switch! */ 621 if (bank != cPtr->Bank) { 622 arm32_drain_writebuf(); 623 cPtr->Bank = bank; 624 } 625#endif 626 627 return 0; 628} 629#endif 630