summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-09-02 05:22:16 +0000
committerpeter <peter@FreeBSD.org>1999-09-02 05:22:16 +0000
commit8dd0cf2164ff622569a6980662f4418a643753e7 (patch)
tree914b7ac6cd4bebd95ddf3e2567d89307228f2ff2 /sys/i386
parent52c9474e101cfa61f19091e05cf1c8de31f37b9a (diff)
downloadFreeBSD-src-8dd0cf2164ff622569a6980662f4418a643753e7.zip
FreeBSD-src-8dd0cf2164ff622569a6980662f4418a643753e7.tar.gz
So that there is no confusion, zap these now. pnpinfo(8) should compile
with the new includes.
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/isa/pnp.c650
-rw-r--r--sys/i386/isa/pnp.h314
2 files changed, 0 insertions, 964 deletions
diff --git a/sys/i386/isa/pnp.c b/sys/i386/isa/pnp.c
deleted file mode 100644
index f8147d0..0000000
--- a/sys/i386/isa/pnp.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright (c) 1996, Sujal M. Patel
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
- *
- * $FreeBSD$
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/linker_set.h>
-#include <sys/malloc.h>
-#include <machine/clock.h>
-#include <machine/md_var.h>
-
-#include <i386/isa/icu.h>
-#include <i386/isa/isa_device.h>
-#include <i386/isa/pnp.h>
-#include <i386/isa/intr_machdep.h>
-
-typedef struct _pnp_id {
- u_long vendor_id;
- u_long serial;
- u_char checksum;
- u_long comp_id;
-} pnp_id;
-
-static int num_pnp_cards = 0;
-static 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
- * CSN is zero. The init code fills invalid entries with CSN 255
- * which is not a supported value.
- */
-
-struct pnp_cinfo pnp_ldn_overrides[MAX_PNP_LDN] = { { 0 } };
-
-/*
- * the following is a flag which tells if the data is valid.
- */
-static int doing_pnp_probe = 0 ;
-static int current_csn ;
-static int current_pnp_id ;
-static int current_pnp_serial ;
-
-/*
- * the following block is an example on what is needed for
- * a PnP device driver.
- */
-static char* nullpnp_probe(u_long csn, u_long vendor_id);
-static void nullpnp_attach(u_long csn, u_long vendor_id, char *name,
- struct isa_device *dev);
-static u_long nullpnp_count = 0 ;
-
-static struct pnp_device nullpnp_device = {
- "goodpnp",
- nullpnp_probe,
- nullpnp_attach,
- &nullpnp_count,
- NULL /* imask */
-};
-
-DATA_SET (pnpdevice_set, nullpnp_device);
-
-static char*
-nullpnp_probe(u_long tag, u_long type)
-{
- if (bootverbose)
- printf("Called nullpnp_probe with tag 0x%08lx, type 0x%08lx\n",
- tag, type);
- return NULL;
-}
-
-static void
-nullpnp_attach(u_long csn, u_long vend_id, char *name,
- struct isa_device *dev)
-{
- printf("nullpnp_attach: csn %ld, vend_id 0x%08lx name %s unit %d\n",
- csn, vend_id, name, dev->id_unit);
- return;
-}
-
-/* The READ_DATA port that we are using currently */
-static int pnp_rd_port;
-
-static void pnp_send_Initiation_LFSR (void);
-static int pnp_get_serial (pnp_id *p);
-static void config_pnp_device (pnp_id *p, int csn);
-static int pnp_isolation_protocol (void);
-
-void
-pnp_write(int d, u_char r)
-{
- outb (_PNP_ADDRESS, d);
- outb (_PNP_WRITE_DATA, r);
-}
-
-u_char
-pnp_read(int d)
-{
- outb (_PNP_ADDRESS, d);
- return (inb(3 | (pnp_rd_port <<2)));
-}
-
-/*
- * Send Initiation LFSR as described in "Plug and Play ISA Specification",
- * Intel May 94.
- */
-static void
-pnp_send_Initiation_LFSR()
-{
- int cur, i;
-
- /* Reset the LSFR */
- outb(_PNP_ADDRESS, 0);
- outb(_PNP_ADDRESS, 0); /* yes, we do need it twice! */
-
- cur = 0x6a;
- outb(_PNP_ADDRESS, cur);
-
- for (i = 1; i < 32; i++) {
- cur = (cur >> 1) | (((cur ^ (cur >> 1)) << 7) & 0xff);
- outb(_PNP_ADDRESS, cur);
- }
-}
-
-
-/*
- * Get the device's serial number. Returns 1 if the serial is valid.
- */
-static int
-pnp_get_serial(pnp_id *p)
-{
- int i, bit, valid = 0, sum = 0x6a;
- u_char *data = (u_char *)p;
-
- bzero(data, sizeof(char) * 9);
- outb(_PNP_ADDRESS, SERIAL_ISOLATION);
- for (i = 0; i < 72; i++) {
- bit = inb((pnp_rd_port << 2) | 0x3) == 0x55;
- DELAY(250); /* Delay 250 usec */
-
- /* Can't Short Circuit the next evaluation, so 'and' is last */
- bit = (inb((pnp_rd_port << 2) | 0x3) == 0xaa) && bit;
- DELAY(250); /* Delay 250 usec */
-
- valid = valid || bit;
-
- if (i < 64)
- sum = (sum >> 1) |
- (((sum ^ (sum >> 1) ^ bit) << 7) & 0xff);
-
- data[i / 8] = (data[i / 8] >> 1) | (bit ? 0x80 : 0);
- }
-
- valid = valid && (data[8] == sum);
-
- return valid;
-}
-
-/*
- * Fill's the buffer with resource info from the device.
- * Returns 0 if the device fails to report
- */
-static int
-pnp_get_resource_info(u_char *buffer, int len)
-{
- int i, j;
- u_char temp;
-
- for (i = 0; i < len; i++) {
- outb(_PNP_ADDRESS, STATUS);
- for (j = 0; j < 100; j++) {
- if ((inb((pnp_rd_port << 2) | 0x3)) & 0x1)
- break;
- DELAY(1);
- }
- if (j == 100) {
- printf("PnP device failed to report resource data\n");
- return 0;
- }
- outb(_PNP_ADDRESS, RESOURCE_DATA);
- temp = inb((pnp_rd_port << 2) | 0x3);
- if (buffer != NULL)
- buffer[i] = temp;
- }
- return 1;
-}
-
-/*
- * read_pnp_parms loads pnp parameters from the currently selected
- * device into the struct pnp_cinfo parameter passed.
- * The second argument specifies the Logical Device to use.
- */
-int
-read_pnp_parms(struct pnp_cinfo *d, int ldn)
-{
- int i ;
-
- if (doing_pnp_probe == 0 || d == NULL)
- return 0 ; /* fail */
-
- bzero(d, sizeof(struct pnp_cinfo));
- d->vendor_id = current_pnp_id ;
- d->serial = current_pnp_serial ;
-
- d->csn = current_csn ;
- d->ldn = ldn ; /* XXX this should be different ... */
- pnp_write (SET_LDN, ldn );
- i = pnp_read(SET_LDN) ;
- if (i != ldn) {
- printf("Warning: LDN %d does not exist\n", ldn);
- }
- for (i = 0; i < 8; i++) {
- d->port[i] = pnp_read(IO_CONFIG_BASE + i * 2) << 8 ;
- d->port[i] |= pnp_read(IO_CONFIG_BASE + i * 2 + 1);
-
- if (i < 4) {
- d->mem[i].base = pnp_read (MEM_CONFIG + i*8) << 16 ;
- d->mem[i].base |= pnp_read (MEM_CONFIG + i*8 + 1) << 8 ;
- d->mem[i].control = pnp_read (MEM_CONFIG + i*8 + 2) ;
- d->mem[i].range = pnp_read (MEM_CONFIG + i*8 + 3) << 16 ;
- d->mem[i].range |= pnp_read (MEM_CONFIG + i*8 + 4) << 8 ;
- }
- if (i < 2) {
- d->irq[i] = pnp_read(IRQ_CONFIG + i * 2);
- d->irq_type[i] = pnp_read(IRQ_CONFIG + 1 + i * 2);
- d->drq[i] = pnp_read(DRQ_CONFIG + i);
- }
- }
- d->enable = pnp_read(ACTIVATE);
- for (i = 0 ; i < MAX_PNP_LDN; i++) {
- if (pnp_ldn_overrides[i].csn == d->csn &&
- pnp_ldn_overrides[i].ldn == ldn) {
- d->flags = pnp_ldn_overrides[i].flags ;
- d->override = pnp_ldn_overrides[i].override ;
- break ;
- }
- }
- if (bootverbose)
- printf("port 0x%04x 0x%04x 0x%04x 0x%04x irq %d:%d drq %d:%d en %d\n",
- d->port[0], d->port[1], d->port[2], d->port[3],
- d->irq[0], d->irq[1],
- d->drq[0], d->drq[1],
- d->enable);
- return 1 ; /* success */
-}
-
-/*
- * write_pnp_parms initializes a logical device with the parms
- * in d, and then activates the board if the last parameter is 1.
- */
-
-int
-write_pnp_parms(struct pnp_cinfo *d, int ldn)
-{
- int i, empty = -1 ;
-
- /*
- * some safety checks first.
- */
- if (doing_pnp_probe == 0 || d==NULL || d->vendor_id != current_pnp_id)
- return 0 ; /* fail */
-
- pnp_write (SET_LDN, ldn );
- i = pnp_read(SET_LDN) ;
- if (i != ldn) {
- printf("Warning: LDN %d does not exist\n", ldn);
- }
- for (i = 0; i < 8; i++) {
- pnp_write(IO_CONFIG_BASE + i * 2, d->port[i] >> 8 );
- pnp_write(IO_CONFIG_BASE + i * 2 + 1, d->port[i] & 0xff );
- }
- for (i = 0; i < 4; i++) {
- pnp_write(MEM_CONFIG + i*8, (d->mem[i].base >> 16) & 0xff );
- pnp_write(MEM_CONFIG + i*8+1, (d->mem[i].base >> 8) & 0xff );
- pnp_write(MEM_CONFIG + i*8+2, d->mem[i].control & 0xff );
- pnp_write(MEM_CONFIG + i*8+3, (d->mem[i].range >> 16) & 0xff );
- pnp_write(MEM_CONFIG + i*8+4, (d->mem[i].range >> 8) & 0xff );
- }
- for (i = 0; i < 2; i++) {
- pnp_write(IRQ_CONFIG + i*2 , d->irq[i] );
- pnp_write(IRQ_CONFIG + i*2 + 1, d->irq_type[i] );
- pnp_write(DRQ_CONFIG + i, d->drq[i] );
- }
- /*
- * store parameters read into the current kernel
- * so manual editing next time is easier
- */
- for (i = 0 ; i < MAX_PNP_LDN; i++) {
- if (pnp_ldn_overrides[i].csn == d->csn &&
- pnp_ldn_overrides[i].ldn == ldn) {
- d->flags = pnp_ldn_overrides[i].flags ;
- pnp_ldn_overrides[i] = *d ;
- break ;
- } else if (pnp_ldn_overrides[i].csn < 1 ||
- pnp_ldn_overrides[i].csn == 255)
- empty = i ;
- }
- if (i== MAX_PNP_LDN && empty != -1)
- pnp_ldn_overrides[empty] = *d;
-
- /*
- * Here should really perform the range check, and
- * return a failure if not successful.
- */
- pnp_write (IO_RANGE_CHECK, 0);
- DELAY(1000); /* XXX is it really necessary ? */
- pnp_write (ACTIVATE, d->enable ? 1 : 0);
- DELAY(1000); /* XXX is it really necessary ? */
- return 1 ;
-}
-
-/*
- * To finalize a card's initialization, and before accessing its
- * registers, we need to bring the card in WaitForKey. To this purpose,
- * we need to issue a WaitForKey command, which brings _all_ cards
- * in that state. So, before configuring the next board, we must also
- * sent the Init-Key to bring cards to the SLEEP state again.
- *
- * In fact, one could hope that cards respond to normal I/O accesses
- * even in the SLEEP state, which could be done by issuing a WAKE[0].
- * This seems to work on the CS4236, but not on the CS4232 on my Zappa
- * motherboard .
- */
-int
-enable_pnp_card()
-{
- /* the next wake should bring the card in WaitForKey ? */
- pnp_write (WAKE, 0);
- pnp_write(CONFIG_CONTROL, 0x02); /* All cards in WaitForKey */
- DELAY(1000); /* XXX is it really necessary ? */
- return 1 ; /* success */
-}
-
-/*
- * Configure PnP devices. pnp_id is made of:
- * 4 bytes: board id (which can be printed as an ascii string);
- * 4 bytes: board serial number (often 0 or -1 ?)
- */
-
-static void
-config_pnp_device(pnp_id *p, int csn)
-{
- static struct pnp_dlist_node *nod = NULL;
- int i;
- u_char *data = (u_char *)p;
- u_char *comp = (u_char *)&p->comp_id;
-
- /* these are for autoconfigure a-la pci */
- struct pnp_device *dvp, **dvpp;
- char *name = NULL;
-
- printf("CSN %d Vendor ID: %c%c%c%02x%02x [0x%08lx] Serial 0x%08lx Comp ID: %c%c%c%02x%02x [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,
- ((comp[0] & 0x7c) >> 2) + '@',
- (((comp[0] & 0x03) << 3) | ((comp[1] & 0xe0) >> 5)) + '@',
- (comp[1] & 0x1f) + '@', comp[2], comp[3],
- p->comp_id);
-
- doing_pnp_probe = 1 ;
- current_csn = csn ;
- current_pnp_id = p->vendor_id ;
- current_pnp_serial = p->serial ;
-
- /*
- * use kernel table to override possible devices
- */
- for (i = 0 ; i < MAX_PNP_LDN; i++) {
- if (pnp_ldn_overrides[i].csn == csn &&
- pnp_ldn_overrides[i].override == 1) {
- struct pnp_cinfo d;
- 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);
- if (pnp_ldn_overrides[i].enable == 0) {
- /* just disable ... */
- d.enable = 0;
- write_pnp_parms(&d, pnp_ldn_overrides[i].ldn);
- } else {
- /* set all parameters */
- /* next assignement is done otherwise write fails */
- pnp_ldn_overrides[i].vendor_id = current_pnp_id ;
- write_pnp_parms(&pnp_ldn_overrides[i],
- pnp_ldn_overrides[i].ldn);
- }
- }
- }
-
- /* lookup device in ioconfiguration */
- dvpp = (struct pnp_device **)pnpdevice_set.ls_items;
- while ((dvp = *dvpp++)) {
- if (dvp->pd_probe) {
- if ( ((name = (*dvp->pd_probe)(csn, p->vendor_id)) && *name) ||
- (p->comp_id &&
- (name = (*dvp->pd_probe)(csn, p->comp_id))))
- break;
- }
- }
- if (dvp && name && *name && dvp->pd_count) { /* found a matching device */
- int unit ;
-
- /* pnpcb->pnpcb_seen |= ( 1ul << csn ) ; */
-
- /* get and increment the unit */
- unit = (*dvp->pd_count)++;
-
- /*
- * now call the attach routine. The board has not been
- * configured yet, so better not access isa registers in
- * the attach routine until enable_pnp_card() has been done.
- */
-
- 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, &(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 != 0 && nod->dev.id_ointr != NULL) {
- /* 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_ointr,
- 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 ;
-}
-
-/*
- * Scan Resource Data for Compatible Device ID.
- *
- * This function exits as soon as it gets a Compatible Device ID, an error
- * reading *ANY* Resource Data or ir reaches the end of Resource Data.
- * In the first case the return value will be TRUE, FALSE otherwise.
- */
-static int
-pnp_scan_resdata(pnp_id *p, int csn)
-{
- u_char tag, resinfo[8];
- int large_len, scanning = 1024, retval = FALSE;
-
- while (scanning-- > 0 && pnp_get_resource_info(&tag, 1)) {
- if (PNP_RES_TYPE(tag) == 0) {
- /* Small resource */
- switch (PNP_SRES_NUM(tag)) {
- case COMP_DEVICE_ID:
- /* Got a compatible device id resource */
- if (pnp_get_resource_info(resinfo, PNP_SRES_LEN(tag))) {
- bcopy(resinfo, &p->comp_id, 4);
- retval = TRUE;
- if (bootverbose)
- printf("PnP: CSN %d COMP_DEVICE_ID = 0x%08lx\n", csn, p->comp_id);
- }
- /*
- * We found what we were looking for, or got an error from
- * pnp_get_resource, => stop scanning (FALLTHROUGH)
- */
- case END_TAG:
- scanning = 0;
- break;
- default:
- /* Skip this resource */
- if (pnp_get_resource_info(NULL, PNP_SRES_LEN(tag)) == 0)
- scanning = 0;
- break;
- }
- } else
- /* Large resource, skip it */
- if (!(pnp_get_resource_info((u_char *)&large_len, 2) && pnp_get_resource_info(NULL, large_len)))
- scanning = 0;
- }
-
- return retval;
-}
-
-/*
- * Run the isolation protocol. Use pnp_rd_port as the READ_DATA port
- * value (caller should try multiple READ_DATA locations before giving
- * up). Upon exiting, all cards are aware that they should use
- * pnp_rd_port as the READ_DATA port.
- *
- * In the first pass, a csn is assigned to each board and pnp_id's
- * are saved to an array, pnp_devices. In the second pass, each
- * card is woken up and the device configuration is called.
- */
-static int
-pnp_isolation_protocol()
-{
- int csn;
-
- pnp_send_Initiation_LFSR();
-
- pnp_write(CONFIG_CONTROL, 0x04); /* Reset CSN for All Cards */
-
- for (csn = 1; (csn < MAX_PNP_CARDS); csn++) {
- /* Wake up cards without a CSN */
- pnp_write(WAKE, 0);
- pnp_write(SET_RD_DATA, pnp_rd_port);
- outb(_PNP_ADDRESS, SERIAL_ISOLATION);
- DELAY(1000); /* Delay 1 msec */
-
- if (pnp_get_serial( &(pnp_devices[csn-1]) ) ) {
- pnp_write(SET_CSN, csn);
- /* pnp_write(CONFIG_CONTROL, 2); */
- if (!pnp_scan_resdata(&(pnp_devices[csn-1]), csn))
- pnp_devices[csn-1].comp_id = NULL;
- } else
- break;
- }
- num_pnp_cards = csn - 1;
- for (csn = 1; csn <= num_pnp_cards ; csn++) {
- /*
- * make sure cards are in SLEEP state
- */
- pnp_send_Initiation_LFSR();
- pnp_write(WAKE, csn);
- config_pnp_device( &(pnp_devices[csn-1]), csn);
- /*
- * Put all cards in WaitForKey, just in case the previous
- * attach routine forgot it.
- */
- pnp_write(CONFIG_CONTROL, 0x02);
- DELAY(1000); /* XXX is it really necessary ? */
- }
- return num_pnp_cards ;
-}
-
-
-/*
- * pnp_configure()
- *
- * autoconfiguration of pnp devices. This routine just runs the
- * isolation protocol over several ports, until one is successful.
- *
- * may be called more than once ?
- *
- */
-
-void
-pnp_configure()
-{
- int num_pnp_devs;
-
- if (pnp_ldn_overrides[0].csn == 0) {
- if (bootverbose)
- printf("Initializing PnP override table\n");
- bzero (pnp_ldn_overrides, sizeof(pnp_ldn_overrides));
- pnp_ldn_overrides[0].csn = 255 ;
- }
- printf("Probing for PnP devices:\n");
-
- /* Try various READ_DATA ports from 0x203-0x3ff */
- for (pnp_rd_port = 0x80; (pnp_rd_port < 0xff); pnp_rd_port += 0x10) {
- if (bootverbose)
- printf("Trying Read_Port at %x\n", (pnp_rd_port << 2) | 0x3);
-
- num_pnp_devs = pnp_isolation_protocol();
- if (num_pnp_devs)
- break;
- }
- if (!num_pnp_devs) {
- 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
deleted file mode 100644
index 7b63925..0000000
--- a/sys/i386/isa/pnp.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (c) 1996, Sujal M. Patel
- * All rights reserved.
- *
- * 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 Sujal M. Patel
- * 4. Neither the name of the author nor the names of any co-contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
- *
- * $FreeBSD$
- */
-
-#ifndef _I386_ISA_PNP_H_
-#define _I386_ISA_PNP_H_
-
-/* Maximum Number of PnP Devices. 8 should be plenty */
-#define MAX_PNP_CARDS 8
-/*
- * the following is the maximum number of PnP Logical devices that
- * userconfig can handle.
- */
-#define MAX_PNP_LDN 20
-
-/* Static ports to access PnP state machine */
-#if defined(PC98) && defined(KERNEL)
-/* pnp.h is included from pnpinfo.c. */
-#define _PNP_ADDRESS 0x259
-#define _PNP_WRITE_DATA 0xa59
-#else
-#define _PNP_ADDRESS 0x279
-#define _PNP_WRITE_DATA 0xa79
-#endif
-
-/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */
-#define SET_RD_DATA 0x00
- /***
- Writing to this location modifies the address of the port used for
- reading from the Plug and Play ISA cards. Bits[7:0] become I/O
- read port address bits[9:2]. Reads from this register are ignored.
- ***/
-
-#define SERIAL_ISOLATION 0x01
- /***
- A read to this register causes a Plug and Play cards in the Isolation
- state to compare one bit of the boards ID.
- This register is read only.
- ***/
-
-#define CONFIG_CONTROL 0x02
- /***
- Bit[2] Reset CSN to 0
- Bit[1] Return to the Wait for Key state
- Bit[0] Reset all logical devices and restore configuration
- registers to their power-up values.
-
- A write to bit[0] of this register performs a reset function on
- all logical devices. This resets the contents of configuration
- registers to their default state. All card's logical devices
- enter their default state and the CSN is preserved.
-
- A write to bit[1] of this register causes all cards to enter the
- Wait for Key state but all CSNs are preserved and logical devices
- are not affected.
-
- A write to bit[2] of this register causes all cards to reset their
- CSN to zero .
-
- This register is write-only. The values are not sticky, that is,
- hardware will automatically clear them and there is no need for
- software to clear the bits.
- ***/
-
-#define WAKE 0x03
- /***
- A write to this port will cause all cards that have a CSN that
- matches the write data[7:0] to go from the Sleep state to the either
- the Isolation state if the write data for this command is zero or
- the Config state if the write data is not zero. Additionally, the
- pointer to the byte-serial device is reset. This register is
- writeonly.
- ***/
-
-#define RESOURCE_DATA 0x04
- /***
- A read from this address reads the next byte of resource information.
- The Status register must be polled until bit[0] is set before this
- register may be read. This register is read only.
- ***/
-
-#define STATUS 0x05
- /***
- Bit[0] when set indicates it is okay to read the next data byte
- from the Resource Data register. This register is readonly.
- ***/
-
-#define SET_CSN 0x06
- /***
- A write to this port sets a card's CSN. The CSN is a value uniquely
- assigned to each ISA card after the serial identification process
- so that each card may be individually selected during a Wake[CSN]
- command. This register is read/write.
- ***/
-
-#define SET_LDN 0x07
- /***
- Selects the current logical device. All reads and writes of memory,
- I/O, interrupt and DMA configuration information access the registers
- of the logical device written here. In addition, the I/O Range
- Check and Activate commands operate only on the selected logical
- device. This register is read/write. If a card has only 1 logical
- device, this location should be a read-only value of 0x00.
- ***/
-
-/*** addresses 0x08 - 0x1F Card Level Reserved for future use ***/
-/*** addresses 0x20 - 0x2F Card Level, Vendor Defined ***/
-
-#define ACTIVATE 0x30
- /***
- For each logical device there is one activate register that controls
- whether or not the logical device is active on the ISA bus. Bit[0],
- if set, activates the logical device. Bits[7:1] are reserved and
- must return 0 on reads. This is a read/write register. Before a
- logical device is activated, I/O range check must be disabled.
- ***/
-
-#define IO_RANGE_CHECK 0x31
- /***
- This register is used to perform a conflict check on the I/O port
- range programmed for use by a logical device.
-
- Bit[7:2] Reserved and must return 0 on reads
- Bit[1] Enable I/O Range check, if set then I/O Range Check
- is enabled. I/O range check is only valid when the logical
- device is inactive.
-
- Bit[0], if set, forces the logical device to respond to I/O reads
- of the logical device's assigned I/O range with a 0x55 when I/O
- range check is in operation. If clear, the logical device drives
- 0xAA. This register is read/write.
- ***/
-
-/*** addr 0x32 - 0x37 Logical Device Control Reserved for future use ***/
-/*** addr 0x38 - 0x3F Logical Device Control Vendor Define ***/
-
-#define MEM_CONFIG 0x40
- /***
- Four memory resource registers per range, four ranges.
- Fill with 0 if no ranges are enabled.
-
- Offset 0: RW Memory base address bits[23:16]
- Offset 1: RW Memory base address bits[15:8]
- Offset 2: Memory control
- Bit[1] specifies 8/16-bit control. This bit is set to indicate
- 16-bit memory, and cleared to indicate 8-bit memory.
- Bit[0], if cleared, indicates the next field can be used as a range
- length for decode (implies range length and base alignment of memory
- descriptor are equal).
- Bit[0], if set, indicates the next field is the upper limit for
- the address. - - Bit[0] is read-only.
- Offset 3: RW upper limit or range len, bits[23:16]
- Offset 4: RW upper limit or range len, bits[15:8]
- Offset 5-Offset 7: filler, unused.
- ***/
-
-#define IO_CONFIG_BASE 0x60
- /***
- Eight ranges, two bytes per range.
- Offset 0: I/O port base address bits[15:8]
- Offset 1: I/O port base address bits[7:0]
- ***/
-
-#define IRQ_CONFIG 0x70
- /***
- Two entries, two bytes per entry.
- Offset 0: RW interrupt level (1..15, 0=unused).
- Offset 1: Bit[1]: level(1:hi, 0:low),
- Bit[0]: type (1:level, 0:edge)
- byte 1 can be readonly if 1 type of int is used.
- ***/
-
-#define DRQ_CONFIG 0x74
- /***
- Two entries, one byte per entry. Bits[2:0] select
- which DMA channel is in use for DMA 0. Zero selects DMA channel
- 0, seven selects DMA channel 7. DMA channel 4, the cascade channel
- is used to indicate no DMA channel is active.
- ***/
-
-/*** 32-bit memory accesses are at 0x76 ***/
-
-/* Macros to parse Resource IDs */
-#define PNP_RES_TYPE(a) (a >> 7)
-#define PNP_SRES_NUM(a) (a >> 3)
-#define PNP_SRES_LEN(a) (a & 0x07)
-#define PNP_LRES_NUM(a) (a & 0x7f)
-
-/* Small Resource Item names */
-#define PNP_VERSION 0x1
-#define LOG_DEVICE_ID 0x2
-#define COMP_DEVICE_ID 0x3
-#define IRQ_FORMAT 0x4
-#define DMA_FORMAT 0x5
-#define START_DEPEND_FUNC 0x6
-#define END_DEPEND_FUNC 0x7
-#define IO_PORT_DESC 0x8
-#define FIXED_IO_PORT_DESC 0x9
-#define SM_RES_RESERVED 0xa-0xd
-#define SM_VENDOR_DEFINED 0xe
-#define END_TAG 0xf
-
-/* Large Resource Item names */
-#define MEMORY_RANGE_DESC 0x1
-#define ID_STRING_ANSI 0x2
-#define ID_STRING_UNICODE 0x3
-#define LG_VENDOR_DEFINED 0x4
-#define _32BIT_MEM_RANGE_DESC 0x5
-#define _32BIT_FIXED_LOC_DESC 0x6
-#define LG_RES_RESERVED 0x7-0x7f
-
-/*
- * pnp_cinfo contains Configuration Information. They are used
- * to communicate to the device driver the actual configuration
- * of the device, and also by the userconfig menu to let the
- * operating system override any configuration set by the bios.
- *
- */
-struct pnp_cinfo {
- u_int vendor_id; /* board id */
- u_int serial; /* Board's Serial Number */
- u_long flags; /* OS-reserved flags */
- u_char csn; /* assigned Card Select Number */
- u_char ldn; /* Logical Device Number */
- u_char enable; /* pnp enable */
- u_char override; /* override bios parms (in userconfig) */
- u_char irq[2]; /* IRQ Number */
- u_char irq_type[2]; /* IRQ Type */
- u_char drq[2];
- u_short port[8]; /* The Base Address of the Port */
- struct {
- u_long base; /* Memory Base Address */
- int control; /* Memory Control Register */
- u_long range; /* Memory Range *OR* Upper Limit */
- } mem[4];
-};
-
-#ifdef KERNEL
-
-struct pnp_device {
- char *pd_name;
- char * (*pd_probe ) (u_long csn, u_long vendor_id);
- void (*pd_attach ) (u_long csn, u_long vend_id, char * name,
- struct isa_device *dev);
- u_long *pd_count;
- u_int *imask ;
-};
-
-struct pnp_dlist_node {
- struct pnp_device *pnp;
- struct isa_device dev;
- struct pnp_dlist_node *next;
-};
-
-/*
- * Used by userconfig
- */
-extern struct pnp_cinfo pnp_ldn_overrides[MAX_PNP_LDN];
-
-/*
- * The following definitions are for use in drivers
- */
-extern struct linker_set pnpdevice_set;
-
-typedef struct _pnpid_t {
- u_long vend_id; /* Not anly a Vendor ID, also a Compatible Device ID */
- char *id_str;
-} pnpid_t;
-
-void pnp_write(int d, u_char r); /* used by Luigi's sound driver */
-u_char pnp_read(int d); /* currently unused, but who knows... */
-int read_pnp_parms(struct pnp_cinfo *d, int ldn);
-int write_pnp_parms(struct pnp_cinfo *d, int ldn);
-int enable_pnp_card(void);
-
-/*
- * used by autoconfigure to actually probe and attach drivers
- */
-extern struct pnp_dlist_node *pnp_device_list;
-void pnp_configure __P((void));
-
-#endif /* KERNEL */
-
-#endif /* !_I386_ISA_PNP_H_ */
OpenPOWER on IntegriCloud