1 /* $OpenBSD: tga_conf.c,v 1.5 2002/04/01 11:26:32 matthieu Exp $ */
2 /* $NetBSD: tga_conf.c,v 1.5 2001/11/13 07:48:49 lukem Exp $ */
3
4 /*
5 * Copyright (c) 1995, 1996 Carnegie-Mellon University.
6 * All rights reserved.
7 *
8 * Author: Chris G. Demetriou
9 *
10 * Permission to use, copy, modify and distribute this software and
11 * its documentation is hereby granted, provided that both the copyright
12 * notice and this permission notice appear in all copies of the
13 * software, derivative works or modified versions, and any portions
14 * thereof, and that both notices appear in supporting documentation.
15 *
16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 *
20 * Carnegie Mellon requests users of this software to return to
21 *
22 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
23 * School of Computer Science
24 * Carnegie Mellon University
25 * Pittsburgh PA 15213-3890
26 *
27 * any improvements or extensions that they make and grant Carnegie the
28 * rights to redistribute these changes.
29 */
30
31 #include <sys/param.h>
32 #include <sys/device.h>
33
34 #include <dev/pci/pcivar.h>
35 #include <dev/pci/tgareg.h>
36 #include <dev/pci/tgavar.h>
37
38 #include <dev/ic/bt485var.h>
39 #include <dev/ic/bt463var.h>
40 #include <dev/ic/ibm561var.h>
41
42 #undef KB
43 #define KB * 1024
44 #undef MB
45 #define MB * 1024 * 1024
46
47 static const struct tga_conf tga_configs[TGA_TYPE_UNKNOWN] = {
48 /* TGA_TYPE_T8_01 */
49 {
50 "T8-01",
51 bt485_funcs,
52 8,
53 4 MB,
54 2 KB,
55 1, { 2 MB, 0 }, { 1 MB, 0 },
56 0, { 0, 0 }, { 0, 0 },
57 },
58 /* TGA_TYPE_T8_02 */
59 {
60 "T8-02",
61 bt485_funcs,
62 8,
63 4 MB,
64 4 KB,
65 1, { 2 MB, 0 }, { 2 MB, 0 },
66 0, { 0, 0 }, { 0, 0 },
67 },
68 /* TGA_TYPE_T8_22 */
69 {
70 "T8-22",
71 bt485_funcs,
72 8,
73 8 MB,
74 4 KB,
75 1, { 4 MB, 0 }, { 2 MB, 0 },
76 1, { 6 MB, 0 }, { 2 MB, 0 },
77 },
78 /* TGA_TYPE_T8_44 */
79 {
80 "T8-44",
81 bt485_funcs,
82 8,
83 16 MB,
84 4 KB,
85 2, { 8 MB, 12 MB }, { 2 MB, 2 MB },
86 2, { 10 MB, 14 MB }, { 2 MB, 2 MB },
87 },
88 /* TGA_TYPE_T32_04 */
89 {
90 "T32-04",
91 bt463_funcs,
92 32,
93 16 MB,
94 8 KB,
95 1, { 8 MB, 0 }, { 4 MB, 0 },
96 0, { 0, 0 }, { 0, 0 },
97 },
98 /* TGA_TYPE_T32_08 */
99 {
100 "T32-08",
101 bt463_funcs,
102 32,
103 16 MB,
104 16 KB,
105 1, { 8 MB, 0 }, { 8 MB, 0 },
106 0, { 0, 0 }, { 0, 0 },
107 },
108 /* TGA_TYPE_T32_88 */
109 {
110 "T32-88",
111 bt463_funcs,
112 32,
113 32 MB,
114 16 KB,
115 1, { 16 MB, 0 }, { 8 MB, 0 },
116 1, { 24 MB, 0 }, { 8 MB, 0 },
117 },
118 /* TGA_TYPE_POWERSTORM_4D20 */
119 /* XXX: These numbers may be incorrect */
120 {
121 "PS4d20",
122 ibm561_funcs,
123 32,
124 32 MB,
125 16 KB,
126 1, { 16 MB, 0 }, { 8 MB, 0 },
127 1, { 24 MB, 0 }, { 8 MB, 0 },
128 },
129 };
130
131 #undef KB
132 #undef MB
133
134 int
tga_identify(dc)135 tga_identify(dc)
136 struct tga_devconfig *dc;
137 {
138 int type;
139 int gder;
140 int grev;
141 int deep, addrmask, wide;
142 int tga2;
143
144 gder = TGARREG(dc, TGA_REG_GDER);
145 grev = TGARREG(dc, TGA_REG_GREV);
146
147 deep = (gder & 0x1) != 0; /* XXX */
148 addrmask = (gder >> 2) & 0x7; /* XXX */
149 wide = (gder & 0x200) == 0; /* XXX */
150 tga2 = (grev & 0x20) != 0;
151
152
153 type = TGA_TYPE_UNKNOWN;
154
155 if (!deep) {
156 /* 8bpp frame buffer */
157
158 if (addrmask == 0x0) {
159 /* 4MB core map; T8-01 or T8-02 */
160
161 if (!wide)
162 type = TGA_TYPE_T8_01;
163 else
164 type = TGA_TYPE_T8_02;
165 } else if (addrmask == 0x1) {
166 /* 8MB core map; T8-22 */
167
168 if (wide) /* sanity */
169 type = TGA_TYPE_T8_22;
170 } else if (addrmask == 0x3) {
171 /* 16MB core map; T8-44 */
172
173 if (wide) /* sanity */
174 type = TGA_TYPE_T8_44;
175 }
176 } else {
177 /* 32bpp frame buffer */
178 if (addrmask == 0x00 && tga2 && wide) {
179 /* My PowerStorm 4d20 shows up this way? */
180 type = TGA_TYPE_POWERSTORM_4D20;
181 }
182
183 if (addrmask == 0x3) {
184 /* 16MB core map; T32-04 or T32-08 */
185
186 if (!wide)
187 type = TGA_TYPE_T32_04;
188 else
189 type = TGA_TYPE_T32_08;
190 } else if (addrmask == 0x7) {
191 /* 32MB core map; T32-88 */
192
193 if (wide && !tga2) /* sanity */
194 type = TGA_TYPE_T32_88;
195 }
196 }
197
198 return (type);
199 }
200
201 const struct tga_conf *
tga_getconf(type)202 tga_getconf(type)
203 int type;
204 {
205
206 if (type >= 0 && type < TGA_TYPE_UNKNOWN)
207 return &tga_configs[type];
208
209 return (NULL);
210 }
211