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