summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>1998-11-11 00:26:02 +0000
committerJason Wright <jason@cvs.openbsd.org>1998-11-11 00:26:02 +0000
commit777b7ad5376b715f1c9f137f1b1cf6d7345dc634 (patch)
tree3594b8e48c738c3130b511593e51a5a1b8700405 /sys
parentdad9cda7d59a7eebcce55a30abe7e270a54af10e (diff)
Detect cards that require dma that are in non-dma slots and don't allow
them to be attach'd.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/sparc/dev/esp.c7
-rw-r--r--sys/arch/sparc/dev/hme.c4
-rw-r--r--sys/arch/sparc/dev/lebuffer.c26
-rw-r--r--sys/arch/sparc/dev/qec.c26
-rw-r--r--sys/arch/sparc/dev/sbus.c29
-rw-r--r--sys/arch/sparc/dev/sbusvar.h3
6 files changed, 86 insertions, 9 deletions
diff --git a/sys/arch/sparc/dev/esp.c b/sys/arch/sparc/dev/esp.c
index 438922eb1d6..59f8c6415b2 100644
--- a/sys/arch/sparc/dev/esp.c
+++ b/sys/arch/sparc/dev/esp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: esp.c,v 1.13 1998/01/28 17:21:47 jason Exp $ */
+/* $OpenBSD: esp.c,v 1.14 1998/11/11 00:25:58 jason Exp $ */
/* $NetBSD: esp.c,v 1.69 1997/08/27 11:24:18 bouyer Exp $ */
/*
@@ -192,8 +192,11 @@ espmatch(parent, vcf, aux)
if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
return (0);
- if (ca->ca_bustype == BUS_SBUS)
+ if (ca->ca_bustype == BUS_SBUS) {
+ if (!sbus_testdma((struct sbus_softc *)parent, ca))
+ return (0);
return (1);
+ }
ra->ra_len = NBPG;
return (probeget(ra->ra_vaddr, 1) != -1);
}
diff --git a/sys/arch/sparc/dev/hme.c b/sys/arch/sparc/dev/hme.c
index 59f93f793ae..d8d2e8eec93 100644
--- a/sys/arch/sparc/dev/hme.c
+++ b/sys/arch/sparc/dev/hme.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hme.c,v 1.12 1998/10/02 17:42:24 jason Exp $ */
+/* $OpenBSD: hme.c,v 1.13 1998/11/11 00:26:00 jason Exp $ */
/*
* Copyright (c) 1998 Jason L. Wright (jason@thought.net)
@@ -146,6 +146,8 @@ hmematch(parent, vcf, aux)
strcmp("SUNW,hme", ra->ra_name)) {
return (0);
}
+ if (!sbus_testdma((struct sbus_softc *)parent, ca))
+ return(0);
return (1);
}
diff --git a/sys/arch/sparc/dev/lebuffer.c b/sys/arch/sparc/dev/lebuffer.c
index d5ee34b32a4..9e99c092881 100644
--- a/sys/arch/sparc/dev/lebuffer.c
+++ b/sys/arch/sparc/dev/lebuffer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lebuffer.c,v 1.3 1998/07/05 09:24:23 deraadt Exp $ */
+/* $OpenBSD: lebuffer.c,v 1.4 1998/11/11 00:26:00 jason Exp $ */
/* $NetBSD: lebuffer.c,v 1.3 1997/05/24 20:16:28 pk Exp $ */
/*
@@ -50,10 +50,11 @@
#include <sparc/dev/dmareg.h>/*XXX*/
int lebufprint __P((void *, const char *));
+int lebufmatch __P((struct device *, void *, void *));
void lebufattach __P((struct device *, struct device *, void *));
struct cfattach lebuffer_ca = {
- sizeof(struct lebuf_softc), matchbyname, lebufattach
+ sizeof(struct lebuf_softc), lebufmatch, lebufattach
};
struct cfdriver lebuffer_cd = {
@@ -74,6 +75,27 @@ lebufprint(aux, name)
}
/*
+ * Match a lebuffer card in a slot capable of dma.
+ */
+int
+lebufmatch(parent, vcf, aux)
+ struct device *parent;
+ void *vcf, *aux;
+{
+ struct cfdata *cf = vcf;
+ struct confargs *ca = aux;
+ register struct romaux *ra = &ca->ca_ra;
+
+ if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
+ return(0);
+
+ if (!sbus_testdma((struct sbus_softc *)parent, ca))
+ return(0);
+
+ return (1);
+}
+
+/*
* Attach all the sub-devices we can find
*/
void
diff --git a/sys/arch/sparc/dev/qec.c b/sys/arch/sparc/dev/qec.c
index f0a3abec994..f0573775853 100644
--- a/sys/arch/sparc/dev/qec.c
+++ b/sys/arch/sparc/dev/qec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: qec.c,v 1.8 1998/11/02 05:50:59 jason Exp $ */
+/* $OpenBSD: qec.c,v 1.9 1998/11/11 00:26:00 jason Exp $ */
/*
* Copyright (c) 1998 Theo de Raadt and Jason L. Wright.
@@ -48,12 +48,13 @@
#include <sparc/dev/qecvar.h>
int qecprint __P((void *, const char *));
+int qecmatch __P((struct device *, void *, void *));
void qecattach __P((struct device *, struct device *, void *));
void qec_fix_range __P((struct qec_softc *, struct sbus_softc *));
void qec_translate __P((struct qec_softc *, struct confargs *));
struct cfattach qec_ca = {
- sizeof(struct qec_softc), matchbyname, qecattach
+ sizeof(struct qec_softc), qecmatch, qecattach
};
struct cfdriver qec_cd = {
@@ -74,6 +75,27 @@ qecprint(aux, name)
}
/*
+ * match a QEC device in a slot capable of DMA
+ */
+int
+qecmatch(parent, vcf, aux)
+ struct device *parent;
+ void *vcf, *aux;
+{
+ struct cfdata *cf = vcf;
+ struct confargs *ca = aux;
+ struct romaux *ra = &ca->ca_ra;
+
+ if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
+ return (0);
+
+ if (!sbus_testdma((struct sbus_softc *)parent, ca))
+ return (0);
+
+ return (1);
+}
+
+/*
* Attach all the sub-devices we can find
*/
void
diff --git a/sys/arch/sparc/dev/sbus.c b/sys/arch/sparc/dev/sbus.c
index aee7de7fbf8..d82e7da864f 100644
--- a/sys/arch/sparc/dev/sbus.c
+++ b/sys/arch/sparc/dev/sbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sbus.c,v 1.5 1997/08/08 08:25:27 downsj Exp $ */
+/* $OpenBSD: sbus.c,v 1.6 1998/11/11 00:26:00 jason Exp $ */
/* $NetBSD: sbus.c,v 1.17 1997/06/01 22:10:39 pk Exp $ */
/*
@@ -87,9 +87,13 @@ sbus_print(args, sbus)
const char *sbus;
{
register struct confargs *ca = args;
+ static char *sl = "slave-only";
if (sbus)
printf("%s at %s", ca->ca_ra.ra_name, sbus);
+ /* Check root node for 'slave-only' property */
+ if (getpropint(0, sl, 0) & (1 << ca->ca_slot))
+ printf(" %s", sl);
printf(" slot %d offset 0x%x", ca->ca_slot, ca->ca_offset);
return (UNCONF);
}
@@ -287,3 +291,26 @@ sbusreset(sbus)
}
}
}
+
+/*
+ * Returns true if this sbus slot is capable of dma
+ */
+int
+sbus_testdma(sc, ca)
+ struct sbus_softc *sc;
+ struct confargs *ca;
+{
+ struct romaux *ra = &ca->ca_ra;
+
+ /*
+ * XXX how to handle more then one sbus?
+ */
+
+ if (getpropint(0, "slave-only", 0) & (1 << ca->ca_slot)) {
+ printf("%s: dma card found in non-dma sbus slot %d"
+ ": not supported\n", ra->ra_name, ca->ca_slot);
+ return (0);
+ }
+
+ return (1);
+}
diff --git a/sys/arch/sparc/dev/sbusvar.h b/sys/arch/sparc/dev/sbusvar.h
index 21fd61967c2..90abe2456fc 100644
--- a/sys/arch/sparc/dev/sbusvar.h
+++ b/sys/arch/sparc/dev/sbusvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sbusvar.h,v 1.4 1997/08/08 08:25:28 downsj Exp $ */
+/* $OpenBSD: sbusvar.h,v 1.5 1998/11/11 00:26:01 jason Exp $ */
/* $NetBSD: sbusvar.h,v 1.4 1996/04/22 02:35:05 abrown Exp $ */
/*
@@ -76,3 +76,4 @@ struct sbus_softc {
int sbusdev_match __P((struct cfdata *, void *));
void sbus_establish __P((struct sbusdev *, struct device *));
void sbus_translate __P((struct device *, struct confargs *));
+int sbus_testdma __P((struct sbus_softc *, struct confargs *));