Annotation of sys/arch/hppa/dev/sti_sgc.c, Revision 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