xref: /openbsd/sys/dev/pci/tga_conf.c (revision e00d3f43)
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