summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2002-06-30 16:24:41 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2002-06-30 16:24:41 +0000
commita2fbdd777ee87db8a3e3bddeca60fb56d895fc51 (patch)
tree70c6a0f2ea261054dda398ea4bf3da5ce249d96e /sys
parenta67f8848962fcacf156f56c188f331665e69be59 (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.c20
-rw-r--r--sys/arch/alpha/alpha/dec_1000a.c363
-rw-r--r--sys/arch/alpha/conf/GENERIC4
-rw-r--r--sys/arch/alpha/conf/RAMDISK5
-rw-r--r--sys/arch/alpha/conf/RAMDISKB5
-rw-r--r--sys/arch/alpha/conf/RAMDISKBIG5
-rw-r--r--sys/arch/alpha/conf/files.alpha7
-rw-r--r--sys/arch/alpha/pci/pci_1000.c348
-rw-r--r--sys/arch/alpha/pci/pci_1000.h41
-rw-r--r--sys/arch/alpha/pci/pci_1000a.c373
-rw-r--r--sys/arch/alpha/pci/pci_1000a.h41
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);