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>
26
/* $XFree86: xc/programs/Xserver/hw/xfree86/ramdac/BT.c,v 1.7 2000/10/20 12:57:27 alanh Exp $ */
28
#ifdef HAVE_XORG_CONFIG_H
29
#include <xorg-config.h>
33
#include "xf86_OSproc.h"
34
#include "xf86_ansic.h"
36
#define INIT_BT_RAMDAC_INFO
38
#include "xf86RamDacPriv.h"
41
BTramdacRestore(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
42
RamDacRegRecPtr ramdacReg)
46
/* Here we pass a short, so that we can evaluate a mask too */
47
/* So that the mask is the high byte and the data the low byte */
48
/* Just the command/status registers */
49
for (i=0x06;i<0x0A;i++)
50
(*ramdacPtr->WriteDAC)
51
(pScrn, i, (ramdacReg->DacRegs[i] & 0xFF00) >> 8,
52
ramdacReg->DacRegs[i]);
56
BTramdacSave(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
57
RamDacRegRecPtr ramdacReg)
61
(*ramdacPtr->ReadAddress)(pScrn, 0); /* Start at index 0 */
63
ramdacReg->DAC[i] = (*ramdacPtr->ReadData)(pScrn);
65
/* Just the command/status registers */
66
for (i=0x06;i<0x0A;i++)
67
ramdacReg->DacRegs[i] = (*ramdacPtr->ReadDAC)(pScrn, i);
71
BTramdacProbe(ScrnInfoPtr pScrn, RamDacSupportedInfoRecPtr ramdacs/*, RamDacRecPtr ramdacPtr*/)
73
RamDacRecPtr ramdacPtr = RAMDACSCRPTR(pScrn);
74
Bool RamDacIsSupported = FALSE;
75
RamDacHelperRecPtr ramdacHelperPtr = NULL;
79
/* Save COMMAND Register 0 */
80
cmd0 = (*ramdacPtr->ReadDAC)(pScrn, BT_COMMAND_REG_0);
81
/* Ensure were going to access the STATUS Register on next read */
82
(*ramdacPtr->WriteDAC)(pScrn, BT_COMMAND_REG_0, 0x7F, 0x00);
84
status = (*ramdacPtr->ReadDAC)(pScrn, BT_STATUS_REG);
87
BTramdac_ID = ATT20C504_RAMDAC;
90
BTramdac_ID = ATT20C505_RAMDAC;
93
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
94
"Unknown BT RAMDAC type (0x%x), assuming BT485\n",
100
case 0x28: /* This is for the DEC TGA - Questionable ? */
101
BTramdac_ID = BT485_RAMDAC;
105
/* Restore COMMAND Register 0 */
106
(*ramdacPtr->WriteDAC)(pScrn, BT_COMMAND_REG_0, 0x00, cmd0);
108
if (BTramdac_ID == -1) {
109
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
110
"Cannot determine BT RAMDAC type, aborting\n");
113
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
114
"Attached RAMDAC is %s\n", 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;