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