summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/isa/isa.c19
-rw-r--r--sys/i386/isa/isa.c19
-rw-r--r--sys/i386/isa/pnp.c116
-rw-r--r--sys/i386/isa/pnp.h16
4 files changed, 122 insertions, 48 deletions
diff --git a/sys/amd64/isa/isa.c b/sys/amd64/isa/isa.c
index abdcfa3..c5a9ea4 100644
--- a/sys/amd64/isa/isa.c
+++ b/sys/amd64/isa/isa.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)isa.c 7.2 (Berkeley) 5/13/91
- * $Id: isa.c,v 1.102 1997/08/25 22:52:59 bde Exp $
+ * $Id: isa.c,v 1.103 1997/08/28 03:36:40 msmith Exp $
*/
/*
@@ -66,6 +66,11 @@
#include <sys/interrupt.h>
+#include "pnp.h"
+#if NPNP > 0
+#include <i386/isa/pnp.h>
+#endif
+
/*
** Register definitions for DMA controller 1 (channels 0..3):
*/
@@ -293,6 +298,9 @@ haveseen_isadev(dvp, checkbits)
struct isa_device *dvp;
u_int checkbits;
{
+#if NPNP > 0
+ struct pnp_dlist_node *nod;
+#endif
struct isa_device *tmpdvp;
int status = 0;
@@ -316,6 +324,11 @@ haveseen_isadev(dvp, checkbits)
if (status)
return status;
}
+#if NPNP > 0
+ for (nod = pnp_device_list; nod != NULL; nod = nod->next)
+ if (status |= haveseen(dvp, &(nod->dev), checkbits))
+ return status;
+#endif
#ifdef RESOURCE_CHECK
if (!dvp->id_conflicts) {
status = check_pciconflict(dvp, checkbits);
@@ -551,8 +564,7 @@ config_isadev_c(isdp, mp, reconfig)
printf(" at 0x%x", isdp->id_iobase);
printf("\n");
}
- }
- else {
+ } else {
#if 0
/* This code has not been tested.... */
if (isdp->id_irq) {
@@ -913,7 +925,6 @@ isa_dmastatus(int chan)
u_long cnt = 0;
int ffport, waport;
u_long low1, high1, low2, high2;
- u_long ef;
/* channel active? */
if ((dma_inuse & (1 << chan)) == 0) {
diff --git a/sys/i386/isa/isa.c b/sys/i386/isa/isa.c
index abdcfa3..c5a9ea4 100644
--- a/sys/i386/isa/isa.c
+++ b/sys/i386/isa/isa.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)isa.c 7.2 (Berkeley) 5/13/91
- * $Id: isa.c,v 1.102 1997/08/25 22:52:59 bde Exp $
+ * $Id: isa.c,v 1.103 1997/08/28 03:36:40 msmith Exp $
*/
/*
@@ -66,6 +66,11 @@
#include <sys/interrupt.h>
+#include "pnp.h"
+#if NPNP > 0
+#include <i386/isa/pnp.h>
+#endif
+
/*
** Register definitions for DMA controller 1 (channels 0..3):
*/
@@ -293,6 +298,9 @@ haveseen_isadev(dvp, checkbits)
struct isa_device *dvp;
u_int checkbits;
{
+#if NPNP > 0
+ struct pnp_dlist_node *nod;
+#endif
struct isa_device *tmpdvp;
int status = 0;
@@ -316,6 +324,11 @@ haveseen_isadev(dvp, checkbits)
if (status)
return status;
}
+#if NPNP > 0
+ for (nod = pnp_device_list; nod != NULL; nod = nod->next)
+ if (status |= haveseen(dvp, &(nod->dev), checkbits))
+ return status;
+#endif
#ifdef RESOURCE_CHECK
if (!dvp->id_conflicts) {
status = check_pciconflict(dvp, checkbits);
@@ -551,8 +564,7 @@ config_isadev_c(isdp, mp, reconfig)
printf(" at 0x%x", isdp->id_iobase);
printf("\n");
}
- }
- else {
+ } else {
#if 0
/* This code has not been tested.... */
if (isdp->id_irq) {
@@ -913,7 +925,6 @@ isa_dmastatus(int chan)
u_long cnt = 0;
int ffport, waport;
u_long low1, high1, low2, high2;
- u_long ef;
/* channel active? */
if ((dma_inuse & (1 << chan)) == 0) {
diff --git a/sys/i386/isa/pnp.c b/sys/i386/isa/pnp.c
index aad6723..7fbe195 100644
--- a/sys/i386/isa/pnp.c
+++ b/sys/i386/isa/pnp.c
@@ -23,15 +23,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: pnp.c,v 1.1 1997/09/09 12:31:57 jmg Exp $
+ * $Id: pnp.c,v 1.2 1997/09/18 08:04:11 jmg Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h> /* for DATA_SET */
+#include <sys/malloc.h>
#include <sys/interrupt.h>
#include <machine/clock.h>
#include <machine/cpufunc.h>
+#include <machine/md_var.h>
#include <i386/isa/pnp.h>
#include <i386/isa/isa_device.h>
@@ -40,6 +42,9 @@
int num_pnp_cards = 0;
pnp_id pnp_devices[MAX_PNP_CARDS];
+struct pnp_dlist_node *pnp_device_list;
+static struct pnp_dlist_node **pnp_device_list_last_ptr;
+
/*
* these entries are initialized using the autoconfig menu
* The struct is invalid (and must be initialized) if the first
@@ -329,6 +334,7 @@ enable_pnp_card()
void
config_pnp_device(pnp_id *p, int csn)
{
+ static struct pnp_dlist_node *nod = NULL;
int i;
u_char *data = (u_char *)p;
@@ -336,12 +342,10 @@ config_pnp_device(pnp_id *p, int csn)
struct pnp_device *dvp, **dvpp;
char *name ;
- printf("CSN %d Vendor ID: %c%c%c%02x%02x [0x%08lx] Serial 0x%08lx\n",
- csn,
- ((data[0] & 0x7c) >> 2) + 64,
- (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64,
- (data[1] & 0x1f) + 64, data[2], data[3],
- p->vendor_id, p->serial);
+ printf("CSN %d Vendor ID: %c%c%c%02x%02x [0x%08lx] Serial 0x%08lx\n", csn,
+ ((data[0] & 0x7c) >> 2) + '@',
+ (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + '@',
+ (data[1] & 0x1f) + '@', data[2], data[3], p->vendor_id, p->serial);
doing_pnp_probe = 1 ;
current_csn = csn ;
@@ -355,8 +359,10 @@ config_pnp_device(pnp_id *p, int csn)
if (pnp_ldn_overrides[i].csn == csn &&
pnp_ldn_overrides[i].override == 1) {
struct pnp_cinfo d;
- printf("PnP: override config for CSN %d LDN %d vend_id 0x%08x\n",
- csn, pnp_ldn_overrides[i].ldn, current_pnp_id);
+ if (bootverbose)
+ printf("PnP: override config for CSN %d LDN %d "
+ "vend_id 0x%08x\n", csn, pnp_ldn_overrides[i].ldn,
+ current_pnp_id);
/* next assignement is done otherwise read fails */
d.vendor_id = current_pnp_id ;
read_pnp_parms(&d, pnp_ldn_overrides[i].ldn);
@@ -396,32 +402,70 @@ config_pnp_device(pnp_id *p, int csn)
* the attach routine until enable_pnp_card() has been done.
*/
- bzero( &(dvp->dev), sizeof(dvp->dev) );
- dvp->dev.id_unit = unit ;
+ if (nod == NULL)
+ nod = malloc(sizeof(struct pnp_dlist_node), M_DEVBUF, M_NOWAIT);
+ if (nod == NULL)
+ panic("malloc failed for PnP resource use");
+ bzero(nod, sizeof(*nod));
+ nod->pnp = dvp;
+ nod->dev.id_unit = unit ;
if (dvp->pd_attach)
- (*dvp->pd_attach) (csn, p->vendor_id, name, &(dvp->dev));
- if (dvp->dev.id_irq) {
- /* the board uses interrupts. Register it. */
- if (dvp->imask)
- INTRMASK( *(dvp->imask), dvp->dev.id_irq );
- register_intr(ffs(dvp->dev.id_irq)-1, dvp->dev.id_id,
- dvp->dev.id_ri_flags, dvp->dev.id_intr,
- dvp->imask, dvp->dev.id_unit);
- INTREN(dvp->dev.id_irq);
- }
- printf("%s%d (%s <%s> sn 0x%08lx) at 0x%x "
- "irq %d drq %d flags 0x%x id %d\n",
- dvp->dev.id_driver && dvp->dev.id_driver->name ?
- dvp->dev.id_driver->name : "unknown",
- unit,
- dvp->pd_name, name, p->serial,
- dvp->dev.id_iobase,
- ffs(dvp->dev.id_irq)-1,
- dvp->dev.id_drq,
- dvp->dev.id_flags,
- dvp->dev.id_id);
+ (*dvp->pd_attach) (csn, p->vendor_id, name, &(nod->dev));
+ printf("%s%d (%s <%s> sn 0x%08lx)", nod->dev.id_driver &&
+ nod->dev.id_driver->name ? nod->dev.id_driver->name : "unknown",
+ unit, dvp->pd_name, name, p->serial);
+ if (nod->dev.id_alive) {
+ if (nod->dev.id_irq) {
+ /* the board uses interrupts. Register it. */
+ if (dvp->imask)
+ INTRMASK( *(dvp->imask), nod->dev.id_irq );
+ register_intr(ffs(nod->dev.id_irq) - 1, nod->dev.id_id,
+ nod->dev.id_ri_flags, nod->dev.id_intr,
+ dvp->imask, nod->dev.id_unit);
+ INTREN(nod->dev.id_irq);
+ }
+ if (nod->dev.id_alive != 0) {
+ if (nod->dev.id_iobase == -1)
+ printf(" at ?");
+ else {
+ printf(" at 0x%x", nod->dev.id_iobase);
+ if ((nod->dev.id_iobase + nod->dev.id_alive -1) !=
+ nod->dev.id_iobase) {
+ printf("-0x%x", nod->dev.id_iobase + nod->dev.id_alive
+ - 1);
+ }
+ }
+ }
+ if (nod->dev.id_irq)
+ printf(" irq %d", ffs(nod->dev.id_irq) - 1);
+ if (nod->dev.id_drq != -1)
+ printf(" drq %d", nod->dev.id_drq);
+ if (nod->dev.id_maddr)
+ printf(" maddr 0x%lx", kvtop(nod->dev.id_maddr));
+ if (nod->dev.id_msize)
+ printf(" msize %d", nod->dev.id_msize);
+ if (nod->dev.id_flags)
+ printf(" flags 0x%x", nod->dev.id_flags);
+ if (nod->dev.id_iobase && !(nod->dev.id_iobase & 0xf300)) {
+ printf(" on motherboard");
+ printf(" id %d", nod->dev.id_id);
+ } else if (nod->dev.id_iobase >= 0x1000 &&
+ !(nod->dev.id_iobase & 0x300)) {
+ printf (" on eisa slot %d",
+ nod->dev.id_iobase >> 12);
+ } else {
+ printf (" on isa");
+ }
+ printf("\n");
+ if (pnp_device_list_last_ptr == NULL)
+ pnp_device_list = nod;
+ else
+ *pnp_device_list_last_ptr = nod;
+ pnp_device_list_last_ptr = &(nod->next);
+ nod = NULL;
+ } else
+ printf(" failed to attach\n");
}
-
doing_pnp_probe = 0 ;
}
@@ -493,7 +537,8 @@ pnp_configure()
int num_pnp_devs;
if (pnp_ldn_overrides[0].csn == 0) {
- printf("Initializing PnP override table\n");
+ if (bootverbose)
+ printf("Initializing PnP override table\n");
bzero (pnp_ldn_overrides, sizeof(pnp_ldn_overrides));
pnp_ldn_overrides[0].csn = 255 ;
}
@@ -509,7 +554,8 @@ pnp_configure()
break;
}
if (!num_pnp_devs) {
- printf("No Plug-n-Play devices were found\n");
+ if (bootverbose)
+ printf("No Plug-n-Play devices were found\n");
return;
}
}
diff --git a/sys/i386/isa/pnp.h b/sys/i386/isa/pnp.h
index 5cea0c2..29acd02 100644
--- a/sys/i386/isa/pnp.h
+++ b/sys/i386/isa/pnp.h
@@ -29,11 +29,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: pnp.h,v 1.1 1997/09/09 12:31:58 jmg Exp $
+ * $Id: pnp.h,v 1.2 1997/09/18 08:04:13 jmg Exp $
*/
-#include <i386/isa/isa_device.h>
-
#ifndef _I386_ISA_PNP_H_
#define _I386_ISA_PNP_H_
@@ -230,6 +228,10 @@
#define _32BIT_FIXED_LOC_DESC 0x6
#define LG_RES_RESERVED 0x7-0x7f
+#ifdef KERNEL
+
+#include <i386/isa/isa_device.h>
+
/*
* pnp_cinfo contains Configuration Information. They are used
* to communicate to the device driver the actual configuration
@@ -263,7 +265,6 @@ struct pnp_device {
struct isa_device *dev);
u_long *pd_count;
u_int *imask ;
- struct isa_device dev ;
};
struct _pnp_id {
@@ -272,9 +273,14 @@ struct _pnp_id {
u_char checksum;
} ;
-#ifdef KERNEL
+struct pnp_dlist_node {
+ struct pnp_device *pnp;
+ struct isa_device dev;
+ struct pnp_dlist_node *next;
+};
typedef struct _pnp_id pnp_id;
+extern struct pnp_dlist_node *pnp_device_list;
extern pnp_id pnp_devices[MAX_PNP_CARDS];
extern struct pnp_cinfo pnp_ldn_overrides[MAX_PNP_LDN];
extern int pnp_overrides_valid;
OpenPOWER on IntegriCloud