diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2002-06-30 16:24:41 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2002-06-30 16:24:41 +0000 |
commit | a2fbdd777ee87db8a3e3bddeca60fb56d895fc51 (patch) | |
tree | 70c6a0f2ea261054dda398ea4bf3da5ce249d96e /sys | |
parent | a67f8848962fcacf156f56c188f331665e69be59 (diff) |
AlphaServer 800 and 1000 support; from NetBSD. Tested by Tor Houghton.
Added to floppy31 still fits.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/alpha/alpha/cpuconf.c | 20 | ||||
-rw-r--r-- | sys/arch/alpha/alpha/dec_1000a.c | 363 | ||||
-rw-r--r-- | sys/arch/alpha/conf/GENERIC | 4 | ||||
-rw-r--r-- | sys/arch/alpha/conf/RAMDISK | 5 | ||||
-rw-r--r-- | sys/arch/alpha/conf/RAMDISKB | 5 | ||||
-rw-r--r-- | sys/arch/alpha/conf/RAMDISKBIG | 5 | ||||
-rw-r--r-- | sys/arch/alpha/conf/files.alpha | 7 | ||||
-rw-r--r-- | sys/arch/alpha/pci/pci_1000.c | 348 | ||||
-rw-r--r-- | sys/arch/alpha/pci/pci_1000.h | 41 | ||||
-rw-r--r-- | sys/arch/alpha/pci/pci_1000a.c | 373 | ||||
-rw-r--r-- | sys/arch/alpha/pci/pci_1000a.h | 41 |
11 files changed, 1203 insertions, 9 deletions
diff --git a/sys/arch/alpha/alpha/cpuconf.c b/sys/arch/alpha/alpha/cpuconf.c index 80fb7380745..b6378d14a2b 100644 --- a/sys/arch/alpha/alpha/cpuconf.c +++ b/sys/arch/alpha/alpha/cpuconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpuconf.c,v 1.8 2002/06/25 21:33:19 miod Exp $ */ +/* $OpenBSD: cpuconf.c,v 1.9 2002/06/30 16:24:37 miod Exp $ */ /* $NetBSD: cpuconf.c,v 1.27 2000/06/26 02:42:04 enami Exp $ */ /*- @@ -127,6 +127,20 @@ extern void dec_550_init(void); #define dec_550_init platform_not_configured #endif +#if defined(DEC_1000) || defined(DEC_1000A) +extern void _dec_1000a_init(void); +#endif +#ifdef DEC_1000A +#define dec_1000a_init _dec_1000a_init +#else +#define dec_1000a_init platform_not_configured +#endif +#ifdef DEC_1000 +#define dec_1000_init _dec_1000a_init +#else +#define dec_1000_init platform_not_configured +#endif + #ifdef DEC_6600 extern void dec_6600_init(void); #else @@ -154,7 +168,7 @@ static const struct cpuinit cpuinit[] = { cpu_init(ST_DEC_2100_A50, dec_2100_a50_init, "DEC_2100_A50"), cpu_notsupp(ST_DEC_MUSTANG, "Mustang"), cpu_init(ST_DEC_KN20AA, dec_kn20aa_init, "DEC_KN20AA"), - cpu_notsupp(ST_DEC_1000, "DEC_1000"), + cpu_init(ST_DEC_1000, dec_1000_init, "DEC_1000"), cpu_notsupp(ST_EB66, "DEC_EB66"), cpu_init(ST_EB64P, dec_eb64plus_init, "DEC_EB64PLUS"), cpu_notsupp(ST_ALPHABOOK1, "DEC_ALPHABOOK1"), @@ -162,7 +176,7 @@ static const struct cpuinit cpuinit[] = { cpu_notsupp(ST_DEC_EV45_PBP, "EV45 Passive Backplane Board"), cpu_notsupp(ST_DEC_2100A_A500, "DEC_2100A_A500"), cpu_init(ST_EB164, dec_eb164_init, "DEC_EB164"), - cpu_notsupp(ST_DEC_1000A, "DEC_1000A"), + cpu_init(ST_DEC_1000A, dec_1000a_init, "DEC_1000A"), cpu_notsupp(ST_DEC_ALPHAVME_224, "AlphaVME 224"), cpu_init(ST_DEC_550, dec_550_init, "DEC_550"), cpu_notsupp(ST_DEC_EV56_PBP, "EV56 Passive Backplane Board"), diff --git a/sys/arch/alpha/alpha/dec_1000a.c b/sys/arch/alpha/alpha/dec_1000a.c new file mode 100644 index 00000000000..f63a127c3cf --- /dev/null +++ b/sys/arch/alpha/alpha/dec_1000a.c @@ -0,0 +1,363 @@ +/* $OpenBSD: dec_1000a.c,v 1.1 2002/06/30 16:24:37 miod Exp $ */ +/* $NetBSD: dec_1000a.c,v 1.14 2001/06/05 04:53:11 thorpej 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 <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> +#include <sys/termios.h> +#include <dev/cons.h> + +#include <machine/rpb.h> +#include <machine/autoconf.h> +#include <machine/cpuconf.h> +#include <machine/conf.h> +#include <machine/bus.h> + +#include <dev/ic/comreg.h> +#include <dev/ic/comvar.h> + +#include <dev/isa/isareg.h> +#include <dev/isa/isavar.h> +#include <dev/ic/i8042reg.h> +#include <dev/ic/pckbcvar.h> +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> + +#include <alpha/pci/apecsreg.h> +#include <alpha/pci/apecsvar.h> +#include <alpha/pci/ciareg.h> +#include <alpha/pci/ciavar.h> + +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + +#include "pckbd.h" + +#ifndef CONSPEED +#define CONSPEED TTYDEF_SPEED +#endif +static int comcnrate = CONSPEED; + +void _dec_1000a_init(void); +void dec_1000a_cons_init(void); +void dec_1000a_device_register(struct device *, void *); + +#ifdef KGDB +#include <machine/db_machdep.h> + +const char *kgdb_devlist[] = { + "com", + NULL, +}; +#endif /* KGDB */ + +const struct alpha_variation_table dec_1000_variations[] = { + { 0, "AlphaServer 1000" }, + { 0, NULL }, +}; + +const struct alpha_variation_table dec_1000a_variations[] = { + { 0, "AlphaServer 1000A" }, + { 0, NULL }, +}; + +void +_dec_1000a_init() +{ + u_int64_t variation; + + platform.family = "AlphaServer 1000/1000A"; + + if ((platform.model = alpha_dsr_sysname()) == NULL) { + variation = hwrpb->rpb_variation & SV_ST_MASK; + if ((platform.model = alpha_variation_name(variation, + cputype == ST_DEC_1000 ? dec_1000_variations + : 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; +} + +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 CTB_PRINTERPORT: + /* 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 CTB_GRAPHICS: +#if NPCKBD > 0 + /* display console ... */ + /* XXX */ + (void) pckbc_cnattach(iot, IO_KBD, KBCMDP, PCKBC_KBD_SLOT); + + /* + * AlphaServer 1000s have a firmware bug whereby the + * built-in ISA VGA is reported incorrectly -- ctb_turboslot + * is mostly 0. + */ + switch (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot)) { + case CTB_TURBOSLOT_TYPE_PCI: + pci_display_console(iot, memt, pcichipset, + CTB_TURBOSLOT_BUS(ctb->ctb_turboslot), + CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0); + break; + + default: + isa_display_console(iot, memt); + break; + } +#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 %ld\n", + ctb->ctb_term_type); + } +#ifdef KGDB + /* Attach the KGDB device. */ + alpha_kgdb_init(kgdb_devlist, iot); +#endif /* KGDB */ +} + +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) || + (strcmp(b->protocol, "MOP") == 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 scsibus_attach_args *sa = aux; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->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/conf/GENERIC b/sys/arch/alpha/conf/GENERIC index 9895029c55d..ea0795f3013 100644 --- a/sys/arch/alpha/conf/GENERIC +++ b/sys/arch/alpha/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.111 2002/06/30 16:23:04 miod Exp $ +# $OpenBSD: GENERIC,v 1.112 2002/06/30 16:24:40 miod Exp $ # $NetBSD: GENERIC,v 1.31 1996/12/03 17:25:29 cgd Exp $ machine alpha @@ -16,6 +16,8 @@ option DEC_EB164 # EB164: AlphaPC 164 option DEC_EB64PLUS # EB64+: AlphaPC 64, etc. option DEC_2000_300 # "Jensen": 2000/300 (DECpc AXP 150) option DEC_550 # Miata: Digital Personal Workstation +option DEC_1000 # Mikasa etc: Digital AlphaServer 1000 +option DEC_1000A # Corelle etc: Digital AlphaServer 800/1000A option DEC_6600 # EV6: XP1000, 264DP OEM Board option API_UP1000 # EV6: Alpha Processor UP1000 diff --git a/sys/arch/alpha/conf/RAMDISK b/sys/arch/alpha/conf/RAMDISK index 45fb5915704..b0702796c91 100644 --- a/sys/arch/alpha/conf/RAMDISK +++ b/sys/arch/alpha/conf/RAMDISK @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK,v 1.57 2002/05/02 22:56:06 miod Exp $ +# $OpenBSD: RAMDISK,v 1.58 2002/06/30 16:24:40 miod Exp $ # $NetBSD: RAMDISK,v 1.9 1996/12/03 17:25:33 cgd Exp $ machine alpha # architecture, used by config; REQUIRED @@ -12,8 +12,11 @@ option DEC_2100_A50 # Avanti etc: AlphaStation 400, 200, etc. option DEC_KN20AA # KN20AA: AlphaStation 600 option DEC_AXPPCI_33 # NoName: AXPpci33, etc. option DEC_EB164 # EB164: AlphaPC 164 +#option DEC_EB64PLUS # EB64+: AlphaPC 64, etc. option DEC_2000_300 # "Jensen": 2000/300 (DECpc AXP 150) option DEC_550 # Miata: Digital Personal Workstation +option DEC_1000 # Mikasa etc: Digital AlphaServer 1000 +option DEC_1000A # Corelle etc: Digital AlphaServer 800/1000A #option DEC_6600 # EV6: XP1000, 264DP OEM Board #option API_UP1000 # EV6: Alpha Processor UP1000 diff --git a/sys/arch/alpha/conf/RAMDISKB b/sys/arch/alpha/conf/RAMDISKB index 93e37dcd853..7596bba6aa0 100644 --- a/sys/arch/alpha/conf/RAMDISKB +++ b/sys/arch/alpha/conf/RAMDISKB @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISKB,v 1.20 2002/05/02 22:56:06 miod Exp $ +# $OpenBSD: RAMDISKB,v 1.21 2002/06/30 16:24:40 miod Exp $ # $NetBSD: RAMDISK,v 1.9 1996/12/03 17:25:33 cgd Exp $ machine alpha # architecture, used by config; REQUIRED @@ -12,8 +12,11 @@ option SMALL_KERNEL #option DEC_KN20AA # KN20AA: AlphaStation 600 #option DEC_AXPPCI_33 # NoName: AXPpci33, etc. #option DEC_EB164 # EB164: AlphaPC 164 +#option DEC_EB64PLUS # EB64+: AlphaPC 64, etc. #option DEC_2000_300 # "Jensen": 2000/300 (DECpc AXP 150) #option DEC_550 # Miata: Digital Personal Workstation +#option DEC_1000 # Mikasa etc: Digital AlphaServer 1000 +#option DEC_1000A # Corelle etc: Digital AlphaServer 800/1000A option DEC_6600 # EV6: XP1000, 264DP OEM Board option API_UP1000 # EV6: Alpha Processor UP1000 diff --git a/sys/arch/alpha/conf/RAMDISKBIG b/sys/arch/alpha/conf/RAMDISKBIG index 261cc60197f..54c8b53f68f 100644 --- a/sys/arch/alpha/conf/RAMDISKBIG +++ b/sys/arch/alpha/conf/RAMDISKBIG @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISKBIG,v 1.30 2002/06/28 16:53:16 art Exp $ +# $OpenBSD: RAMDISKBIG,v 1.31 2002/06/30 16:24:40 miod Exp $ # $NetBSD: GENERIC,v 1.31 1996/12/03 17:25:29 cgd Exp $ # # Generic Alpha kernel. Enough to get booted, etc., but not much more. @@ -12,8 +12,11 @@ option DEC_2100_A50 # Avanti etc: AlphaStation 400, 200, etc. option DEC_KN20AA # KN20AA: AlphaStation 600 option DEC_AXPPCI_33 # NoName: AXPpci33, etc. option DEC_EB164 # EB164: AlphaPC 164 +option DEC_EB64PLUS # EB64+: AlphaPC 64, etc. option DEC_2000_300 # "Jensen": 2000/300 (DECpc AXP 150) option DEC_550 # Miata: Digital Personal Workstation +option DEC_1000 # Mikasa etc: Digital AlphaServer 1000 +option DEC_1000A # Corelle etc: Digital AlphaServer 800/1000A option DEC_6600 # EV6: XP1000, 264DP OEM Board option API_UP1000 # EV6: Alpha Processor UP1000 diff --git a/sys/arch/alpha/conf/files.alpha b/sys/arch/alpha/conf/files.alpha index 8d6c26e4f3c..69ec6199812 100644 --- a/sys/arch/alpha/conf/files.alpha +++ b/sys/arch/alpha/conf/files.alpha @@ -1,4 +1,4 @@ -# $OpenBSD: files.alpha,v 1.58 2002/05/02 22:56:06 miod Exp $ +# $OpenBSD: files.alpha,v 1.59 2002/06/30 16:24:40 miod Exp $ # $NetBSD: files.alpha,v 1.32 1996/11/25 04:03:21 cgd Exp $ # # alpha-specific configuration info @@ -12,7 +12,7 @@ maxusers 2 8 64 define alpha_shared_intr file arch/alpha/dev/shared_intr.c alpha_shared_intr | dec_eb164 | dec_kn20aa | dec_6600 | dec_550 | - dec_eb64plus + dec_1000 | dec_1000a | dec_eb64plus define alpha_sgmap file arch/alpha/dev/sgmap_common.c alpha_sgmap | dec_3000_500 @@ -228,6 +228,8 @@ file arch/alpha/pci/pci_eb64plus.c dec_eb64plus file arch/alpha/pci/pci_eb64plus_intr.s dec_eb64plus file arch/alpha/pci/pci_kn20aa.c dec_kn20aa file arch/alpha/pci/pci_550.c dec_550 +file arch/alpha/pci/pci_1000a.c dec_1000a +file arch/alpha/pci/pci_1000.c dec_1000 file arch/alpha/pci/pci_6600.c dec_6600 file arch/alpha/pci/pci_up1000.c api_up1000 @@ -313,6 +315,7 @@ file arch/alpha/alpha/dec_eb164.c dec_eb164 needs-flag file arch/alpha/alpha/dec_eb64plus.c dec_eb64plus needs-flag file arch/alpha/alpha/dec_kn20aa.c dec_kn20aa needs-flag file arch/alpha/alpha/dec_550.c dec_550 needs-flag +file arch/alpha/alpha/dec_1000a.c dec_1000 | dec_1000a needs-flag file arch/alpha/alpha/dec_6600.c dec_6600 needs-flag file arch/alpha/alpha/api_up1000.c api_up1000 needs-flag diff --git a/sys/arch/alpha/pci/pci_1000.c b/sys/arch/alpha/pci/pci_1000.c new file mode 100644 index 00000000000..3d5ae2e63a7 --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000.c @@ -0,0 +1,348 @@ +/* $OpenBSD: pci_1000.c,v 1.1 2002/06/30 16:24:40 miod Exp $ */ +/* $NetBSD: pci_1000.c,v 1.12 2001/07/27 00:25:20 thorpej 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 Mikasa and Mikasa/Pinnacle + * (Pinkasa) 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 <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/systm.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/device.h> + +#include <uvm/uvm_extern.h> + +#include <machine/autoconf.h> + +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> + +#include <alpha/pci/pci_1000.h> + +#include "sio.h" +#if NSIO > 0 || NPCEB > 0 +#include <alpha/pci/siovar.h> +#endif + +static bus_space_tag_t another_mystery_icu_iot; +static bus_space_handle_t another_mystery_icu_ioh; + +int dec_1000_intr_map(void *, pcitag_t, int, int, pci_intr_handle_t *); +const char *dec_1000_intr_string(void *, pci_intr_handle_t); +int dec_1000_intr_line(void *, pci_intr_handle_t); +#if 0 +const struct evcnt *dec_1000_intr_evcnt(void *, pci_intr_handle_t); +#endif +void *dec_1000_intr_establish(void *, pci_intr_handle_t, + int, int (*func)(void *), void *, char *); +void dec_1000_intr_disestablish(void *, void *); + +#define PCI_NIRQ 16 +#define PCI_STRAY_MAX 5 + +struct alpha_shared_intr *dec_1000_pci_intr; + +void dec_1000_iointr(void *framep, unsigned long vec); +void dec_1000_enable_intr(int irq); +void dec_1000_disable_intr(int irq); +void pci_1000_imi(void); +static pci_chipset_tag_t pc_tag; + +void +pci_1000_pickintr(core, iot, memt, pc) + void *core; + bus_space_tag_t iot, memt; + pci_chipset_tag_t pc; +{ +#if 0 + char *cp; +#endif + int i; + + another_mystery_icu_iot = iot; + + pc_tag = pc; + if (bus_space_map(iot, 0x536, 2, 0, &another_mystery_icu_ioh)) + panic("pci_1000_pickintr"); + pc->pc_intr_v = core; + pc->pc_intr_map = dec_1000_intr_map; + pc->pc_intr_string = dec_1000_intr_string; + pc->pc_intr_line = dec_1000_intr_line; +#if 0 + pc->pc_intr_evcnt = dec_1000_intr_evcnt; +#endif + pc->pc_intr_establish = dec_1000_intr_establish; + pc->pc_intr_disestablish = dec_1000_intr_disestablish; + + pc->pc_pciide_compat_intr_establish = NULL; + pc->pc_pciide_compat_intr_disestablish = NULL; + + dec_1000_pci_intr = + alpha_shared_intr_alloc(PCI_NIRQ); + for (i = 0; i < PCI_NIRQ; i++) { + alpha_shared_intr_set_maxstrays(dec_1000_pci_intr, i, + PCI_STRAY_MAX); + +#if 0 + cp = alpha_shared_intr_string(dec_1000_pci_intr, i); + sprintf(cp, "irq %d", i); + evcnt_attach_dynamic(alpha_shared_intr_evcnt( + dec_1000_pci_intr, i), EVCNT_TYPE_INTR, NULL, + "dec_1000", cp); +#endif + } + + pci_1000_imi(); +#if NSIO > 0 || NPCEB > 0 + sio_intr_setup(pc, iot); +#endif + set_iointr(dec_1000_iointr); +} + +int +dec_1000_intr_map(ccv, bustag, buspin, line, ihp) + void *ccv; + pcitag_t bustag; + int buspin, line; + pci_intr_handle_t *ihp; +{ + int device; + + 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); + + switch(device) { + case 6: + if(buspin != 1) + break; + *ihp = 0xc; /* integrated ncr scsi */ + return 0; + case 11: + case 12: + case 13: + *ihp = (device - 11) * 4 + buspin - 1; + return 0; + } + +bad: printf("dec_1000_intr_map: can't map dev %d pin %d\n", device, buspin); + return 1; +} + +const char * +dec_1000_intr_string(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ + static const char irqmsg_fmt[] = "dec_1000 irq %ld"; + static char irqstr[sizeof irqmsg_fmt]; + + if (ih >= PCI_NIRQ) + panic("dec_1000_intr_string: bogus dec_1000 IRQ 0x%lx", ih); + + snprintf(irqstr, sizeof irqstr, irqmsg_fmt, ih); + return (irqstr); +} + +int +dec_1000_intr_line(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ +#if NSIO > 0 + return sio_intr_line(NULL /*XXX*/, ih); +#else + return (ih); +#endif +} + +#if 0 +const struct evcnt * +dec_1000_intr_evcnt(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ + + if (ih >= PCI_NIRQ) + panic("dec_1000_intr_evcnt: bogus dec_1000 IRQ 0x%lx", ih); + + return (alpha_shared_intr_evcnt(dec_1000_pci_intr, ih)); +} +#endif + +void * +dec_1000_intr_establish(ccv, ih, level, func, arg, name) + void *ccv; + pci_intr_handle_t ih; + int level; + int (*func)(void *); + void *arg; + char *name; +{ + void *cookie; + + if (ih >= PCI_NIRQ) + panic("dec_1000_intr_establish: IRQ too high, 0x%lx", ih); + + cookie = alpha_shared_intr_establish(dec_1000_pci_intr, ih, IST_LEVEL, + level, func, arg, name); + + if (cookie != NULL && + alpha_shared_intr_isactive(dec_1000_pci_intr, ih)) { + dec_1000_enable_intr(ih); + } + return (cookie); +} + +void +dec_1000_intr_disestablish(ccv, cookie) + void *ccv, *cookie; +{ + struct alpha_shared_intrhand *ih = cookie; + unsigned int irq = ih->ih_num; + int s; + + s = splhigh(); + + alpha_shared_intr_disestablish(dec_1000_pci_intr, cookie, + "dec_1000 irq"); + if (alpha_shared_intr_isactive(dec_1000_pci_intr, irq) == 0) { + dec_1000_disable_intr(irq); + alpha_shared_intr_set_dfltsharetype(dec_1000_pci_intr, irq, + IST_NONE); + } + + splx(s); +} + +void +dec_1000_iointr(framep, vec) + void *framep; + unsigned long vec; +{ + int irq; + + if (vec >= 0x900) { + if (vec >= 0x900 + (PCI_NIRQ << 4)) + panic("dec_1000_iointr: vec 0x%lx out of range", vec); + irq = (vec - 0x900) >> 4; + + if (!alpha_shared_intr_dispatch(dec_1000_pci_intr, irq)) { + alpha_shared_intr_stray(dec_1000_pci_intr, irq, + "dec_1000 irq"); + if (ALPHA_SHARED_INTR_DISABLE(dec_1000_pci_intr, irq)) + dec_1000_disable_intr(irq); + } + return; + } +#if NSIO > 0 || NPCEB > 0 + if (vec >= 0x800) { + sio_iointr(framep, vec); + return; + } +#endif + panic("dec_1000_intr: weird vec 0x%lx", vec); +} + +/* + * Read and write the mystery ICU IMR registers + */ + +#define IR() bus_space_read_2(another_mystery_icu_iot, \ + another_mystery_icu_ioh, 0) + +#define IW(v) bus_space_write_2(another_mystery_icu_iot, \ + another_mystery_icu_ioh, 0, (v)) + +/* + * Enable and disable interrupts at the ICU level + */ + +void +dec_1000_enable_intr(irq) + int irq; +{ + IW(IR() | 1 << irq); +} + +void +dec_1000_disable_intr(irq) + int irq; +{ + IW(IR() & ~(1 << irq)); +} +/* + * Initialize mystery ICU + */ +void +pci_1000_imi() +{ + IW(0); /* XXX ?? */ +} diff --git a/sys/arch/alpha/pci/pci_1000.h b/sys/arch/alpha/pci/pci_1000.h new file mode 100644 index 00000000000..1b1fea1c01f --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000.h @@ -0,0 +1,41 @@ +/* $OpenBSD: pci_1000.h,v 1.1 2002/06/30 16:24:40 miod Exp $ */ +/* $NetBSD: pci_1000.h,v 1.1 1998/06/26 21:45:56 ross Exp $ */ + +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Platform support for Mikasa and Mikasa/Pinnacle (Pinkasa) 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_1000_pickintr(void *, bus_space_tag_t, bus_space_tag_t, + pci_chipset_tag_t); diff --git a/sys/arch/alpha/pci/pci_1000a.c b/sys/arch/alpha/pci/pci_1000a.c new file mode 100644 index 00000000000..5392264f46d --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000a.c @@ -0,0 +1,373 @@ +/* $OpenBSD: pci_1000a.c,v 1.1 2002/06/30 16:24:40 miod Exp $ */ +/* $NetBSD: pci_1000a.c,v 1.14 2001/07/27 00:25:20 thorpej 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 <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/systm.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/device.h> + +#include <uvm/uvm_extern.h> + +#include <machine/autoconf.h> + +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> + +#include <alpha/pci/pci_1000a.h> + +#include "sio.h" +#if NSIO > 0 || NPCEB > 0 +#include <alpha/pci/siovar.h> +#endif + +#define PCI_NIRQ 32 +#define PCI_STRAY_MAX 5 + +#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(void *, pcitag_t, int, int, + pci_intr_handle_t *); +const char *dec_1000a_intr_string(void *, pci_intr_handle_t); +int dec_1000a_intr_line(void *, pci_intr_handle_t); +#if 0 +const struct evcnt *dec_1000a_intr_evcnt(void *, pci_intr_handle_t); +#endif +void *dec_1000a_intr_establish(void *, pci_intr_handle_t, + int, int (*func)(void *), void *, char *); +void dec_1000a_intr_disestablish(void *, void *); + +struct alpha_shared_intr *dec_1000a_pci_intr; + +void dec_1000a_iointr(void *arg, unsigned long vec); +void dec_1000a_enable_intr(int irq); +void dec_1000a_disable_intr(int irq); +void pci_1000a_imi(void); +static pci_chipset_tag_t pc_tag; + +void +pci_1000a_pickintr(core, iot, memt, pc) + void *core; + bus_space_tag_t iot, memt; + pci_chipset_tag_t pc; +{ +#if 0 + char *cp; +#endif + 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_line = dec_1000a_intr_line; +#if 0 + pc->pc_intr_evcnt = dec_1000a_intr_evcnt; +#endif + pc->pc_intr_establish = dec_1000a_intr_establish; + pc->pc_intr_disestablish = dec_1000a_intr_disestablish; + + pc->pc_pciide_compat_intr_establish = NULL; + pc->pc_pciide_compat_intr_disestablish = NULL; + + dec_1000a_pci_intr = alpha_shared_intr_alloc(PCI_NIRQ); + for (i = 0; i < PCI_NIRQ; i++) { + alpha_shared_intr_set_maxstrays(dec_1000a_pci_intr, i, + PCI_STRAY_MAX); + +#if 0 + cp = alpha_shared_intr_string(dec_1000a_pci_intr, i); + sprintf(cp, "irq %d", i); + evcnt_attach_dynamic(alpha_shared_intr_evcnt( + dec_1000a_pci_intr, i), EVCNT_TYPE_INTR, NULL, + "dec_1000a", cp); +#endif + } + + pci_1000a_imi(); +#if NSIO > 0 || NPCEB > 0 + 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 */ { 1, 0, 0, 0 }, /* isp behind ppb */ + /* 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]) { + if (device == 0) + printf("dec_1000a_intr_map: ?! UNEXPECTED DEV 0\n"); + 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 >= PCI_NIRQ) + panic("dec_1000a_intr_string: bogus dec_1000a IRQ 0x%lx", ih); + + snprintf(irqstr, sizeof irqstr, irqmsg_fmt, ih); + return (irqstr); +} + +int +dec_1000a_intr_line(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ +#if NSIO > 0 + return sio_intr_line(NULL /*XXX*/, ih); +#else + return (ih); +#endif +} + +#if 0 +const struct evcnt * +dec_1000a_intr_evcnt(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ + + if (ih >= PCI_NIRQ) + panic("dec_1000a_intr_evcnt: bogus dec_1000a IRQ 0x%lx", ih); + + return (alpha_shared_intr_evcnt(dec_1000a_pci_intr, ih)); +} +#endif + +void * +dec_1000a_intr_establish(ccv, ih, level, func, arg, name) + void *ccv; + pci_intr_handle_t ih; + int level; + int (*func)(void *); + void *arg; + char *name; +{ + void *cookie; + + if (ih >= PCI_NIRQ) + panic("dec_1000a_intr_establish: IRQ too high, 0x%lx", ih); + + cookie = alpha_shared_intr_establish(dec_1000a_pci_intr, ih, IST_LEVEL, + level, func, arg, name); + + 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; +{ + struct alpha_shared_intrhand *ih = cookie; + unsigned int irq = ih->ih_num; + int s; + + s = splhigh(); + + alpha_shared_intr_disestablish(dec_1000a_pci_intr, cookie, + "dec_1000a irq"); + if (alpha_shared_intr_isactive(dec_1000a_pci_intr, irq) == 0) { + dec_1000a_disable_intr(irq); + alpha_shared_intr_set_dfltsharetype(dec_1000a_pci_intr, irq, + IST_NONE); + } + + splx(s); +} + +void +dec_1000a_iointr(framep, vec) + void *framep; + unsigned long vec; +{ + int irq; + + if (vec >= 0x900) { + if (vec >= 0x900 + (PCI_NIRQ << 4)) + panic("dec_1000_iointr: vec 0x%lx out of range", vec); + irq = (vec - 0x900) >> 4; + + if (!alpha_shared_intr_dispatch(dec_1000a_pci_intr, irq)) { + alpha_shared_intr_stray(dec_1000a_pci_intr, irq, + "dec_1000a irq"); + if (ALPHA_SHARED_INTR_DISABLE(dec_1000a_pci_intr, irq)) + dec_1000a_disable_intr(irq); + } + return; + } +#if NSIO > 0 || NPCEB > 0 + if (vec >= 0x800) { + sio_iointr(framep, vec); + return; + } +#endif + panic("dec_1000a_intr: weird vec 0x%lx", 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 + */ + +void +dec_1000a_enable_intr(irq) + int irq; +{ + int imrval = IRQ2IMR(irq); + int i = imrval >= 16; + + IW(i, IR(i) | 1 << (imrval & 0xf)); +} + +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 + */ +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 00000000000..e4d94182e0f --- /dev/null +++ b/sys/arch/alpha/pci/pci_1000a.h @@ -0,0 +1,41 @@ +/* $OpenBSD: pci_1000a.h,v 1.1 2002/06/30 16:24:40 miod Exp $ */ +/* $NetBSD: pci_1000a.h,v 1.2 1998/06/26 21:59:46 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(void *, bus_space_tag_t, bus_space_tag_t, + pci_chipset_tag_t); |