1*34fbf6deSderaadt /* $NetBSD: sio.c,v 1.3 1995/11/23 02:38:16 cgd Exp $ */ 2df930be7Sderaadt 3df930be7Sderaadt /* 4df930be7Sderaadt * Copyright (c) 1995 Carnegie-Mellon University. 5df930be7Sderaadt * All rights reserved. 6df930be7Sderaadt * 7df930be7Sderaadt * Author: Chris G. Demetriou 8df930be7Sderaadt * 9df930be7Sderaadt * Permission to use, copy, modify and distribute this software and 10df930be7Sderaadt * its documentation is hereby granted, provided that both the copyright 11df930be7Sderaadt * notice and this permission notice appear in all copies of the 12df930be7Sderaadt * software, derivative works or modified versions, and any portions 13df930be7Sderaadt * thereof, and that both notices appear in supporting documentation. 14df930be7Sderaadt * 15df930be7Sderaadt * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16df930be7Sderaadt * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17df930be7Sderaadt * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18df930be7Sderaadt * 19df930be7Sderaadt * Carnegie Mellon requests users of this software to return to 20df930be7Sderaadt * 21df930be7Sderaadt * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 22df930be7Sderaadt * School of Computer Science 23df930be7Sderaadt * Carnegie Mellon University 24df930be7Sderaadt * Pittsburgh PA 15213-3890 25df930be7Sderaadt * 26df930be7Sderaadt * any improvements or extensions that they make and grant Carnegie the 27df930be7Sderaadt * rights to redistribute these changes. 28df930be7Sderaadt */ 29df930be7Sderaadt 30df930be7Sderaadt #include <sys/param.h> 31df930be7Sderaadt #include <sys/systm.h> 32df930be7Sderaadt #include <sys/kernel.h> 33df930be7Sderaadt #include <sys/device.h> 34df930be7Sderaadt 35*34fbf6deSderaadt #include <dev/isa/isavar.h> 36*34fbf6deSderaadt #include <dev/eisa/eisavar.h> 37*34fbf6deSderaadt 38df930be7Sderaadt #include <dev/pci/pcireg.h> 39df930be7Sderaadt #include <dev/pci/pcivar.h> 40df930be7Sderaadt #include <dev/pci/pcidevs.h> 41df930be7Sderaadt 42*34fbf6deSderaadt #include <alpha/pci/siovar.h> 43df930be7Sderaadt 44df930be7Sderaadt int siomatch __P((struct device *, void *, void *)); 45df930be7Sderaadt void sioattach __P((struct device *, struct device *, void *)); 46df930be7Sderaadt 47df930be7Sderaadt struct cfdriver siocd = { 48df930be7Sderaadt NULL, "sio", siomatch, sioattach, DV_DULL, sizeof(struct device) 49df930be7Sderaadt }; 50df930be7Sderaadt 51*34fbf6deSderaadt int pcebmatch __P((struct device *, void *, void *)); 52*34fbf6deSderaadt 53*34fbf6deSderaadt struct cfdriver pcebcd = { 54*34fbf6deSderaadt NULL, "pceb", pcebmatch, sioattach, DV_DULL, sizeof(struct device) 55*34fbf6deSderaadt }; 56*34fbf6deSderaadt 57df930be7Sderaadt static int sioprint __P((void *, char *pnp)); 58df930be7Sderaadt 59df930be7Sderaadt int 60df930be7Sderaadt siomatch(parent, match, aux) 61df930be7Sderaadt struct device *parent; 62df930be7Sderaadt void *match, *aux; 63df930be7Sderaadt { 64df930be7Sderaadt struct cfdata *cf = match; 65*34fbf6deSderaadt struct pcidev_attach_args *pda = aux; 66df930be7Sderaadt 67*34fbf6deSderaadt if (PCI_VENDOR(pda->pda_id) != PCI_VENDOR_INTEL || 68*34fbf6deSderaadt PCI_PRODUCT(pda->pda_id) != PCI_PRODUCT_INTEL_SIO) 69*34fbf6deSderaadt return (0); 70*34fbf6deSderaadt 71*34fbf6deSderaadt return (1); 72*34fbf6deSderaadt } 73*34fbf6deSderaadt 74*34fbf6deSderaadt int 75*34fbf6deSderaadt pcebmatch(parent, match, aux) 76*34fbf6deSderaadt struct device *parent; 77*34fbf6deSderaadt void *match, *aux; 78*34fbf6deSderaadt { 79*34fbf6deSderaadt struct cfdata *cf = match; 80*34fbf6deSderaadt struct pcidev_attach_args *pda = aux; 81*34fbf6deSderaadt 82*34fbf6deSderaadt if (PCI_VENDOR(pda->pda_id) != PCI_VENDOR_INTEL || 83*34fbf6deSderaadt PCI_PRODUCT(pda->pda_id) != PCI_PRODUCT_INTEL_PCEB) 84df930be7Sderaadt return (0); 85df930be7Sderaadt 86df930be7Sderaadt return (1); 87df930be7Sderaadt } 88df930be7Sderaadt 89df930be7Sderaadt void 90df930be7Sderaadt sioattach(parent, self, aux) 91df930be7Sderaadt struct device *parent, *self; 92df930be7Sderaadt void *aux; 93df930be7Sderaadt { 94*34fbf6deSderaadt struct pcidev_attach_args *pda = aux; 95*34fbf6deSderaadt struct isa_attach_args ia; 96*34fbf6deSderaadt struct eisa_attach_args ea; 97*34fbf6deSderaadt int sio, haseisa; 98*34fbf6deSderaadt char devinfo[256]; 99df930be7Sderaadt 100*34fbf6deSderaadt sio = (PCI_PRODUCT(pda->pda_id) == PCI_PRODUCT_INTEL_SIO); 101*34fbf6deSderaadt haseisa = (PCI_PRODUCT(pda->pda_id) == PCI_PRODUCT_INTEL_PCEB); 102*34fbf6deSderaadt 103*34fbf6deSderaadt pci_devinfo(pda->pda_id, pda->pda_class, 0, devinfo); 104*34fbf6deSderaadt printf(": %s (rev. 0x%02x)\n", devinfo, 105*34fbf6deSderaadt PCI_REVISION(pda->pda_class)); 106*34fbf6deSderaadt 107*34fbf6deSderaadt if (sio) { 108*34fbf6deSderaadt pci_revision_t rev; 109*34fbf6deSderaadt 110*34fbf6deSderaadt rev = PCI_REVISION(pda->pda_class); 111*34fbf6deSderaadt 112df930be7Sderaadt if (rev < 3) 113df930be7Sderaadt printf("%s: WARNING: SIO I SUPPORT UNTESTED\n", 114*34fbf6deSderaadt self->dv_xname); 115*34fbf6deSderaadt } 116df930be7Sderaadt 117*34fbf6deSderaadt #ifdef EVCNT_COUNTERS 118*34fbf6deSderaadt evcnt_attach(self, "intr", &sio_intr_evcnt); 119*34fbf6deSderaadt #endif 120*34fbf6deSderaadt 121*34fbf6deSderaadt ia.ia_bus = BUS_ISA; 122*34fbf6deSderaadt ia.ia_dmafns = pda->pda_dmafns; 123*34fbf6deSderaadt ia.ia_dmaarg = pda->pda_dmaarg; 124*34fbf6deSderaadt ia.ia_intrfns = &sio_isa_intr_fns; 125*34fbf6deSderaadt ia.ia_intrarg = NULL; /* XXX needs nothing */ 126*34fbf6deSderaadt ia.ia_memfns = pda->pda_memfns; 127*34fbf6deSderaadt ia.ia_memarg = pda->pda_memarg; 128*34fbf6deSderaadt ia.ia_piofns = pda->pda_piofns; 129*34fbf6deSderaadt ia.ia_pioarg = pda->pda_pioarg; 130*34fbf6deSderaadt config_found(self, &ia, sioprint); 131*34fbf6deSderaadt 132*34fbf6deSderaadt if (haseisa) { 133*34fbf6deSderaadt ea.ea_bus = BUS_EISA; 134*34fbf6deSderaadt ea.ea_dmafns = pda->pda_dmafns; 135*34fbf6deSderaadt ea.ea_dmaarg = pda->pda_dmaarg; 136*34fbf6deSderaadt ea.ea_intrfns = &sio_isa_intr_fns; 137*34fbf6deSderaadt ea.ea_intrarg = NULL; /* XXX needs nothing */ 138*34fbf6deSderaadt ea.ea_memfns = pda->pda_memfns; 139*34fbf6deSderaadt ea.ea_memarg = pda->pda_memarg; 140*34fbf6deSderaadt ea.ea_piofns = pda->pda_piofns; 141*34fbf6deSderaadt ea.ea_pioarg = pda->pda_pioarg; 142*34fbf6deSderaadt config_found(self, &ea, sioprint); 143*34fbf6deSderaadt } 144df930be7Sderaadt } 145df930be7Sderaadt 146df930be7Sderaadt static int 147df930be7Sderaadt sioprint(aux, pnp) 148df930be7Sderaadt void *aux; 149df930be7Sderaadt char *pnp; 150df930be7Sderaadt { 151*34fbf6deSderaadt register struct isa_attach_args *ia = aux; 152*34fbf6deSderaadt 153*34fbf6deSderaadt /* 154*34fbf6deSderaadt * XXX Assumes that the first fields of 'struct isa_attach_args' 155*34fbf6deSderaadt * XXX and 'struct eisa_attach_args' are the same. 156*34fbf6deSderaadt */ 157df930be7Sderaadt 158df930be7Sderaadt if (pnp) 159*34fbf6deSderaadt printf("%s at %s", isa_bustype_name(ia->ia_bus), pnp); 160df930be7Sderaadt return (UNCONF); 161df930be7Sderaadt } 162