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