2 * Copyright 1998 by Alan Hourihane, Wigan, England.
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 Alan Hourihane not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Alan Hourihane makes no representations
11 * about the suitability of this software for any purpose. It is provided
12 * "as is" without express or implied warranty.
14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL ALAN HOURIHANE 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.
22 * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
27 #ifdef HAVE_XORG_CONFIG_H
28 #include <xorg-config.h>
32 #include "xf86_OSproc.h"
34 #define INIT_BT_RAMDAC_INFO
36 #include "xf86RamDacPriv.h"
39 BTramdacRestore(ScrnInfoPtr pScrn
, RamDacRecPtr ramdacPtr
,
40 RamDacRegRecPtr ramdacReg
)
44 /* Here we pass a short, so that we can evaluate a mask too */
45 /* So that the mask is the high byte and the data the low byte */
46 /* Just the command/status registers */
47 for (i
= 0x06; i
< 0x0A; i
++)
48 (*ramdacPtr
->WriteDAC
)
49 (pScrn
, i
, (ramdacReg
->DacRegs
[i
] & 0xFF00) >> 8,
50 ramdacReg
->DacRegs
[i
]);
54 BTramdacSave(ScrnInfoPtr pScrn
, RamDacRecPtr ramdacPtr
,
55 RamDacRegRecPtr ramdacReg
)
59 (*ramdacPtr
->ReadAddress
) (pScrn
, 0); /* Start at index 0 */
60 for (i
= 0; i
< 768; i
++)
61 ramdacReg
->DAC
[i
] = (*ramdacPtr
->ReadData
) (pScrn
);
63 /* Just the command/status registers */
64 for (i
= 0x06; i
< 0x0A; i
++)
65 ramdacReg
->DacRegs
[i
] = (*ramdacPtr
->ReadDAC
) (pScrn
, i
);
69 BTramdacProbe(ScrnInfoPtr pScrn
,
70 RamDacSupportedInfoRecPtr ramdacs
/*, RamDacRecPtr ramdacPtr */ )
72 RamDacRecPtr ramdacPtr
= RAMDACSCRPTR(pScrn
);
73 Bool RamDacIsSupported
= FALSE
;
74 RamDacHelperRecPtr ramdacHelperPtr
= NULL
;
78 /* Save COMMAND Register 0 */
79 cmd0
= (*ramdacPtr
->ReadDAC
) (pScrn
, BT_COMMAND_REG_0
);
80 /* Ensure were going to access the STATUS Register on next read */
81 (*ramdacPtr
->WriteDAC
) (pScrn
, BT_COMMAND_REG_0
, 0x7F, 0x00);
83 status
= (*ramdacPtr
->ReadDAC
) (pScrn
, BT_STATUS_REG
);
86 BTramdac_ID
= ATT20C504_RAMDAC
;
89 BTramdac_ID
= ATT20C505_RAMDAC
;
92 xf86DrvMsg(pScrn
->scrnIndex
, X_PROBED
,
93 "Unknown BT RAMDAC type (0x%x), assuming BT485\n", status
);
98 case 0x28: /* This is for the DEC TGA - Questionable ? */
99 BTramdac_ID
= BT485_RAMDAC
;
103 /* Restore COMMAND Register 0 */
104 (*ramdacPtr
->WriteDAC
) (pScrn
, BT_COMMAND_REG_0
, 0x00, cmd0
);
106 if (BTramdac_ID
== -1) {
107 xf86DrvMsg(pScrn
->scrnIndex
, X_PROBED
,
108 "Cannot determine BT RAMDAC type, aborting\n");
112 xf86DrvMsg(pScrn
->scrnIndex
, X_PROBED
,
113 "Attached RAMDAC is %s\n",
114 BTramdacDeviceInfo
[BTramdac_ID
& 0xFFFF].DeviceName
);
117 for (i
= 0; ramdacs
[i
].token
!= -1; i
++) {
118 if (ramdacs
[i
].token
== BTramdac_ID
)
119 RamDacIsSupported
= TRUE
;
122 if (!RamDacIsSupported
) {
123 xf86DrvMsg(pScrn
->scrnIndex
, X_PROBED
,
124 "This BT RAMDAC is NOT supported by this driver, aborting\n");
128 ramdacHelperPtr
= RamDacHelperCreateInfoRec();
129 switch (BTramdac_ID
) {
131 ramdacHelperPtr
->SetBpp
= BTramdacSetBpp
;
134 ramdacPtr
->RamDacType
= BTramdac_ID
;
135 ramdacHelperPtr
->RamDacType
= BTramdac_ID
;
136 ramdacHelperPtr
->Save
= BTramdacSave
;
137 ramdacHelperPtr
->Restore
= BTramdacRestore
;
139 return ramdacHelperPtr
;
143 BTramdacSetBpp(ScrnInfoPtr pScrn
, RamDacRegRecPtr ramdacReg
)
145 /* We need to deal with Direct Colour visuals for 8bpp and other
146 * good stuff for colours */
147 switch (pScrn
->bitsPerPixel
) {
149 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x10;
152 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x10;
155 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x38;
158 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x30;
161 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x40;
164 ramdacReg
->DacRegs
[BT_COMMAND_REG_1
] = 0x60;