Annotation of sys/arch/hppa/dev/sti_sgc.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: sti_sgc.c,v 1.35 2007/01/11 21:58:05 miod Exp $ */
2:
3: /*
4: * Copyright (c) 2000-2003 Michael Shalayeff
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26: * THE POSSIBILITY OF SUCH DAMAGE.
27: */
28: /*
29: * These cards has to be known to work so far:
30: * - HPA1991AGrayscale rev 0.02 (705/35) (byte-wide)
31: * - HPA1991AC19 rev 0.02 (715/33) (byte-wide)
32: * - HPA208LC1280 rev 8.04 (712/80) just works
33: */
34:
35: #include <sys/param.h>
36: #include <sys/systm.h>
37: #include <sys/device.h>
38:
39: #include <uvm/uvm.h>
40:
41: #include <machine/bus.h>
42: #include <machine/cpu.h>
43: #include <machine/iomod.h>
44: #include <machine/autoconf.h>
45:
46: #include <dev/wscons/wsdisplayvar.h>
47: #include <dev/wscons/wsconsio.h>
48:
49: #include <dev/ic/stireg.h>
50: #include <dev/ic/stivar.h>
51:
52: #include <hppa/dev/cpudevs.h>
53:
54: #define STI_ROMSIZE (sizeof(struct sti_dd) * 4)
55: #define STI_ID_FDDI 0x280b31af /* Medusa FDDI ROM id */
56:
57: /* gecko optional graphics (these share the onboard's prom) */
58: char sti_sgc_opt[] = { 0x17, 0x20, 0x30, 0x40, 0x70, 0xc0, 0xd0 };
59:
60: /* internal EG */
61: #define STI_INEG_REV 0x60
62: #define STI_INEG_PROM 0xf0011000
63:
64: extern struct cfdriver sti_cd;
65:
66: int sti_sgc_probe(struct device *, void *, void *);
67: void sti_sgc_attach(struct device *, struct device *, void *);
68: paddr_t sti_sgc_getrom(int, struct confargs *);
69:
70: struct cfattach sti_gedoens_ca = {
71: sizeof(struct sti_softc), sti_sgc_probe, sti_sgc_attach
72: };
73:
74: /*
75: * Locate STI ROM.
76: * On some machines it may not be part of the HPA space.
77: */
78: paddr_t
79: sti_sgc_getrom(int unit, struct confargs *ca)
80: {
81: paddr_t rom = PAGE0->pd_resv2[1];
82: int i;
83:
84: if (unit) {
85: i = -1;
86: if (ca->ca_type.iodc_sv_model == HPPA_FIO_GSGC)
87: for (i = sizeof(sti_sgc_opt); i-- &&
88: sti_sgc_opt[i] != ca->ca_type.iodc_revision; )
89: ;
90: if (i < 0)
91: rom = 0;
92: }
93:
94: if (rom < HPPA_IOBEGIN) {
95: if (unit == 0 &&
96: ca->ca_type.iodc_sv_model == HPPA_FIO_GSGC &&
97: ca->ca_type.iodc_revision == STI_INEG_REV)
98: rom = STI_INEG_PROM;
99: else
100: rom = ca->ca_hpa;
101: }
102:
103: return (rom);
104: }
105:
106: int
107: sti_sgc_probe(parent, match, aux)
108: struct device *parent;
109: void *match, *aux;
110: {
111: struct cfdata *cf = match;
112: struct confargs *ca = aux;
113: bus_space_handle_t romh;
114: paddr_t rom;
115: u_int32_t id;
116: u_char devtype;
117: int rv = 0, romunmapped = 0;
118:
119: /* due to the graphic nature of this program do probe only one */
120: if (cf->cf_unit > sti_cd.cd_ndevs)
121: return (0);
122:
123: if (ca->ca_type.iodc_type != HPPA_TYPE_FIO)
124: return (0);
125:
126: /* these need futher checking for the graphics id */
127: if (ca->ca_type.iodc_sv_model != HPPA_FIO_GSGC &&
128: ca->ca_type.iodc_sv_model != HPPA_FIO_SGC)
129: return 0;
130:
131: rom = sti_sgc_getrom(cf->cf_unit, ca);
132: #ifdef STIDEBUG
133: printf ("sti: hpa=%x, rom=%x\n", ca->ca_hpa, rom);
134: #endif
135:
136: /* if it does not map, probably part of the lasi space */
137: if ((rv = bus_space_map(ca->ca_iot, rom, STI_ROMSIZE, 0, &romh))) {
138: #ifdef STIDEBUG
139: printf ("sti: cannot map rom space (%d)\n", rv);
140: #endif
141: if ((rom & HPPA_IOBEGIN) == HPPA_IOBEGIN) {
142: romh = rom;
143: romunmapped++;
144: } else {
145: /* in this case nobody has no freaking idea */
146: return 0;
147: }
148: }
149:
150: devtype = bus_space_read_1(ca->ca_iot, romh, 3);
151:
152: #ifdef STIDEBUG
153: printf("sti: devtype=%d\n", devtype);
154: #endif
155: rv = 1;
156: switch (devtype) {
157: case STI_DEVTYPE4:
158: id = bus_space_read_4(ca->ca_iot, romh, 0x8);
159: break;
160: case STI_DEVTYPE1:
161: id = (bus_space_read_1(ca->ca_iot, romh, 0x10 + 3) << 24) |
162: (bus_space_read_1(ca->ca_iot, romh, 0x10 + 7) << 16) |
163: (bus_space_read_1(ca->ca_iot, romh, 0x10 + 11) << 8) |
164: (bus_space_read_1(ca->ca_iot, romh, 0x10 + 15));
165: break;
166: default:
167: #ifdef STIDEBUG
168: printf("sti: unknown type (%x)\n", devtype);
169: #endif
170: rv = 0;
171: }
172:
173: if (rv &&
174: ca->ca_type.iodc_sv_model == HPPA_FIO_SGC && id == STI_ID_FDDI) {
175: #ifdef STIDEBUG
176: printf("sti: not a graphics device\n");
177: #endif
178: rv = 0;
179: }
180:
181: if (ca->ca_naddrs >= sizeof(ca->ca_addrs)/sizeof(ca->ca_addrs[0])) {
182: printf("sti: address list overflow\n");
183: return (0);
184: }
185:
186: ca->ca_addrs[ca->ca_naddrs].addr = rom;
187: ca->ca_addrs[ca->ca_naddrs].size = sti_rom_size(ca->ca_iot, romh);
188: ca->ca_naddrs++;
189:
190: if (!romunmapped)
191: bus_space_unmap(ca->ca_iot, romh, STI_ROMSIZE);
192: return (rv);
193: }
194:
195: void
196: sti_sgc_attach(parent, self, aux)
197: struct device *parent, *self;
198: void *aux;
199: {
200: struct sti_softc *sc = (void *)self;
201: struct confargs *ca = aux;
202: paddr_t rom;
203: u_int32_t romlen;
204: int rv;
205: int i;
206:
207: sc->memt = sc->iot = ca->ca_iot;
208:
209: /* we stashed rom addr/len into the last slot during probe */
210: rom = ca->ca_addrs[ca->ca_naddrs - 1].addr;
211: romlen = ca->ca_addrs[ca->ca_naddrs - 1].size;
212: if ((rv = bus_space_map(ca->ca_iot, rom, romlen, 0, &sc->romh))) {
213: if ((rom & HPPA_IOBEGIN) == HPPA_IOBEGIN)
214: sc->romh = rom;
215: else {
216: printf (": cannot map rom space (%d)\n", rv);
217: return;
218: }
219: }
220:
221: sc->bases[0] = sc->romh;
222: for (i = 1; i < STI_REGION_MAX; i++)
223: sc->bases[i] = ca->ca_hpa;
224:
225: #ifdef HP7300LC_CPU
226: /* PCXL2: enable accel i/o for this space */
227: if (cpu_type == hpcxl2)
228: eaio_l2(0x8 >> (((ca->ca_hpa >> 25) & 3) - 2));
229: #endif
230:
231: if (ca->ca_hpa == (hppa_hpa_t)PAGE0->mem_cons.pz_hpa)
232: sc->sc_flags |= STI_CONSOLE;
233: if (sti_attach_common(sc, STI_CODEBASE_PA) == 0)
234: startuphook_establish(sti_end_attach, sc);
235: }
CVSweb