Annotation of sys/arch/alpha/pci/sio.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: sio.c,v 1.31 2006/01/02 05:21:26 brad Exp $ */
! 2: /* $NetBSD: sio.c,v 1.15 1996/12/05 01:39:36 cgd 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/systm.h>
! 33: #include <sys/kernel.h>
! 34: #include <sys/device.h>
! 35:
! 36: #include <machine/intr.h>
! 37: #include <machine/bus.h>
! 38:
! 39: #include <dev/isa/isavar.h>
! 40: #include <dev/eisa/eisavar.h>
! 41:
! 42: #include <dev/pci/pcireg.h>
! 43: #include <dev/pci/pcivar.h>
! 44: #include <dev/pci/pcidevs.h>
! 45:
! 46: #include <alpha/pci/siovar.h>
! 47:
! 48: #include "isadma.h"
! 49:
! 50: struct sio_softc {
! 51: struct device sc_dv;
! 52:
! 53: bus_space_tag_t sc_iot, sc_memt;
! 54: bus_dma_tag_t sc_dmat;
! 55: int sc_haseisa;
! 56: };
! 57:
! 58: int siomatch(struct device *, void *, void *);
! 59: void sioattach(struct device *, struct device *, void *);
! 60:
! 61: extern int sio_intr_alloc(isa_chipset_tag_t *, int, int, int *);
! 62:
! 63:
! 64: struct cfattach sio_ca = {
! 65: sizeof(struct sio_softc), siomatch, sioattach,
! 66: };
! 67:
! 68: struct cfdriver sio_cd = {
! 69: NULL, "sio", DV_DULL,
! 70: };
! 71:
! 72: int pcebmatch(struct device *, void *, void *);
! 73:
! 74: struct cfattach pceb_ca = {
! 75: sizeof(struct sio_softc), pcebmatch, sioattach,
! 76: };
! 77:
! 78: struct cfdriver pceb_cd = {
! 79: NULL, "pceb", DV_DULL,
! 80: };
! 81:
! 82: union sio_attach_args {
! 83: const char *sa_name; /* XXX should be common */
! 84: struct isabus_attach_args sa_iba;
! 85: struct eisabus_attach_args sa_eba;
! 86: };
! 87:
! 88: int sioprint(void *, const char *pnp);
! 89: void sio_isa_attach_hook(struct device *, struct device *,
! 90: struct isabus_attach_args *);
! 91: void sio_eisa_attach_hook(struct device *, struct device *,
! 92: struct eisabus_attach_args *);
! 93: int sio_eisa_maxslots(void *);
! 94: int sio_eisa_intr_map(void *, u_int, eisa_intr_handle_t *);
! 95: void sio_bridge_callback(struct device *);
! 96:
! 97: int
! 98: siomatch(parent, match, aux)
! 99: struct device *parent;
! 100: void *match;
! 101: void *aux;
! 102: {
! 103: struct pci_attach_args *pa = aux;
! 104:
! 105: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_CONTAQ &&
! 106: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CONTAQ_82C693 &&
! 107: pa->pa_function == 0)
! 108: return (1);
! 109:
! 110: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
! 111: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_SIO)
! 112: return (1);
! 113:
! 114: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALI &&
! 115: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ALI_M1533)
! 116: return(1);
! 117:
! 118: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALI &&
! 119: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ALI_M1543)
! 120: return(1);
! 121: return (0);
! 122: }
! 123:
! 124: int
! 125: pcebmatch(parent, match, aux)
! 126: struct device *parent;
! 127: void *match;
! 128: void *aux;
! 129: {
! 130: struct pci_attach_args *pa = aux;
! 131:
! 132: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
! 133: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PCEB)
! 134: return (1);
! 135:
! 136: return (0);
! 137: }
! 138:
! 139: void
! 140: sioattach(parent, self, aux)
! 141: struct device *parent, *self;
! 142: void *aux;
! 143: {
! 144: struct sio_softc *sc = (struct sio_softc *)self;
! 145: struct pci_attach_args *pa = aux;
! 146:
! 147: printf("\n");
! 148:
! 149: sc->sc_iot = pa->pa_iot;
! 150: sc->sc_memt = pa->pa_memt;
! 151: sc->sc_dmat = pa->pa_dmat;
! 152: sc->sc_haseisa = (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
! 153: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PCEB);
! 154:
! 155: evcount_attach(&sio_intr_count, self->dv_xname, NULL, &evcount_intr);
! 156:
! 157: config_defer(self, sio_bridge_callback);
! 158: }
! 159:
! 160: void
! 161: sio_bridge_callback(self)
! 162: struct device *self;
! 163: {
! 164: struct sio_softc *sc = (struct sio_softc *)self;
! 165: struct alpha_eisa_chipset ec;
! 166: struct alpha_isa_chipset ic;
! 167: union sio_attach_args sa;
! 168:
! 169: if (sc->sc_haseisa) {
! 170: ec.ec_v = NULL;
! 171: ec.ec_attach_hook = sio_eisa_attach_hook;
! 172: ec.ec_maxslots = sio_eisa_maxslots;
! 173: ec.ec_intr_map = sio_eisa_intr_map;
! 174: ec.ec_intr_string = sio_intr_string;
! 175: ec.ec_intr_establish = sio_intr_establish;
! 176: ec.ec_intr_disestablish = sio_intr_disestablish;
! 177:
! 178: sa.sa_eba.eba_busname = "eisa";
! 179: sa.sa_eba.eba_iot = sc->sc_iot;
! 180: sa.sa_eba.eba_memt = sc->sc_memt;
! 181: sa.sa_eba.eba_ec = &ec;
! 182: config_found(&sc->sc_dv, &sa.sa_eba, sioprint);
! 183: }
! 184:
! 185: ic.ic_v = NULL;
! 186: ic.ic_attach_hook = sio_isa_attach_hook;
! 187: ic.ic_intr_establish = sio_intr_establish;
! 188: ic.ic_intr_disestablish = sio_intr_disestablish;
! 189: ic.ic_intr_alloc = sio_intr_alloc;
! 190:
! 191: sa.sa_iba.iba_busname = "isa";
! 192: sa.sa_iba.iba_iot = sc->sc_iot;
! 193: sa.sa_iba.iba_memt = sc->sc_memt;
! 194: #if NISADMA > 0
! 195: sa.sa_iba.iba_dmat =
! 196: alphabus_dma_get_tag(sc->sc_dmat, ALPHA_BUS_ISA);
! 197: #endif
! 198: sa.sa_iba.iba_ic = ⁣
! 199: config_found(&sc->sc_dv, &sa.sa_iba, sioprint);
! 200: }
! 201:
! 202: int
! 203: sioprint(aux, pnp)
! 204: void *aux;
! 205: const char *pnp;
! 206: {
! 207: register union sio_attach_args *sa = aux;
! 208:
! 209: if (pnp)
! 210: printf("%s at %s", sa->sa_name, pnp);
! 211: return (UNCONF);
! 212: }
! 213:
! 214: void
! 215: sio_isa_attach_hook(parent, self, iba)
! 216: struct device *parent, *self;
! 217: struct isabus_attach_args *iba;
! 218: {
! 219: /* Nothing to do. */
! 220: }
! 221:
! 222: void
! 223: sio_eisa_attach_hook(parent, self, eba)
! 224: struct device *parent, *self;
! 225: struct eisabus_attach_args *eba;
! 226: {
! 227:
! 228: /* Nothing to do. */
! 229: }
! 230:
! 231: int
! 232: sio_eisa_maxslots(v)
! 233: void *v;
! 234: {
! 235:
! 236: return 16; /* as good a number as any. only 8, maybe? */
! 237: }
! 238:
! 239: int
! 240: sio_eisa_intr_map(v, irq, ihp)
! 241: void *v;
! 242: u_int irq;
! 243: eisa_intr_handle_t *ihp;
! 244: {
! 245:
! 246: #define ICU_LEN 16 /* number of ISA IRQs (XXX) */
! 247:
! 248: if (irq >= ICU_LEN) {
! 249: printf("sio_eisa_intr_map: bad IRQ %d\n", irq);
! 250: *ihp = -1;
! 251: return 1;
! 252: }
! 253: if (irq == 2) {
! 254: printf("sio_eisa_intr_map: changed IRQ 2 to IRQ 9\n");
! 255: irq = 9;
! 256: }
! 257:
! 258: *ihp = irq;
! 259: return 0;
! 260: }
CVSweb