From 3c8b9d73074abdd525b18df769f08ab6d5ed857f Mon Sep 17 00:00:00 2001 From: eeh Date: Thu, 18 Mar 1999 03:23:53 +0000 Subject: [PATCH] Some devices don't have a `device-type' property we can use to allocate an IPL. Check for those by name. Give the rest a default IPL of 2. (Added `SUNW,CS4231' to the list.) --- sys/arch/sparc64/dev/sbus.c | 8 ++- sys/arch/sparc64/include/autoconf.h | 12 +--- sys/arch/sparc64/sparc64/autoconf.c | 101 ++-------------------------- 3 files changed, 12 insertions(+), 109 deletions(-) diff --git a/sys/arch/sparc64/dev/sbus.c b/sys/arch/sparc64/dev/sbus.c index 167bb31b863d..7d027772bd9a 100644 --- a/sys/arch/sparc64/dev/sbus.c +++ b/sys/arch/sparc64/dev/sbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: sbus.c,v 1.9 1999/01/10 23:32:57 eeh Exp $ */ +/* $NetBSD: sbus.c,v 1.10 1999/03/18 03:23:53 eeh Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -772,7 +772,8 @@ sbus_get_intr(sc, node, ipp, np) if (getprop(node, "interrupts", sizeof(int), np, (void **)&ipl) == 0) { /* Change format to an `struct sbus_intr' array */ struct sbus_intr *ip; - int pri = 0; + /* Default to interrupt level 2 -- otherwise unused */ + int pri = INTLEVENCODE(2); ip = malloc(*np * sizeof(struct sbus_intr), M_DEVBUF, M_NOWAIT); if (ip == NULL) return (ENOMEM); @@ -782,6 +783,9 @@ sbus_get_intr(sc, node, ipp, np) * space and we can easily stuff the IPL in there for a while. */ getpropstringA(node, "device_type", buf); + if (!buf[0]) { + getpropstringA(node, "name", buf); + } for (i=0; intrmap[i].in_class; i++) { if (strcmp(intrmap[i].in_class, buf) == 0) { pri = INTLEVENCODE(intrmap[i].in_lev); diff --git a/sys/arch/sparc64/include/autoconf.h b/sys/arch/sparc64/include/autoconf.h index 38320e26893d..52fa0c22b1bb 100644 --- a/sys/arch/sparc64/include/autoconf.h +++ b/sys/arch/sparc64/include/autoconf.h @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.h,v 1.6 1998/10/06 20:50:18 thorpej Exp $ */ +/* $NetBSD: autoconf.h,v 1.7 1999/03/18 03:23:53 eeh Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -137,16 +137,6 @@ extern int optionsnode; /* new interfaces: */ char *getpropstringA __P((int, char *, char *)); -/* - * Helper routines to get some of the more common properties. These - * only get the first item in case the property value is an array. - * Drivers that "need to know it all" can call getprop() directly. - */ -int getprop_reg1 __P((int, struct sbus_reg *)); -int getprop_intr1 __P((int, int *)); -int getprop_address1 __P((int, void **)); - - /* * The matchbyname function is useful in drivers that are matched * by romaux name, i.e., all `mainbus attached' devices. It expects diff --git a/sys/arch/sparc64/sparc64/autoconf.c b/sys/arch/sparc64/sparc64/autoconf.c index 8462d316cf57..da895ce46ccb 100644 --- a/sys/arch/sparc64/sparc64/autoconf.c +++ b/sys/arch/sparc64/sparc64/autoconf.c @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.12 1999/01/31 09:21:18 mrg Exp $ */ +/* $NetBSD: autoconf.c,v 1.13 1999/03/18 03:23:53 eeh Exp $ */ /* * Copyright (c) 1996 @@ -129,6 +129,9 @@ struct intrmap intrmap[] = { { "scsi", PIL_SCSI }, { "network", PIL_NET }, { "display", PIL_VIDEO }, + { "audio", PIL_AUD }, +/* The following devices don't have device types: */ + { "SUNW,CS4231", PIL_AUD }, { NULL, 0 } }; @@ -213,7 +216,7 @@ bootstrap(nctx) #ifdef DDB db_machine_init(); #ifdef DB_ELF_SYMBOLS - ddb_init((int)(esym - ssym), ssym, esym); /* No symbols as yet */ + ddb_init((int)((caddr_t)esym - (caddr_t)ssym), ssym, esym); /* No symbols as yet */ #else ddb_init(); #endif @@ -1022,100 +1025,6 @@ getprop(node, name, size, nitem, bufp) return (0); } -int -getprop_reg1(node, rrp) - int node; - struct sbus_reg *rrp; -{ - int error, n; - struct sbus_reg *rrp0 = NULL; - char buf[32]; - - error = getprop(node, "reg", sizeof(struct sbus_reg), - &n, (void **)&rrp0); - if (error != 0) { - if (error == ENOENT && - node_has_property(node, "device_type") && - strcmp(getpropstringA(node, "device_type", buf), - "hierarchical") == 0) { - bzero(rrp, sizeof(struct sbus_reg)); - error = 0; - } - return (error); - } - - *rrp = rrp0[0]; - free(rrp0, M_DEVBUF); - return (0); -} - -int -getprop_intr1(node, ip) - int node; - int *ip; -{ - int error, n; - struct sbus_intr *sip = NULL; - int *interrupts; - char buf[32]; - - if (getprop(node, "interrupts", sizeof(*interrupts), - &n, (void**)&interrupts) != 0) { - /* Now things get ugly. We need to take this value which is - * the interrupt vector number and encode the IPL into it - * somehow. Luckily, the interrupt vector has lots of free - * space and we can easily stuff the IPL in there for a while. - */ - getpropstringA(node, "device_type", buf); - for (n=0; intrmap[n].in_class; n++) { - if (strcmp(intrmap[n].in_class, buf) == 0) { - interrupts[0] |= (intrmap[n].in_lev << 11); - break; - } - } - *ip = interrupts[0]; - free(interrupts, M_DEVBUF); - return 0; - } - /* Go with old-style intr property. I don't know what to do with - * this. Need to get to the vector. - */ - error = getprop(node, "intr", sizeof(struct sbus_intr), - &n, (void **)&sip); - if (error != 0) { - if (error == ENOENT) { - *ip = 0; - error = 0; - } - return (error); - } - - *ip = sip[0].sbi_pri; - free(sip, M_DEVBUF); - return (0); -} - -int -getprop_address1(node, vpp) - int node; - void **vpp; -{ - int error, n; - void **vp = NULL; - - error = getprop(node, "address", sizeof(u_int32_t), &n, (void **)&vp); - if (error != 0) { - *vpp = 0; - if (error == ENOENT) { - error = 0; - } - return (error); - } - - *vpp = vp[0]; - free(vp, M_DEVBUF); - return (0); -} /* * Internal form of proplen(). Returns the property length.