xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/ramdac/BT.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 
38 void
BTramdacRestore(ScrnInfoPtr pScrn,RamDacRecPtr ramdacPtr,RamDacRegRecPtr ramdacReg)39 BTramdacRestore(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 
53 void
BTramdacSave(ScrnInfoPtr pScrn,RamDacRecPtr ramdacPtr,RamDacRegRecPtr ramdacReg)54 BTramdacSave(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 
68 RamDacHelperRecPtr
BTramdacProbe(ScrnInfoPtr pScrn,RamDacSupportedInfoRecPtr ramdacs)69 BTramdacProbe(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 
142 void
BTramdacSetBpp(ScrnInfoPtr pScrn,RamDacRegRecPtr ramdacReg)143 BTramdacSetBpp(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 }
168