Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / ramdac / BT.c
CommitLineData
a09e091a
JB
1/*
2 * Copyright 1998 by Alan Hourihane, Wigan, England.
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 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.
13 *
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.
21 *
22 * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
23 *
24 * BT RAMDAC routines.
25 */
26
27#ifdef HAVE_XORG_CONFIG_H
28#include <xorg-config.h>
29#endif
30
31#include "xf86.h"
32#include "xf86_OSproc.h"
33
34#define INIT_BT_RAMDAC_INFO
35#include "BTPriv.h"
36#include "xf86RamDacPriv.h"
37
38void
39BTramdacRestore(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
40 RamDacRegRecPtr ramdacReg)
41{
42 int i;
43
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]);
51}
52
53void
54BTramdacSave(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
55 RamDacRegRecPtr ramdacReg)
56{
57 int i;
58
59 (*ramdacPtr->ReadAddress) (pScrn, 0); /* Start at index 0 */
60 for (i = 0; i < 768; i++)
61 ramdacReg->DAC[i] = (*ramdacPtr->ReadData) (pScrn);
62
63 /* Just the command/status registers */
64 for (i = 0x06; i < 0x0A; i++)
65 ramdacReg->DacRegs[i] = (*ramdacPtr->ReadDAC) (pScrn, i);
66}
67
68RamDacHelperRecPtr
69BTramdacProbe(ScrnInfoPtr pScrn,
70 RamDacSupportedInfoRecPtr ramdacs /*, RamDacRecPtr ramdacPtr */ )
71{
72 RamDacRecPtr ramdacPtr = RAMDACSCRPTR(pScrn);
73 Bool RamDacIsSupported = FALSE;
74 RamDacHelperRecPtr ramdacHelperPtr = NULL;
75 int BTramdac_ID = -1;
76 int i, status, cmd0;
77
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);
82
83 status = (*ramdacPtr->ReadDAC) (pScrn, BT_STATUS_REG);
84 switch (status) {
85 case 0x40:
86 BTramdac_ID = ATT20C504_RAMDAC;
87 break;
88 case 0xD0:
89 BTramdac_ID = ATT20C505_RAMDAC;
90 break;
91 default:
92 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
93 "Unknown BT RAMDAC type (0x%x), assuming BT485\n", status);
94 case 0x80:
95 case 0x90:
96 case 0xA0:
97 case 0xB0:
98 case 0x28: /* This is for the DEC TGA - Questionable ? */
99 BTramdac_ID = BT485_RAMDAC;
100 break;
101 }
102
103 /* Restore COMMAND Register 0 */
104 (*ramdacPtr->WriteDAC) (pScrn, BT_COMMAND_REG_0, 0x00, cmd0);
105
106 if (BTramdac_ID == -1) {
107 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
108 "Cannot determine BT RAMDAC type, aborting\n");
109 return NULL;
110 }
111 else {
112 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
113 "Attached RAMDAC is %s\n",
114 BTramdacDeviceInfo[BTramdac_ID & 0xFFFF].DeviceName);
115 }
116
117 for (i = 0; ramdacs[i].token != -1; i++) {
118 if (ramdacs[i].token == BTramdac_ID)
119 RamDacIsSupported = TRUE;
120 }
121
122 if (!RamDacIsSupported) {
123 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
124 "This BT RAMDAC is NOT supported by this driver, aborting\n");
125 return NULL;
126 }
127
128 ramdacHelperPtr = RamDacHelperCreateInfoRec();
129 switch (BTramdac_ID) {
130 case BT485_RAMDAC:
131 ramdacHelperPtr->SetBpp = BTramdacSetBpp;
132 break;
133 }
134 ramdacPtr->RamDacType = BTramdac_ID;
135 ramdacHelperPtr->RamDacType = BTramdac_ID;
136 ramdacHelperPtr->Save = BTramdacSave;
137 ramdacHelperPtr->Restore = BTramdacRestore;
138
139 return ramdacHelperPtr;
140}
141
142void
143BTramdacSetBpp(ScrnInfoPtr pScrn, RamDacRegRecPtr ramdacReg)
144{
145 /* We need to deal with Direct Colour visuals for 8bpp and other
146 * good stuff for colours */
147 switch (pScrn->bitsPerPixel) {
148 case 32:
149 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x10;
150 break;
151 case 24:
152 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x10;
153 break;
154 case 16:
155 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x38;
156 break;
157 case 15:
158 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x30;
159 break;
160 case 8:
161 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x40;
162 break;
163 case 4:
164 ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x60;
165 break;
166 }
167}