diff --git a/sys/arch/alpha/alpha/dec_1000a.c b/sys/arch/alpha/alpha/dec_1000a.c new file mode 100644 index 000000000000..edc6297fb135 --- /dev/null +++ b/sys/arch/alpha/alpha/dec_1000a.c @@ -0,0 +1,334 @@ +/* $NetBSD: dec_1000a.c,v 1.1 1998/06/24 01:38:59 ross Exp $ */ + +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is based on dec_kn20aa.c, written by Chris G. Demetriou at + * Carnegie-Mellon University. Platform support for Noritake, Pintake, and + * Corelle by Ross Harvey with copyright assignment by permission of Avalon + * Computer Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1995, 1996, 1997 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ +/* + * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center + */ + +#include /* RCS ID & Copyright macro defns */ + +__KERNEL_RCSID(0, "$NetBSD"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "pckbd.h" + +#ifndef CONSPEED +#define CONSPEED TTYDEF_SPEED +#endif +static int comcnrate = CONSPEED; + +void dec_1000a_init __P((void)); +static void dec_1000a_cons_init __P((void)); +static void dec_1000a_device_register __P((struct device *, void *)); + +const struct alpha_variation_table dec_1000a_variations[] = { + { 0, "AlphaServer 1000A" }, + { 0, NULL }, +}; + +void +dec_1000a_init() +{ + u_int64_t variation; + + platform.family = "AlphaServer 1000A"; + + if ((platform.model = alpha_dsr_sysname()) == NULL) { + variation = hwrpb->rpb_variation & SV_ST_MASK; + if ((platform.model = alpha_variation_name(variation, + dec_1000a_variations)) == NULL) + platform.model = alpha_unknown_sysname(); + } + + switch(PCS_CPU_MAJORTYPE(LOCATE_PCS(hwrpb, 0))) { + case PCS_PROC_EV4: + case PCS_PROC_EV45: + platform.iobus = "apecs"; + break; + default: + platform.iobus = "cia"; + break; + } + platform.cons_init = dec_1000a_cons_init; + platform.device_register = dec_1000a_device_register; +} + +static void +dec_1000a_cons_init() +{ + struct ctb *ctb; + struct cia_config *ccp; + struct apecs_config *acp; + extern struct cia_config cia_configuration; + extern struct apecs_config apecs_configuration; + bus_space_tag_t iot, memt; + struct alpha_pci_chipset *pcichipset; + + if(strcmp(platform.iobus, "cia") == 0) { + ccp = &cia_configuration; + cia_init(ccp, 0); + iot = &ccp->cc_iot; + memt = &ccp->cc_memt; + pcichipset = &ccp->cc_pc; + } else { + acp = &apecs_configuration; + apecs_init(acp, 0); + iot = &acp->ac_iot; + memt = &acp->ac_memt; + pcichipset = &acp->ac_pc; + } + + ctb = (struct ctb *)(((caddr_t)hwrpb) + hwrpb->rpb_ctb_off); + + switch (ctb->ctb_term_type) { + case 2: + /* serial console ... */ + /* XXX */ + { + /* + * Delay to allow PROM putchars to complete. + * FIFO depth * character time, + * character time = (1000000 / (defaultrate / 10)) + */ + DELAY(160000000 / comcnrate); + + if(comcnattach(iot, 0x3f8, comcnrate, + COM_FREQ, + (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8)) + panic("can't init serial console"); + + break; + } + + case 3: +#if NPCKBD > 0 + /* display console ... */ + /* XXX */ + (void) pckbc_cnattach(iot, PCKBC_KBD_SLOT); + + if ((ctb->ctb_turboslot & 0xffff) == 0) + isa_display_console(iot, memt); + else + pci_display_console(iot, memt, + pcichipset, (ctb->ctb_turboslot >> 8) & 0xff, + ctb->ctb_turboslot & 0xff, 0); +#else + panic("not configured to use display && keyboard console"); +#endif + break; + + default: + printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); + printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); + + panic("consinit: unknown console type %d\n", + ctb->ctb_term_type); + } +} + +static void +dec_1000a_device_register(dev, aux) + struct device *dev; + void *aux; +{ + static int found, initted, scsiboot, netboot; + static struct device *pcidev, *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (!initted) { + scsiboot = (strcmp(b->protocol, "SCSI") == 0); + netboot = (strcmp(b->protocol, "BOOTP") == 0); +#if 0 + printf("scsiboot = %d, netboot = %d\n", scsiboot, netboot); +#endif + initted =1; + } + + if (pcidev == NULL) { + if (strcmp(cd->cd_name, "pci")) + return; + else { + struct pcibus_attach_args *pba = aux; + + if ((b->slot / 1000) != pba->pba_bus) + return; + + pcidev = dev; +#if 0 + printf("\npcidev = %s\n", pcidev->dv_xname); +#endif + return; + } + } + + if (scsiboot && (scsidev == NULL)) { + if (parent != pcidev) + return; + else { + struct pci_attach_args *pa = aux; + + if ((b->slot % 1000) != pa->pa_device) + return; + + /* XXX function? */ + + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", scsidev->dv_xname); +#endif + return; + } + } + + if (scsiboot && + (!strcmp(cd->cd_name, "sd") || + !strcmp(cd->cd_name, "st") || + !strcmp(cd->cd_name, "cd"))) { + struct scsipibus_attach_args *sa = aux; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->scsipi_scsi.target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } + + if (netboot) { + if (parent != pcidev) + return; + else { + struct pci_attach_args *pa = aux; + + if ((b->slot % 1000) != pa->pa_device) + return; + + /* XXX function? */ + + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + return; + } + } +} diff --git a/sys/arch/alpha/pci/pci_1000a.c b/sys/arch/alpha/pci/pci_1000a.c new file mode 100644 index 000000000000..7a99d708dea1 --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000a.c @@ -0,0 +1,335 @@ +/* $NetBSD: pci_1000a.c,v 1.1 1998/06/24 01:41:16 ross Exp $ */ + +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is based on pci_kn20aa.c, written by Chris G. Demetriou at + * Carnegie-Mellon University. Platform support for Noritake, Pintake, and + * Corelle by Ross Harvey with copyright assignment by permission of Avalon + * Computer Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include /* RCS ID & Copyright macro defns */ + +__KERNEL_RCSID(0, "$NetBSD: pci_1000a.c,v 1.1 1998/06/24 01:41:16 ross Exp $"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include + +#ifndef EVCNT_COUNTERS +#include +#endif + +#include "sio.h" +#if NSIO +#include +#endif + +#define IMR2IRQ(bn) ((bn) - 1) +#define IRQ2IMR(irq) ((irq) + 1) + +static bus_space_tag_t mystery_icu_iot; +static bus_space_handle_t mystery_icu_ioh[2]; + +int dec_1000a_intr_map __P((void *, pcitag_t, int, int, + pci_intr_handle_t *)); +const char *dec_1000a_intr_string __P((void *, pci_intr_handle_t)); +void *dec_1000a_intr_establish __P((void *, pci_intr_handle_t, + int, int (*func)(void *), void *)); +void dec_1000a_intr_disestablish __P((void *, void *)); + +#define DEC_1000A_MAX_IRQ 32 +#define PCI_STRAY_MAX 5 + +struct alpha_shared_intr *dec_1000a_pci_intr; +#ifdef EVCNT_COUNTERS +struct evcnt dec_1000a_intr_evcnt; +#endif + +static void dec_1000a_iointr __P((void *framep, unsigned long vec)); +static void dec_1000a_enable_intr __P((int irq)); +static void dec_1000a_disable_intr __P((int irq)); +static void pci_1000a_imi __P((void)); +static pci_chipset_tag_t pc_tag; + +int ross_tmp_didr; /* XXX XXX XXX */ +int ross_tmp_didv; /* XXX XXX XXX */ + +void +pci_1000a_pickintr(core, iot, memt, pc) + void *core; + bus_space_tag_t iot, memt; + pci_chipset_tag_t pc; +{ + int i; + mystery_icu_iot = iot; + + pc_tag = pc; + if (bus_space_map(iot, 0x54a, 2, 0, mystery_icu_ioh + 0) + || bus_space_map(iot, 0x54c, 2, 0, mystery_icu_ioh + 1)) + panic("pci_1000a_pickintr"); + pc->pc_intr_v = core; + pc->pc_intr_map = dec_1000a_intr_map; + pc->pc_intr_string = dec_1000a_intr_string; + pc->pc_intr_establish = dec_1000a_intr_establish; + pc->pc_intr_disestablish = dec_1000a_intr_disestablish; + + pc->pc_pciide_compat_intr_establish = NULL; + + dec_1000a_pci_intr = alpha_shared_intr_alloc(DEC_1000A_MAX_IRQ); + for (i = 0; i < DEC_1000A_MAX_IRQ; i++) + alpha_shared_intr_set_maxstrays(dec_1000a_pci_intr, i, + PCI_STRAY_MAX); + + pci_1000a_imi(); +#if NSIO + sio_intr_setup(pc, iot); +#endif + set_iointr(dec_1000a_iointr); +} + +int +dec_1000a_intr_map(ccv, bustag, buspin, line, ihp) + void *ccv; + pcitag_t bustag; + int buspin, line; + pci_intr_handle_t *ihp; +{ + int imrbit, device; + /* + * Get bit number in mystery ICU imr + */ + static const signed char imrmap[][4] = { +# define IRQSPLIT(o) { (o), (o)+1, (o)+16, (o)+16+1 } +# define IRQNONE { 0, 0, 0, 0 } + /* 0 */ { 1, 0, 0, 0 }, /* Noritake and Pintake */ + /* 1 */ IRQSPLIT(8), + /* 2 */ IRQSPLIT(10), + /* 3 */ IRQSPLIT(12), + /* 4 */ IRQSPLIT(14), + /* 5 */ { 1, 0, 0, 0 }, /* Corelle */ + /* 6 */ { 10, 0, 0, 0 }, /* Corelle */ + /* 7 */ IRQNONE, + /* 8 */ IRQNONE, + /* 9 */ IRQNONE, + /* 10 */ IRQNONE, + /* 11 */ IRQSPLIT(2), + /* 12 */ IRQSPLIT(4), + /* 13 */ IRQSPLIT(6), + /* 14 */ IRQSPLIT(8) /* Corelle */ + }; + + if (buspin == 0) /* No IRQ used. */ + return 1; + if (!(1 <= buspin && buspin <= 4)) + goto bad; + alpha_pci_decompose_tag(pc_tag, bustag, NULL, &device, NULL); + if (0 <= device && device < sizeof imrmap / sizeof imrmap[0]) { + imrbit = imrmap[device][buspin - 1]; + if (imrbit) { + *ihp = IMR2IRQ(imrbit); + return 0; + } + } +bad: printf("dec_1000a_intr_map: can't map dev %d pin %d\n", device, buspin); + return 1; +} + +const char * +dec_1000a_intr_string(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ + static const char irqmsg_fmt[] = "dec_1000a irq %ld"; + static char irqstr[sizeof irqmsg_fmt]; + + + if (ih > DEC_1000A_MAX_IRQ) + panic("dec_1000a_intr_string: bogus dec_1000a IRQ 0x%x\n", ih); + + sprintf(irqstr, irqmsg_fmt, ih); + return (irqstr); +} + +void * +dec_1000a_intr_establish(ccv, ih, level, func, arg) + void *ccv, *arg; + pci_intr_handle_t ih; + int level; + int (*func) __P((void *)); +{ + void *cookie; + + if (ih > DEC_1000A_MAX_IRQ) + panic("dec_1000a_intr_establish: IRQ too high, 0x%x\n", ih); + + cookie = alpha_shared_intr_establish(dec_1000a_pci_intr, ih, IST_LEVEL, + level, func, arg, "dec_1000a irq"); + + if (cookie != NULL && + alpha_shared_intr_isactive(dec_1000a_pci_intr, ih)) + dec_1000a_enable_intr(ih); + return (cookie); +} + +void +dec_1000a_intr_disestablish(ccv, cookie) + void *ccv, *cookie; +{ + panic("dec_1000a_intr_disestablish not implemented"); /* XXX */ +} + +static void +dec_1000a_iointr(framep, vec) + void *framep; + unsigned long vec; +{ + int irq; + +if (ross_tmp_didv) +printf("\tvec 0x%x\n", vec); + if (vec >= 0x900) { + if (vec >= 0x900 + (DEC_1000A_MAX_IRQ << 4)) + panic("dec_1000a_iointr: vec 0x%x out of range\n", vec); + irq = (vec - 0x900) >> 4; +#ifdef EVCNT_COUNTERS + dec_1000a_intr_evcnt.ev_count++; +#else + if (DEC_1000A_MAX_IRQ != INTRCNT_DEC_1000A_IRQ_LEN) + panic("dec_1000a interrupt counter sizes inconsistent"); + intrcnt[INTRCNT_DEC_1000A_IRQ + irq]++; +#endif + + if (!alpha_shared_intr_dispatch(dec_1000a_pci_intr, irq)) { + alpha_shared_intr_stray(dec_1000a_pci_intr, irq, + "dec_1000a irq"); + if (dec_1000a_pci_intr[irq].intr_nstrays == + dec_1000a_pci_intr[irq].intr_maxstrays) + dec_1000a_disable_intr(irq); + } + return; + } +#if NSIO + if (vec >= 0x800) { + sio_iointr(framep, vec); + return; + } +#endif + panic("dec_1000a_iointr: weird vec 0x%x\n", vec); +} + +/* + * Read and write the mystery ICU IMR registers + */ + +#define IR(h) bus_space_read_2(mystery_icu_iot, mystery_icu_ioh[h], 0) +#define IW(h, v) bus_space_write_2(mystery_icu_iot, mystery_icu_ioh[h], 0, (v)) + +/* + * Enable and disable interrupts at the ICU level + */ + +static void +dec_1000a_enable_intr(irq) + int irq; +{ + int imrval = IRQ2IMR(irq); + int i = imrval >= 16; + +if (ross_tmp_didr) { +IW(0, ~0); +IW(1, ~0); +return; +} + IW(i, IR(i) | 1 << (imrval & 0xf)); +} + +static void +dec_1000a_disable_intr(irq) + int irq; +{ + int imrval = IRQ2IMR(irq); + int i = imrval >= 16; + + IW(i, IR(i) & ~(1 << (imrval & 0xf))); +} +/* + * Initialize mystery ICU + */ +static void +pci_1000a_imi() +{ + IW(0, IR(0) & 1); + IW(1, IR(0) & 3); +} diff --git a/sys/arch/alpha/pci/pci_1000a.h b/sys/arch/alpha/pci/pci_1000a.h new file mode 100644 index 000000000000..97316bb5d7a6 --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000a.h @@ -0,0 +1,44 @@ +/* $NetBSD: pci_1000a.h,v 1.1 1998/06/24 01:41:16 ross Exp $ */ + +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Platform support for Noritake, Pintake, and Corelle by Ross Harvey + * with copyright assignment by permission of Avalon Computer Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +void pci_1000a_pickintr __P((void *, bus_space_tag_t, bus_space_tag_t, + pci_chipset_tag_t)); + +#ifdef EVCNT_COUNTERS +extern struct evcnt dec_1000a_intr_evcnt; +#endif