summaryrefslogtreecommitdiff
path: root/sys/arch/sgi
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2009-11-07 22:48:38 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2009-11-07 22:48:38 +0000
commit9214a014e55b97cd6524fa80abf852fadb724e85 (patch)
tree6b756cfb5d6f15e6edd44c337bf05bca7eb07602 /sys/arch/sgi
parent007f507fc711a951e58849aff0a009a43858280a (diff)
In case an ioc(4) device has lost its NIC component, do not recognize it
as the onboard ioc device, if one has already been found on this node. Also, on Origin 300, do not attempt to attach the PS/2 controller on the onboard ioc(4) since PS/2 ports are not wired.
Diffstat (limited to 'sys/arch/sgi')
-rw-r--r--sys/arch/sgi/include/autoconf.h3
-rw-r--r--sys/arch/sgi/pci/ioc.c34
-rw-r--r--sys/arch/sgi/sgi/autoconf.c3
-rw-r--r--sys/arch/sgi/sgi/ip27_machdep.c6
4 files changed, 37 insertions, 9 deletions
diff --git a/sys/arch/sgi/include/autoconf.h b/sys/arch/sgi/include/autoconf.h
index 296da5be1a8..9a0bc7c7d5b 100644
--- a/sys/arch/sgi/include/autoconf.h
+++ b/sys/arch/sgi/include/autoconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.h,v 1.24 2009/11/07 14:49:01 miod Exp $ */
+/* $OpenBSD: autoconf.h,v 1.25 2009/11/07 22:48:36 miod Exp $ */
/*
* Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -89,5 +89,6 @@ void ip32_setup(void);
extern char osloadpartition[256];
extern int16_t masternasid;
+extern int16_t currentnasid;
#endif /* _MACHINE_AUTOCONF_H_ */
diff --git a/sys/arch/sgi/pci/ioc.c b/sys/arch/sgi/pci/ioc.c
index 52e1fe1a9ff..663f16986b2 100644
--- a/sys/arch/sgi/pci/ioc.c
+++ b/sys/arch/sgi/pci/ioc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ioc.c,v 1.25 2009/11/07 14:49:01 miod Exp $ */
+/* $OpenBSD: ioc.c,v 1.26 2009/11/07 22:48:37 miod Exp $ */
/*
* Copyright (c) 2008 Joel Sing.
@@ -31,6 +31,8 @@
#include <machine/autoconf.h>
#include <machine/bus.h>
+#include <sgi/sgi/ip27.h>
+
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcidevs.h>
@@ -104,6 +106,15 @@ int iocow_read_byte(void *);
int iocow_triplet(void *, int);
int iocow_pulse(struct ioc_softc *, int, int);
+/*
+ * A mask of nodes on which an ioc driver has attached.
+ * We use this to prevent attaching a pci IOC3 card which NIC has failed,
+ * as the onboard IOC3.
+ *
+ * XXX This obviously will not work in N mode...
+ */
+static uint64_t ioc_nodemask = 0;
+
int
ioc_match(struct device *parent, void *match, void *aux)
{
@@ -244,14 +255,29 @@ ioc_attach(struct device *parent, struct device *self, void *aux)
/*
* If no owserial device has been found, then it is
* very likely that we are the on-board IOC3 found
- * on IP27 and IP35 systems.
+ * on IP27 and IP35 systems, unless we have already
+ * found an on-board IOC3 on this node.
*/
- if (sys_config.system_type == SGI_IP27 ||
- sys_config.system_type == SGI_IP35) {
+ if ((sys_config.system_type == SGI_IP27 ||
+ sys_config.system_type == SGI_IP35) &&
+ !ISSET(ioc_nodemask, 1UL << currentnasid)) {
+ SET(currentnasid, 1UL << currentnasid);
+
device_mask = (1 << IOCDEV_SERIAL_A) |
(1 << IOCDEV_SERIAL_B) | (1 << IOCDEV_LPT) |
(1 << IOCDEV_KBC) | (1 << IOCDEV_RTC) |
(1 << IOCDEV_EF);
+ /*
+ * Origin 300 onboard IOC3 do not have PS/2 ports;
+ * since they can only be connected to other 300 or
+ * 350 bricks (the latter using IOC4 devices),
+ * it is safe to do this regardless of the current
+ * nasid.
+ */
+ if (sys_config.system_type == SGI_IP35 &&
+ sys_config.system_subtype == IP35_O300)
+ device_mask &= ~(1 << IOCDEV_KBC);
+
rtcbase = IOC3_BYTEBUS_0;
dual_irq = 1;
/*
diff --git a/sys/arch/sgi/sgi/autoconf.c b/sys/arch/sgi/sgi/autoconf.c
index 15c6c18a040..d031893f350 100644
--- a/sys/arch/sgi/sgi/autoconf.c
+++ b/sys/arch/sgi/sgi/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.27 2009/11/07 18:56:55 miod Exp $ */
+/* $OpenBSD: autoconf.c,v 1.28 2009/11/07 22:48:37 miod Exp $ */
/*
* Copyright (c) 2009 Miodrag Vallat.
*
@@ -119,6 +119,7 @@ void bootpath_next(void);
*/
int cold = 1; /* if 1, still working on cold-start */
struct device *bootdv = NULL;
+int16_t currentnasid = 0;
char osloadpartition[256];
diff --git a/sys/arch/sgi/sgi/ip27_machdep.c b/sys/arch/sgi/sgi/ip27_machdep.c
index db46cd5b749..fc964679ade 100644
--- a/sys/arch/sgi/sgi/ip27_machdep.c
+++ b/sys/arch/sgi/sgi/ip27_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip27_machdep.c,v 1.33 2009/11/07 14:49:01 miod Exp $ */
+/* $OpenBSD: ip27_machdep.c,v 1.34 2009/11/07 22:48:37 miod Exp $ */
/*
* Copyright (c) 2008, 2009 Miodrag Vallat.
@@ -318,7 +318,7 @@ ip27_autoconf(struct device *parent)
*/
bzero(&maa, sizeof maa);
- maa.maa_nasid = masternasid;
+ maa.maa_nasid = currentnasid = masternasid;
maa.maa_name = "cpu";
config_found(parent, &maa, ip27_print);
maa.maa_name = "clock";
@@ -345,7 +345,7 @@ ip27_attach_node(struct device *parent, int16_t nasid)
bzero(&maa, sizeof maa);
maa.maa_name = "xbow";
- maa.maa_nasid = nasid;
+ maa.maa_nasid = currentnasid = nasid;
config_found(parent, &maa, ip27_print);
}