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