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 47static 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 134int 135tga_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 201const struct tga_conf * 202tga_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