ct_bank.c revision 9f4658d1
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 for PCI hardware need this */ 51#include "xf86PciInfo.h" 52 53/* Drivers that need to access the PCI config space directly need this */ 54#include "xf86Pci.h" 55 56/* Driver specific headers */ 57#include "ct_driver.h" 58 59#if defined(__arm32__) && defined(__NetBSD__) 60#include <machine/sysarch.h> 61#define arm32_drain_writebuf() sysarch(1, 0) 62#elif defined(__arm32__) 63#define arm32_drain_writebuf() 64#endif 65 66#define ChipsBank(pScreen) CHIPSPTR(xf86Screens[pScreen->myNum])->Bank 67 68#ifdef DIRECT_REGISTER_ACCESS 69int 70CHIPSSetRead(ScreenPtr pScreen, int bank) 71{ 72 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 73 74 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 75 76#ifdef __arm32__ 77 /* Must drain StrongARM write buffer on bank switch! */ 78 if (bank != ChipsBank(pScreen)) { 79 arm32_drain_writebuf(); 80 ChipsBank(pScreen) = bank; 81 } 82#endif 83 84 return 0; 85} 86 87 88int 89CHIPSSetWrite(ScreenPtr pScreen, int bank) 90{ 91 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 92 93 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 94 95#ifdef __arm32__ 96 /* Must drain StrongARM write buffer on bank switch! */ 97 if (bank != ChipsBank(pScreen)) { 98 arm32_drain_writebuf(); 99 ChipsBank(pScreen) = bank; 100 } 101#endif 102 103 return 0; 104} 105 106 107int 108CHIPSSetReadWrite(ScreenPtr pScreen, int bank) 109{ 110 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 111 112 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 113 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 114 115#ifdef __arm32__ 116 /* Must drain StrongARM write buffer on bank switch! */ 117 if (bank != ChipsBank(pScreen)) { 118 arm32_drain_writebuf(); 119 ChipsBank(pScreen) = bank; 120 } 121#endif 122 123 return 0; 124} 125 126int 127CHIPSSetReadPlanar(ScreenPtr pScreen, int bank) 128{ 129 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 130 131 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 132 133#ifdef __arm32__ 134 /* Must drain StrongARM write buffer on bank switch! */ 135 if (bank != ChipsBank(pScreen)) { 136 arm32_drain_writebuf(); 137 ChipsBank(pScreen) = bank; 138 } 139#endif 140 141 return 0; 142} 143 144int 145CHIPSSetWritePlanar(ScreenPtr pScreen, int bank) 146{ 147 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 148 149 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 150 151#ifdef __arm32__ 152 /* Must drain StrongARM write buffer on bank switch! */ 153 if (bank != ChipsBank(pScreen)) { 154 arm32_drain_writebuf(); 155 ChipsBank(pScreen) = bank; 156 } 157#endif 158 159 return 0; 160} 161 162int 163CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank) 164{ 165 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 166 167 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 168 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 169 170#ifdef __arm32__ 171 /* Must drain StrongARM write buffer on bank switch! */ 172 if (bank != ChipsBank(pScreen)) { 173 arm32_drain_writebuf(); 174 ChipsBank(pScreen) = bank; 175 } 176#endif 177 178 return 0; 179} 180 181int 182CHIPSWINSetRead(ScreenPtr pScreen, int bank) 183{ 184 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 185 register unsigned char tmp; 186 187 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 188 outb(cPtr->PIOBase + 0x3D6, 0x0C); 189 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xEF; 190 outw(cPtr->PIOBase + 0x3D6, (((((bank >> 1) & 0x10) | tmp) << 8) | 0x0C)); 191 192#ifdef __arm32__ 193 /* Must drain StrongARM write buffer on bank switch! */ 194 if (bank != ChipsBank(pScreen)) { 195 arm32_drain_writebuf(); 196 ChipsBank(pScreen) = bank; 197 } 198#endif 199 200 return 0; 201} 202 203 204int 205CHIPSWINSetWrite(ScreenPtr pScreen, int bank) 206{ 207 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 208 register unsigned char tmp; 209 210 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 211 outb(cPtr->PIOBase + 0x3D6, 0x0C); 212 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xBF; 213 outw(cPtr->PIOBase + 0x3D6, (((((bank << 1) & 0x40) | tmp) << 8) | 0x0C)); 214 215#ifdef __arm32__ 216 /* Must drain StrongARM write buffer on bank switch! */ 217 if (bank != ChipsBank(pScreen)) { 218 arm32_drain_writebuf(); 219 ChipsBank(pScreen) = bank; 220 } 221#endif 222 223 return 0; 224} 225 226int 227CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank) 228{ 229 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 230 register unsigned char tmp; 231 232 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x10)); 233 outw(cPtr->PIOBase + 0x3D6, ((((bank << 3) & 0xFF) << 8) | 0x11)); 234 outb(cPtr->PIOBase + 0x3D6, 0x0C); 235 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xAF; 236 outw(cPtr->PIOBase + 0x3D6, 237 (((((bank << 1) & 0x40) | ((bank >> 1) & 0x10) | tmp) << 8) | 0x0C)); 238 239#ifdef __arm32__ 240 /* Must drain StrongARM write buffer on bank switch! */ 241 if (bank != ChipsBank(pScreen)) { 242 arm32_drain_writebuf(); 243 ChipsBank(pScreen) = bank; 244 } 245#endif 246 247 return 0; 248} 249 250int 251CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank) 252{ 253 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 254 register unsigned char tmp; 255 256 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 257 outb(cPtr->PIOBase + 0x3D6, 0x0C); 258 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xEF; 259 outw(cPtr->PIOBase + 0x3D6, (((((bank << 1) & 0x10) | tmp) << 8) | 0x0C)); 260 261#ifdef __arm32__ 262 /* Must drain StrongARM write buffer on bank switch! */ 263 if (bank != ChipsBank(pScreen)) { 264 arm32_drain_writebuf(); 265 ChipsBank(pScreen) = bank; 266 } 267#endif 268 269 return 0; 270} 271 272int 273CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank) 274{ 275 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 276 register unsigned char tmp; 277 278 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 279 outb(cPtr->PIOBase + 0x3D6, 0x0C); 280 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xBF; 281 outw(cPtr->PIOBase + 0x3D6, (((((bank << 3) & 0x40) | tmp) << 8) | 0x0C)); 282 283#ifdef __arm32__ 284 /* Must drain StrongARM write buffer on bank switch! */ 285 if (bank != ChipsBank(pScreen)) { 286 arm32_drain_writebuf(); 287 ChipsBank(pScreen) = bank; 288 } 289#endif 290 291 return 0; 292} 293 294int 295CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank) 296{ 297 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 298 register unsigned char tmp; 299 300 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x10)); 301 outw(cPtr->PIOBase + 0x3D6, ((((bank << 5) & 0xFF) << 8) | 0x11)); 302 outb(cPtr->PIOBase + 0x3D6, 0x0C); 303 tmp = inb(cPtr->PIOBase + 0x3D7) & 0xAF; 304 outw(cPtr->PIOBase + 0x3D6, 305 (((((bank << 3) & 0x40) | ((bank << 1) & 0x10) | tmp) << 8) | 0x0C)); 306 307#ifdef __arm32__ 308 /* Must drain StrongARM write buffer on bank switch! */ 309 if (bank != ChipsBank(pScreen)) { 310 arm32_drain_writebuf(); 311 ChipsBank(pScreen) = bank; 312 } 313#endif 314 315 return 0; 316} 317 318int 319CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank) 320{ 321 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 322 323 outw(cPtr->PIOBase + 0x3D6, (((bank & 0x7F) << 8) | 0x0E)); 324 325#ifdef __arm32__ 326 /* Must drain StrongARM write buffer on bank switch! */ 327 if (bank != ChipsBank(pScreen)) { 328 arm32_drain_writebuf(); 329 ChipsBank(pScreen) = bank; 330 } 331#endif 332 333 return 0; 334} 335 336int 337CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank) 338{ 339 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 340 341 outw(cPtr->PIOBase + 0x3D6, ((((bank << 2) & 0x7F) << 8) | 0x0E)); 342 343#ifdef __arm32__ 344 /* Must drain StrongARM write buffer on bank switch! */ 345 if (bank != ChipsBank(pScreen)) { 346 arm32_drain_writebuf(); 347 ChipsBank(pScreen) = bank; 348 } 349#endif 350 351 return 0; 352} 353 354#else /* DIRECT_REGISTER_ACCESS */ 355 356int 357CHIPSSetRead(ScreenPtr pScreen, int bank) 358{ 359 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 360 361 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 362 363#ifdef __arm32__ 364 /* Must drain StrongARM write buffer on bank switch! */ 365 if (bank != cPtr->Bank) { 366 arm32_drain_writebuf(); 367 cPtr->Bank = bank; 368 } 369#endif 370 371 return 0; 372} 373 374 375int 376CHIPSSetWrite(ScreenPtr pScreen, int bank) 377{ 378 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 379 380 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 381 382#ifdef __arm32__ 383 /* Must drain StrongARM write buffer on bank switch! */ 384 if (bank != cPtr->Bank) { 385 arm32_drain_writebuf(); 386 cPtr->Bank = bank; 387 } 388#endif 389 390 return 0; 391} 392 393 394int 395CHIPSSetReadWrite(ScreenPtr pScreen, int bank) 396{ 397 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 398 399 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 400 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 401 402#ifdef __arm32__ 403 /* Must drain StrongARM write buffer on bank switch! */ 404 if (bank != cPtr->Bank) { 405 arm32_drain_writebuf(); 406 cPtr->Bank = bank; 407 } 408#endif 409 410 return 0; 411} 412 413int 414CHIPSSetReadPlanar(ScreenPtr pScreen, int bank) 415{ 416 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 417 418 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 419 420#ifdef __arm32__ 421 /* Must drain StrongARM write buffer on bank switch! */ 422 if (bank != cPtr->Bank) { 423 arm32_drain_writebuf(); 424 cPtr->Bank = bank; 425 } 426#endif 427 428 return 0; 429} 430 431int 432CHIPSSetWritePlanar(ScreenPtr pScreen, int bank) 433{ 434 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 435 436 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 437 438#ifdef __arm32__ 439 /* Must drain StrongARM write buffer on bank switch! */ 440 if (bank != cPtr->Bank) { 441 arm32_drain_writebuf(); 442 cPtr->Bank = bank; 443 } 444#endif 445 446 return 0; 447} 448 449int 450CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank) 451{ 452 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 453 454 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 455 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 456 457#ifdef __arm32__ 458 /* Must drain StrongARM write buffer on bank switch! */ 459 if (bank != cPtr->Bank) { 460 arm32_drain_writebuf(); 461 cPtr->Bank = bank; 462 } 463#endif 464 465 return 0; 466} 467 468int 469CHIPSWINSetRead(ScreenPtr pScreen, int bank) 470{ 471 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 472 register unsigned char tmp; 473 474 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 475 tmp = cPtr->readXR(cPtr, 0x0C) & 0xEF; 476 cPtr->writeXR(cPtr, 0x0C, ((bank >> 1) & 0x10) | tmp); 477 478#ifdef __arm32__ 479 /* Must drain StrongARM write buffer on bank switch! */ 480 if (bank != cPtr->Bank) { 481 arm32_drain_writebuf(); 482 cPtr->Bank = bank; 483 } 484#endif 485 486 return 0; 487} 488 489 490int 491CHIPSWINSetWrite(ScreenPtr pScreen, int bank) 492{ 493 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 494 register unsigned char tmp; 495 496 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 497 tmp = cPtr->readXR(cPtr, 0x0C) & 0xBF; 498 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x40) | tmp); 499 500#ifdef __arm32__ 501 /* Must drain StrongARM write buffer on bank switch! */ 502 if (bank != cPtr->Bank) { 503 arm32_drain_writebuf(); 504 cPtr->Bank = bank; 505 } 506#endif 507 508 return 0; 509} 510 511int 512CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank) 513{ 514 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 515 register unsigned char tmp; 516 517 cPtr->writeXR(cPtr, 0x10, ((bank << 3) & 0xFF)); 518 cPtr->writeXR(cPtr, 0x11, ((bank << 3) & 0xFF)); 519 tmp = cPtr->readXR(cPtr, 0x0C) & 0xAF; 520 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x40) | ((bank >> 1) & 0x10) | tmp); 521 522#ifdef __arm32__ 523 /* Must drain StrongARM write buffer on bank switch! */ 524 if (bank != cPtr->Bank) { 525 arm32_drain_writebuf(); 526 cPtr->Bank = bank; 527 } 528#endif 529 530 return 0; 531} 532 533int 534CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank) 535{ 536 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 537 register unsigned char tmp; 538 539 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 540 tmp = cPtr->readXR(cPtr, 0x0C) & 0xEF; 541 cPtr->writeXR(cPtr, 0x0C, ((bank << 1) & 0x10) | tmp); 542 543#ifdef __arm32__ 544 /* Must drain StrongARM write buffer on bank switch! */ 545 if (bank != cPtr->Bank) { 546 arm32_drain_writebuf(); 547 cPtr->Bank = bank; 548 } 549#endif 550 551 return 0; 552} 553 554int 555CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank) 556{ 557 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 558 register unsigned char tmp; 559 560 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 561 tmp = cPtr->readXR(cPtr, 0x0C) & 0xBF; 562 cPtr->writeXR(cPtr, 0x0C, ((bank << 3) & 0x40) | tmp); 563 564#ifdef __arm32__ 565 /* Must drain StrongARM write buffer on bank switch! */ 566 if (bank != cPtr->Bank) { 567 arm32_drain_writebuf(); 568 cPtr->Bank = bank; 569 } 570#endif 571 572 return 0; 573} 574 575int 576CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank) 577{ 578 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 579 register unsigned char tmp; 580 581 cPtr->writeXR(cPtr, 0x10, ((bank << 5) & 0xFF)); 582 cPtr->writeXR(cPtr, 0x11, ((bank << 5) & 0xFF)); 583 tmp = cPtr->readXR(cPtr, 0x0C) & 0xAF; 584 cPtr->writeXR(cPtr, 0x0C, ((bank << 3) & 0x40) | ((bank << 1) & 0x10) | tmp); 585 586#ifdef __arm32__ 587 /* Must drain StrongARM write buffer on bank switch! */ 588 if (bank != cPtr->Bank) { 589 arm32_drain_writebuf(); 590 cPtr->Bank = bank; 591 } 592#endif 593 594 return 0; 595} 596 597int 598CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank) 599{ 600 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 601 602 cPtr->writeXR(cPtr, 0x0E, bank & 0x7F); 603 604#ifdef __arm32__ 605 /* Must drain StrongARM write buffer on bank switch! */ 606 if (bank != cPtr->Bank) { 607 arm32_drain_writebuf(); 608 cPtr->Bank = bank; 609 } 610#endif 611 612 return 0; 613} 614 615int 616CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank) 617{ 618 CHIPSPtr cPtr = CHIPSPTR(xf86Screens[pScreen->myNum]); 619 620 cPtr->writeXR(cPtr, 0x0E, (bank << 2) & 0x7F); 621 622#ifdef __arm32__ 623 /* Must drain StrongARM write buffer on bank switch! */ 624 if (bank != cPtr->Bank) { 625 arm32_drain_writebuf(); 626 cPtr->Bank = bank; 627 } 628#endif 629 630 return 0; 631} 632#endif 633