diff options
-rw-r--r-- | contrib/pnpinfo/Makefile | 7 | ||||
-rw-r--r-- | contrib/pnpinfo/pnpinfo.8 | 59 | ||||
-rw-r--r-- | contrib/pnpinfo/pnpinfo.c | 607 | ||||
-rw-r--r-- | contrib/pnpinfo/pnpinfo.h | 74 |
4 files changed, 747 insertions, 0 deletions
diff --git a/contrib/pnpinfo/Makefile b/contrib/pnpinfo/Makefile new file mode 100644 index 0000000..450c4c2 --- /dev/null +++ b/contrib/pnpinfo/Makefile @@ -0,0 +1,7 @@ +# @(#)Makefile 8.1 (Berkeley) 6/5/93 + +PROG= pnpinfo +MAN8= pnpinfo.8 +CFLAGS= -Wall + +.include <bsd.prog.mk> diff --git a/contrib/pnpinfo/pnpinfo.8 b/contrib/pnpinfo/pnpinfo.8 new file mode 100644 index 0000000..a966df8 --- /dev/null +++ b/contrib/pnpinfo/pnpinfo.8 @@ -0,0 +1,59 @@ +.\" 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. +.\" +.\" $Id: pnpinfo.8,v 1.4 1996/05/06 00:00:18 smpatel Exp smpatel $ +.\" +.Dd January 7, 1996 +.Dt PNPINFO 8 +.Os +.Sh NAME +.Nm pnpinfo +.Nd "Reports information about Plug-n-Play ISA devices" +.Sh SYNOPSIS +.Nm pnpinfo +.Sh DESCRIPTION +.Nm pnpinfo +reports information about Plug-n-Play ISA devices. Some of the information, +such as the vendor ID, serial number, I/O ports, IRQ, etc. are useful when +configuring a kernel with ISA PnP devices. +.Sh BUGS +A few of the tags are unimplemented (Enough exist for 99% of PnP cards). +.Sh SEE ALSO +.Xr pnp 4 +.Sh HISTORY +The +.Nm +utility first appeared in +.Tn FreeBSD +2.2. +.Sh AUTHOR +.Bl -tag +Sujal M. Patel, smpatel@umiacs.umd.edu +.El diff --git a/contrib/pnpinfo/pnpinfo.c b/contrib/pnpinfo/pnpinfo.c new file mode 100644 index 0000000..6a804fd --- /dev/null +++ b/contrib/pnpinfo/pnpinfo.c @@ -0,0 +1,607 @@ +/* + * 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. + * + * $Id: pnpinfo.c,v 1.16 1996/05/05 23:56:38 smpatel Exp $ + */ + +#include <sys/time.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> + +#include <machine/cpufunc.h> + +#include <i386/isa/pnp.h> + +#ifdef DEBUG +#define DEB(x) x +#else +#define DEB(x) +#endif +#define DDB(x) x + +void +pnp_write(int d, u_char r) +{ + outb (_PNP_ADDRESS, d); + outb (_PNP_WRITE_DATA, r); +} +/* The READ_DATA port that we are using currently */ +static int rd_port; + +u_char +pnp_read(int d) +{ + outb(_PNP_ADDRESS, d); + return inb( (rd_port << 2) + 3) & 0xff; +} + +u_char +pnp_readw(int d) +{ + int c = pnp_read(d) << 8 ; + c |= pnp_read(d+1); + return c; +} + +int logdevs=0; + +void DELAY __P((int i)); +void send_Initiation_LFSR(); +int get_serial __P((u_char *data)); +int get_resource_info __P((u_char *buffer, int len)); +int handle_small_res __P((u_char *resinfo, int item, int len)); +void handle_large_res __P((u_char *resinfo, int item, int len)); +void dump_resdata __P((u_char *data, int csn)); +int isolation_protocol(); + + +/* + * DELAY does accurate delaying in user-space. + * This function busy-waits. + */ +void +DELAY (int i) +{ + struct timeval t; + long start, stop; + + i *= 4; + + gettimeofday (&t, NULL); + start = t.tv_sec * 1000000 + t.tv_usec; + do { + gettimeofday (&t, NULL); + stop = t.tv_sec * 1000000 + t.tv_usec; + } while (start + i > stop); +} + + +/* + * Send Initiation LFSR as described in "Plug and Play ISA Specification, + * Intel May 94." + */ +void +send_Initiation_LFSR() +{ + int cur, i; + + pnp_write(CONFIG_CONTROL, 0x2); + + /* Reset the LSFR */ + outb(_PNP_ADDRESS, 0); + outb(_PNP_ADDRESS, 0); /* yes, we do need it twice! */ + + cur = 0x6a; + + for (i = 0; i < 32; i++) { + outb(_PNP_ADDRESS, cur); + cur = (cur >> 1) | (((cur ^ (cur >> 1)) << 7) & 0xff); + } +} + +/* + * Get the device's serial number. Returns 1 if the serial is valid. + */ +int +get_serial(u_char *data) +{ + int i, bit, valid = 0, sum = 0x6a; + + bzero(data, sizeof(char) * 9); + + for (i = 0; i < 72; i++) { + bit = inb((rd_port << 2) | 0x3) == 0x55; + DELAY(250); /* Delay 250 usec */ + + /* Can't Short Circuit the next evaluation, so 'and' is last */ + bit = (inb((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 + */ +int +get_resource_info(u_char *buffer, int len) +{ + int i, j; + + for (i = 0; i < len; i++) { + outb(_PNP_ADDRESS, STATUS); + for (j = 0; j < 100; j++) { + if ((inb((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); + buffer[i] = inb((rd_port << 2) | 0x3); + DEB(printf("--- get_resource_info: got 0x%02x\n",(unsigned)buffer[i])); + } + return 1; +} + +void +report_dma_info (x) + int x; +{ + char *s1=NULL, *s2=NULL, *s3=NULL, *s4=NULL, *s5=NULL; + + switch (x & 0x3) { + case 0: + s1="8-bit"; + break; + case 1: + s1="8/16-bit"; + break; + case 2: + s1="16-bit"; + break; +#ifdef DIAGNOSTIC + case 3: + s1="Reserved"; + break; +#endif + } + + s2 = (x & 0x4) ? "bus master" : "not a bus master"; + + s3 = (x & 0x8) ? "count by byte" : ""; + + s4 = (x & 0x10) ? "count by word" : ""; + + switch ((x & 0x60) >> 5) { + case 0: + s5="Compatibility mode"; + break; + case 1: + s5="Type A"; + break; + case 2: + s5="Type B"; + break; + case 3: + s5="Type F"; + break; + } + printf("\t%s, %s, %s, %s, %s\n",s1,s2,s3,s4,s5); +} + + +void +report_memory_info (int x) +{ + if (x & 0x1) + printf ("Memory Range: Writeable\n"); + else + printf ("Memory Range: Not writeable (ROM)\n"); + + if (x & 0x2) + printf ("Memory Range: Read-cacheable, write-through\n"); + else + printf ("Memory Range: Non-cacheable\n"); + + if (x & 0x4) + printf ("Memory Range: Decode supports high address\n"); + else + printf ("Memory Range: Decode supports range length\n"); + + switch ((x & 0x18) >> 3) { + case 0: + printf ("Memory Range: 8-bit memory only\n"); + break; + case 1: + printf ("Memory Range: 16-bit memory only\n"); + break; + case 2: + printf ("Memory Range: 8-bit and 16-bit memory supported\n"); + break; +#ifdef DIAGNOSTIC + case 3: + printf ("Memory Range: Reserved\n"); + break; +#endif + } + + if (x & 0x20) + printf ("Memory Range: Memory is shadowable\n"); + else + printf ("Memory Range: Memory is not shadowable\n"); + + if (x & 0x40) + printf ("Memory Range: Memory is an expansion ROM\n"); + else + printf ("Memory Range: Memory is not an expansion ROM\n"); + +#ifdef DIAGNOSTIC + if (x & 0x80) + printf ("Memory Range: Reserved (Device is brain-damaged)\n"); +#endif +} + + +/* + * Small Resource Tag Handler + * + * Returns 1 if checksum was valid (and an END_TAG was received). + * Returns -1 if checksum was invalid (and an END_TAG was received). + * Returns 0 for other tags. + */ +int +handle_small_res(u_char *resinfo, int item, int len) +{ + int i; + + DEB(printf("*** ITEM 0x%04x len %d detected\n", item, len)); + + switch (item) { + default: + printf("*** ITEM 0x%02x detected\n", item); + break; + case PNP_VERSION: + printf("PnP Version %d.%d, Vendor Version %d\n", + resinfo[0] >> 4, resinfo[0] & (0xf), resinfo[1]); + break; + case LOG_DEVICE_ID: + printf("\nLogical Device ID: %c%c%c%02x%02x 0x%08x #%d\n", + ((resinfo[0] & 0x7c) >> 2) + 64, + (((resinfo[0] & 0x03) << 3) | + ((resinfo[1] & 0xe0) >> 5)) + 64, + (resinfo[1] & 0x1f) + 64, + resinfo[2], resinfo[3], *(int *)(resinfo), + logdevs++); + + if (resinfo[4] & 0x1) + printf ("\tDevice powers up active\n"); /* XXX */ + if (resinfo[4] & 0x2) + printf ("\tDevice supports I/O Range Check\n"); + if (resinfo[4] > 0x3) + printf ("\tReserved register funcs %02x\n", + resinfo[4]); + + if (len == 6) + printf("\tVendor register funcs %02x\n", resinfo[5]); + break; + case COMP_DEVICE_ID: + printf("Compatible Device ID: %c%c%c%02x%02x (%08x)\n", + ((resinfo[0] & 0x7c) >> 2) + 64, + (((resinfo[0] & 0x03) << 3) | + ((resinfo[1] & 0xe0) >> 5)) + 64, + (resinfo[1] & 0x1f) + 64, + resinfo[2], resinfo[3], *(int *)resinfo); + break; + case IRQ_FORMAT: + printf(" IRQ: "); + + for (i = 0; i < 8; i++) + if (resinfo[0] & (1<<i)) + printf("%d ", i); + for (i = 0; i < 8; i++) + if (resinfo[1] & (1<<i)) + printf("%d ", i + 8); + if (len == 3) { + if (resinfo[2] & 0x1) + printf("IRQ: High true edge sensitive\n"); + if (resinfo[2] & 0x2) + printf("IRQ: Low true edge sensitive\n"); + if (resinfo[2] & 0x4) + printf("IRQ: High true level sensitive\n"); + if (resinfo[2] & 0x8) + printf("IRQ: Low true level sensitive\n"); + } else { + printf(" - only one type (true/edge)\n"); + } + break; + case DMA_FORMAT: + printf(" DMA: channel(s) "); + for (i = 0; i < 8; i++) + if (resinfo[0] & (1<<i)) + printf("%d ", i); + printf ("\n"); + report_dma_info (resinfo[1]); + break; + case START_DEPEND_FUNC: + printf("TAG Start DF\n"); + if (len == 1) { + switch (resinfo[0]) { + case 0: + printf("Good Configuration\n"); + break; + case 1: + printf("Acceptable Configuration\n"); + break; + case 2: + printf("Sub-optimal Configuration\n"); + break; + } + } + break; + case END_DEPEND_FUNC: + printf("TAG End DF\n"); + break; + case IO_PORT_DESC: + printf(" I/O Range 0x%x .. 0x%x, alignment 0x%x, len 0x%x\n", + resinfo[1] + (resinfo[2] << 8), + resinfo[3] + (resinfo[4] << 8), + resinfo[5], resinfo[6] ); + if (resinfo[0]) + printf("\t[16-bit addr]\n"); + else + printf("\t[not 16-bit addr]\n"); + break; + case FIXED_IO_PORT_DESC: + printf (" FIXED I/O base address 0x%x length 0x%x\n", + resinfo[0] + ( (resinfo[1] & 3 ) << 8), /* XXX */ + resinfo[2]); + break; +#ifdef DIAGNOSTIC + case SM_RES_RESERVED: + printf("Reserved Tag Detected\n"); + break; +#endif + case SM_VENDOR_DEFINED: + printf("*** Small Vendor Tag Detected\n"); + break; + case END_TAG: + printf("End Tag\n\n"); + /* XXX Record and Verify Checksum */ + return 1; + break; + } + return 0; +} + + +void +handle_large_res(u_char *resinfo, int item, int len) +{ + int i; + + DEB(printf("*** Large ITEM %d len %d found\n", item, len)); + switch (item) { + case MEMORY_RANGE_DESC: + report_memory_info(resinfo[0]); + printf("Memory range minimum address: 0x%x\n", + (resinfo[1] << 8) + (resinfo[2] << 16)); + printf("Memory range maximum address: 0x%x\n", + (resinfo[3] << 8) + (resinfo[4] << 16)); + printf("Memory range base alignment: 0x%x\n", + (i = (resinfo[5] + (resinfo[6] << 8))) ? i : (1 << 16)); + printf("Memory range length: 0x%x\n", + (resinfo[7] + (resinfo[8] << 8)) * 256); + break; + case ID_STRING_ANSI: + printf("Device Description: "); + + for (i = 0; i < len; i++) { + if (resinfo[i]) /* XXX */ + printf("%c", resinfo[i]); + } + printf("\n"); + break; + case ID_STRING_UNICODE: + printf("ID String Unicode Detected (Undefined)\n"); + break; + case LG_VENDOR_DEFINED: + printf("Large Vendor Defined Detected\n"); + break; + case _32BIT_MEM_RANGE_DESC: + printf("32bit Memory Range Desc Unimplemented\n"); + break; + case _32BIT_FIXED_LOC_DESC: + printf("32bit Fixed Location Desc Unimplemented\n"); + break; + case LG_RES_RESERVED: + printf("Large Reserved Tag Detected\n"); + break; + } +} + + +/* + * Dump all the information about configurations. + */ +void +dump_resdata(u_char *data, int csn) +{ + int i, large_len; + + u_char tag, *resinfo; + + DDB(printf("\nCard assigned CSN #%d\n", csn)); + printf("Vendor ID %c%c%c%02x%02x (0x%08x), Serial Number 0x%08x\n", + ((data[0] & 0x7c) >> 2) + 64, + (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64, + (data[1] & 0x1f) + 64, data[2], data[3], + *(int *)&(data[0]), + *(int *)&(data[4])); + + pnp_write(SET_CSN, csn); /* Move this out of this function XXX */ + outb(_PNP_ADDRESS, STATUS); + + /* Allows up to 1kb of Resource Info, Should be plenty */ + for (i = 0; i < 1024; i++) { + if (!get_resource_info(&tag, 1)) + break; + +#define TYPE (tag >> 7) +#define S_ITEM (tag >> 3) +#define S_LEN (tag & 0x7) +#define L_ITEM (tag & 0x7f) + + if (TYPE == 0) { + /* Handle small resouce data types */ + + resinfo = malloc(S_LEN); + if (!get_resource_info(resinfo, S_LEN)) + break; + + if (handle_small_res(resinfo, S_ITEM, S_LEN) == 1) + break; + free(resinfo); + } else { + /* Handle large resouce data types */ + + if (!get_resource_info((char *) &large_len, 2)) + break; + + resinfo = malloc(large_len); + if (!get_resource_info(resinfo, large_len)) + break; + + handle_large_res(resinfo, L_ITEM, large_len); + free(resinfo); + } + } + printf("Successfully got %d resources, %d logical fdevs\n", i, + logdevs); + printf("-- card select # 0x%04x\n", pnp_read(SET_CSN)); + printf("\nCSN %c%c%c%02x%02x (0x%08x), Serial Number 0x%08x\n", + ((data[0] & 0x7c) >> 2) + 64, + (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64, + (data[1] & 0x1f) + 64, data[2], data[3], + *(int *)&(data[0]), + *(int *)&(data[4])); + + for (i=0; i<logdevs; i++) { + int j; + + pnp_write(SET_LDN, i); + + printf("\nLogical device #%d\n", pnp_read(SET_LDN) ); + printf("IO: "); + for (j=0; j<8; j++) + printf(" 0x%04x", pnp_readw(IO_CONFIG_BASE + j*2)); + printf("\nIRQ %d %d\n", + pnp_read(IRQ_CONFIG), pnp_read(IRQ_CONFIG+2) ); + printf("DMA %d %d\n", + pnp_read(DRQ_CONFIG), pnp_read(DRQ_CONFIG+1) ); + printf("IO range check 0x%02x activate 0x%02x\n", + pnp_read(IO_RANGE_CHECK), pnp_read(ACTIVATE) ); + } +} + + +/* + * Run the isolation protocol. Use 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 rd_port + * as the READ_DATA port; + * + */ +int +isolation_protocol() +{ + int csn; + u_char data[9]; + + send_Initiation_LFSR(); + + /* Reset CSN for All Cards */ + pnp_write(CONFIG_CONTROL, 0x04); + + for (csn = 1; (csn < MAX_PNP_CARDS); csn++) { + /* Wake up cards without a CSN */ + logdevs = 0 ; + pnp_write(WAKE, 0); + pnp_write(SET_RD_DATA, rd_port); + outb(_PNP_ADDRESS, SERIAL_ISOLATION); + DELAY(1000); /* Delay 1 msec */ + + if (get_serial(data)) + dump_resdata(data, csn); + else + break; + } + return csn - 1; +} + + +void +main() +{ + int num_pnp_devs; + + /* Hey what about a i386_iopl() call :) */ + if (open("/dev/io", O_RDONLY) < 0) { + fprintf (stderr, "pnpinfo: Can't get I/O privilege.\n"); + exit (1); + } + printf("Checking for Plug-n-Play devices...\n"); + + /* Try various READ_DATA ports from 0x203-0x3ff */ + for (rd_port = 0x80; (rd_port < 0xff); rd_port += 0x10) { + DEB(printf("Trying Read_Port at %x...\n", (rd_port << 2) | 0x3) ); + num_pnp_devs = isolation_protocol(rd_port); + if (num_pnp_devs) + break; + } + if (!num_pnp_devs) { + printf("No Plug-n-Play devices were found\n"); + return; + } +} diff --git a/contrib/pnpinfo/pnpinfo.h b/contrib/pnpinfo/pnpinfo.h new file mode 100644 index 0000000..5469891 --- /dev/null +++ b/contrib/pnpinfo/pnpinfo.h @@ -0,0 +1,74 @@ +/* + * 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. + * + * $Id: pnpinfo.h,v 1.1 1996/01/08 00:48:32 smpatel Exp $ + */ + + +/* Maximum Number of PnP Devices. 6 should be plenty */ +#define MAX_CARDS 6 + + +/* Static ports */ +#define ADDRESS 0x279 +#define WRITE_DATA 0xa79 + + +/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */ +#define SET_RD_DATA 0x00 +#define SERIAL_ISOLATION 0x01 +#define WAKE 0x03 +#define RESOURCE_DATA 0x04 +#define STATUS 0x05 +#define SET_CSN 0x06 + +/* 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 |