1*479ab7f0SSascha Wildner /* 2*479ab7f0SSascha Wildner * Copyright (c) 1996, Sujal M. Patel 3*479ab7f0SSascha Wildner * All rights reserved. 4*479ab7f0SSascha Wildner * 5*479ab7f0SSascha Wildner * Redistribution and use in source and binary forms, with or without 6*479ab7f0SSascha Wildner * modification, are permitted provided that the following conditions 7*479ab7f0SSascha Wildner * are met: 8*479ab7f0SSascha Wildner * 1. Redistributions of source code must retain the above copyright 9*479ab7f0SSascha Wildner * notice, this list of conditions and the following disclaimer. 10*479ab7f0SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 11*479ab7f0SSascha Wildner * notice, this list of conditions and the following disclaimer in the 12*479ab7f0SSascha Wildner * documentation and/or other materials provided with the distribution. 13*479ab7f0SSascha Wildner * 3. All advertising materials mentioning features or use of this software 14*479ab7f0SSascha Wildner * must display the following acknowledgement: 15*479ab7f0SSascha Wildner * This product includes software developed by Sujal M. Patel 16*479ab7f0SSascha Wildner * 4. Neither the name of the author nor the names of any co-contributors 17*479ab7f0SSascha Wildner * may be used to endorse or promote products derived from this software 18*479ab7f0SSascha Wildner * without specific prior written permission. 19*479ab7f0SSascha Wildner * 20*479ab7f0SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21*479ab7f0SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22*479ab7f0SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23*479ab7f0SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24*479ab7f0SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25*479ab7f0SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26*479ab7f0SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27*479ab7f0SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28*479ab7f0SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29*479ab7f0SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30*479ab7f0SSascha Wildner * SUCH DAMAGE. 31*479ab7f0SSascha Wildner * 32*479ab7f0SSascha Wildner * $FreeBSD: src/sys/boot/common/isapnp.h,v 1.7 2002/03/20 07:59:37 alfred Exp $ 33*479ab7f0SSascha Wildner */ 34*479ab7f0SSascha Wildner 35*479ab7f0SSascha Wildner #ifndef _BOOT_COMMON_ISAPNP_H_ 36*479ab7f0SSascha Wildner #define _BOOT_COMMON_ISAPNP_H_ 37*479ab7f0SSascha Wildner 38*479ab7f0SSascha Wildner /* Maximum Number of PnP Devices. 8 should be plenty */ 39*479ab7f0SSascha Wildner #define MAX_PNP_CARDS 8 40*479ab7f0SSascha Wildner 41*479ab7f0SSascha Wildner /* Static ports to access PnP state machine */ 42*479ab7f0SSascha Wildner #ifndef _KERNEL 43*479ab7f0SSascha Wildner #define _PNP_ADDRESS 0x279 44*479ab7f0SSascha Wildner #define _PNP_WRITE_DATA 0xa79 45*479ab7f0SSascha Wildner #endif 46*479ab7f0SSascha Wildner 47*479ab7f0SSascha Wildner /* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */ 48*479ab7f0SSascha Wildner #define SET_RD_DATA 0x00 49*479ab7f0SSascha Wildner /*** 50*479ab7f0SSascha Wildner Writing to this location modifies the address of the port used for 51*479ab7f0SSascha Wildner reading from the Plug and Play ISA cards. Bits[7:0] become I/O 52*479ab7f0SSascha Wildner read port address bits[9:2]. Reads from this register are ignored. 53*479ab7f0SSascha Wildner ***/ 54*479ab7f0SSascha Wildner 55*479ab7f0SSascha Wildner #define SERIAL_ISOLATION 0x01 56*479ab7f0SSascha Wildner /*** 57*479ab7f0SSascha Wildner A read to this register causes a Plug and Play cards in the Isolation 58*479ab7f0SSascha Wildner state to compare one bit of the boards ID. 59*479ab7f0SSascha Wildner This register is read only. 60*479ab7f0SSascha Wildner ***/ 61*479ab7f0SSascha Wildner 62*479ab7f0SSascha Wildner #define CONFIG_CONTROL 0x02 63*479ab7f0SSascha Wildner /*** 64*479ab7f0SSascha Wildner Bit[2] Reset CSN to 0 65*479ab7f0SSascha Wildner Bit[1] Return to the Wait for Key state 66*479ab7f0SSascha Wildner Bit[0] Reset all logical devices and restore configuration 67*479ab7f0SSascha Wildner registers to their power-up values. 68*479ab7f0SSascha Wildner 69*479ab7f0SSascha Wildner A write to bit[0] of this register performs a reset function on 70*479ab7f0SSascha Wildner all logical devices. This resets the contents of configuration 71*479ab7f0SSascha Wildner registers to their default state. All card's logical devices 72*479ab7f0SSascha Wildner enter their default state and the CSN is preserved. 73*479ab7f0SSascha Wildner 74*479ab7f0SSascha Wildner A write to bit[1] of this register causes all cards to enter the 75*479ab7f0SSascha Wildner Wait for Key state but all CSNs are preserved and logical devices 76*479ab7f0SSascha Wildner are not affected. 77*479ab7f0SSascha Wildner 78*479ab7f0SSascha Wildner A write to bit[2] of this register causes all cards to reset their 79*479ab7f0SSascha Wildner CSN to zero . 80*479ab7f0SSascha Wildner 81*479ab7f0SSascha Wildner This register is write-only. The values are not sticky, that is, 82*479ab7f0SSascha Wildner hardware will automatically clear them and there is no need for 83*479ab7f0SSascha Wildner software to clear the bits. 84*479ab7f0SSascha Wildner ***/ 85*479ab7f0SSascha Wildner 86*479ab7f0SSascha Wildner #define WAKE 0x03 87*479ab7f0SSascha Wildner /*** 88*479ab7f0SSascha Wildner A write to this port will cause all cards that have a CSN that 89*479ab7f0SSascha Wildner matches the write data[7:0] to go from the Sleep state to the either 90*479ab7f0SSascha Wildner the Isolation state if the write data for this command is zero or 91*479ab7f0SSascha Wildner the Config state if the write data is not zero. Additionally, the 92*479ab7f0SSascha Wildner pointer to the byte-serial device is reset. This register is 93*479ab7f0SSascha Wildner writeonly. 94*479ab7f0SSascha Wildner ***/ 95*479ab7f0SSascha Wildner 96*479ab7f0SSascha Wildner #define RESOURCE_DATA 0x04 97*479ab7f0SSascha Wildner /*** 98*479ab7f0SSascha Wildner A read from this address reads the next byte of resource information. 99*479ab7f0SSascha Wildner The Status register must be polled until bit[0] is set before this 100*479ab7f0SSascha Wildner register may be read. This register is read only. 101*479ab7f0SSascha Wildner ***/ 102*479ab7f0SSascha Wildner 103*479ab7f0SSascha Wildner #define STATUS 0x05 104*479ab7f0SSascha Wildner /*** 105*479ab7f0SSascha Wildner Bit[0] when set indicates it is okay to read the next data byte 106*479ab7f0SSascha Wildner from the Resource Data register. This register is readonly. 107*479ab7f0SSascha Wildner ***/ 108*479ab7f0SSascha Wildner 109*479ab7f0SSascha Wildner #define SET_CSN 0x06 110*479ab7f0SSascha Wildner /*** 111*479ab7f0SSascha Wildner A write to this port sets a card's CSN. The CSN is a value uniquely 112*479ab7f0SSascha Wildner assigned to each ISA card after the serial identification process 113*479ab7f0SSascha Wildner so that each card may be individually selected during a Wake[CSN] 114*479ab7f0SSascha Wildner command. This register is read/write. 115*479ab7f0SSascha Wildner ***/ 116*479ab7f0SSascha Wildner 117*479ab7f0SSascha Wildner #define SET_LDN 0x07 118*479ab7f0SSascha Wildner /*** 119*479ab7f0SSascha Wildner Selects the current logical device. All reads and writes of memory, 120*479ab7f0SSascha Wildner I/O, interrupt and DMA configuration information access the registers 121*479ab7f0SSascha Wildner of the logical device written here. In addition, the I/O Range 122*479ab7f0SSascha Wildner Check and Activate commands operate only on the selected logical 123*479ab7f0SSascha Wildner device. This register is read/write. If a card has only 1 logical 124*479ab7f0SSascha Wildner device, this location should be a read-only value of 0x00. 125*479ab7f0SSascha Wildner ***/ 126*479ab7f0SSascha Wildner 127*479ab7f0SSascha Wildner /*** addresses 0x08 - 0x1F Card Level Reserved for future use ***/ 128*479ab7f0SSascha Wildner /*** addresses 0x20 - 0x2F Card Level, Vendor Defined ***/ 129*479ab7f0SSascha Wildner 130*479ab7f0SSascha Wildner #define ACTIVATE 0x30 131*479ab7f0SSascha Wildner /*** 132*479ab7f0SSascha Wildner For each logical device there is one activate register that controls 133*479ab7f0SSascha Wildner whether or not the logical device is active on the ISA bus. Bit[0], 134*479ab7f0SSascha Wildner if set, activates the logical device. Bits[7:1] are reserved and 135*479ab7f0SSascha Wildner must return 0 on reads. This is a read/write register. Before a 136*479ab7f0SSascha Wildner logical device is activated, I/O range check must be disabled. 137*479ab7f0SSascha Wildner ***/ 138*479ab7f0SSascha Wildner 139*479ab7f0SSascha Wildner #define IO_RANGE_CHECK 0x31 140*479ab7f0SSascha Wildner /*** 141*479ab7f0SSascha Wildner This register is used to perform a conflict check on the I/O port 142*479ab7f0SSascha Wildner range programmed for use by a logical device. 143*479ab7f0SSascha Wildner 144*479ab7f0SSascha Wildner Bit[7:2] Reserved and must return 0 on reads 145*479ab7f0SSascha Wildner Bit[1] Enable I/O Range check, if set then I/O Range Check 146*479ab7f0SSascha Wildner is enabled. I/O range check is only valid when the logical 147*479ab7f0SSascha Wildner device is inactive. 148*479ab7f0SSascha Wildner 149*479ab7f0SSascha Wildner Bit[0], if set, forces the logical device to respond to I/O reads 150*479ab7f0SSascha Wildner of the logical device's assigned I/O range with a 0x55 when I/O 151*479ab7f0SSascha Wildner range check is in operation. If clear, the logical device drives 152*479ab7f0SSascha Wildner 0xAA. This register is read/write. 153*479ab7f0SSascha Wildner ***/ 154*479ab7f0SSascha Wildner 155*479ab7f0SSascha Wildner /*** addr 0x32 - 0x37 Logical Device Control Reserved for future use ***/ 156*479ab7f0SSascha Wildner /*** addr 0x38 - 0x3F Logical Device Control Vendor Define ***/ 157*479ab7f0SSascha Wildner 158*479ab7f0SSascha Wildner #define MEM_CONFIG 0x40 159*479ab7f0SSascha Wildner /*** 160*479ab7f0SSascha Wildner Four memory resource registers per range, four ranges. 161*479ab7f0SSascha Wildner Fill with 0 if no ranges are enabled. 162*479ab7f0SSascha Wildner 163*479ab7f0SSascha Wildner Offset 0: RW Memory base address bits[23:16] 164*479ab7f0SSascha Wildner Offset 1: RW Memory base address bits[15:8] 165*479ab7f0SSascha Wildner Offset 2: Memory control 166*479ab7f0SSascha Wildner Bit[1] specifies 8/16-bit control. This bit is set to indicate 167*479ab7f0SSascha Wildner 16-bit memory, and cleared to indicate 8-bit memory. 168*479ab7f0SSascha Wildner Bit[0], if cleared, indicates the next field can be used as a range 169*479ab7f0SSascha Wildner length for decode (implies range length and base alignment of memory 170*479ab7f0SSascha Wildner descriptor are equal). 171*479ab7f0SSascha Wildner Bit[0], if set, indicates the next field is the upper limit for 172*479ab7f0SSascha Wildner the address. - - Bit[0] is read-only. 173*479ab7f0SSascha Wildner Offset 3: RW upper limit or range len, bits[23:16] 174*479ab7f0SSascha Wildner Offset 4: RW upper limit or range len, bits[15:8] 175*479ab7f0SSascha Wildner Offset 5-Offset 7: filler, unused. 176*479ab7f0SSascha Wildner ***/ 177*479ab7f0SSascha Wildner 178*479ab7f0SSascha Wildner #define IO_CONFIG_BASE 0x60 179*479ab7f0SSascha Wildner /*** 180*479ab7f0SSascha Wildner Eight ranges, two bytes per range. 181*479ab7f0SSascha Wildner Offset 0: I/O port base address bits[15:8] 182*479ab7f0SSascha Wildner Offset 1: I/O port base address bits[7:0] 183*479ab7f0SSascha Wildner ***/ 184*479ab7f0SSascha Wildner 185*479ab7f0SSascha Wildner #define IRQ_CONFIG 0x70 186*479ab7f0SSascha Wildner /*** 187*479ab7f0SSascha Wildner Two entries, two bytes per entry. 188*479ab7f0SSascha Wildner Offset 0: RW interrupt level (1..15, 0=unused). 189*479ab7f0SSascha Wildner Offset 1: Bit[1]: level(1:hi, 0:low), 190*479ab7f0SSascha Wildner Bit[0]: type (1:level, 0:edge) 191*479ab7f0SSascha Wildner byte 1 can be readonly if 1 type of int is used. 192*479ab7f0SSascha Wildner ***/ 193*479ab7f0SSascha Wildner 194*479ab7f0SSascha Wildner #define DRQ_CONFIG 0x74 195*479ab7f0SSascha Wildner /*** 196*479ab7f0SSascha Wildner Two entries, one byte per entry. Bits[2:0] select 197*479ab7f0SSascha Wildner which DMA channel is in use for DMA 0. Zero selects DMA channel 198*479ab7f0SSascha Wildner 0, seven selects DMA channel 7. DMA channel 4, the cascade channel 199*479ab7f0SSascha Wildner is used to indicate no DMA channel is active. 200*479ab7f0SSascha Wildner ***/ 201*479ab7f0SSascha Wildner 202*479ab7f0SSascha Wildner /*** 32-bit memory accesses are at 0x76 ***/ 203*479ab7f0SSascha Wildner 204*479ab7f0SSascha Wildner /* Macros to parse Resource IDs */ 205*479ab7f0SSascha Wildner #define PNP_RES_TYPE(a) (a >> 7) 206*479ab7f0SSascha Wildner #define PNP_SRES_NUM(a) (a >> 3) 207*479ab7f0SSascha Wildner #define PNP_SRES_LEN(a) (a & 0x07) 208*479ab7f0SSascha Wildner #define PNP_LRES_NUM(a) (a & 0x7f) 209*479ab7f0SSascha Wildner 210*479ab7f0SSascha Wildner /* Small Resource Item names */ 211*479ab7f0SSascha Wildner #define PNP_VERSION 0x1 212*479ab7f0SSascha Wildner #define LOG_DEVICE_ID 0x2 213*479ab7f0SSascha Wildner #define COMP_DEVICE_ID 0x3 214*479ab7f0SSascha Wildner #define IRQ_FORMAT 0x4 215*479ab7f0SSascha Wildner #define DMA_FORMAT 0x5 216*479ab7f0SSascha Wildner #define START_DEPEND_FUNC 0x6 217*479ab7f0SSascha Wildner #define END_DEPEND_FUNC 0x7 218*479ab7f0SSascha Wildner #define IO_PORT_DESC 0x8 219*479ab7f0SSascha Wildner #define FIXED_IO_PORT_DESC 0x9 220*479ab7f0SSascha Wildner #define SM_RES_RESERVED 0xa-0xd 221*479ab7f0SSascha Wildner #define SM_VENDOR_DEFINED 0xe 222*479ab7f0SSascha Wildner #define END_TAG 0xf 223*479ab7f0SSascha Wildner 224*479ab7f0SSascha Wildner /* Large Resource Item names */ 225*479ab7f0SSascha Wildner #define MEMORY_RANGE_DESC 0x1 226*479ab7f0SSascha Wildner #define ID_STRING_ANSI 0x2 227*479ab7f0SSascha Wildner #define ID_STRING_UNICODE 0x3 228*479ab7f0SSascha Wildner #define LG_VENDOR_DEFINED 0x4 229*479ab7f0SSascha Wildner #define _32BIT_MEM_RANGE_DESC 0x5 230*479ab7f0SSascha Wildner #define _32BIT_FIXED_LOC_DESC 0x6 231*479ab7f0SSascha Wildner #define LG_RES_RESERVED 0x7-0x7f 232*479ab7f0SSascha Wildner 233*479ab7f0SSascha Wildner /* 234*479ab7f0SSascha Wildner * pnp_cinfo contains Configuration Information. They are used 235*479ab7f0SSascha Wildner * to communicate to the device driver the actual configuration 236*479ab7f0SSascha Wildner * of the device. 237*479ab7f0SSascha Wildner */ 238*479ab7f0SSascha Wildner struct pnp_cinfo { 239*479ab7f0SSascha Wildner u_int vendor_id; /* board id */ 240*479ab7f0SSascha Wildner u_int serial; /* Board's Serial Number */ 241*479ab7f0SSascha Wildner u_long flags; /* OS-reserved flags */ 242*479ab7f0SSascha Wildner u_char csn; /* assigned Card Select Number */ 243*479ab7f0SSascha Wildner u_char ldn; /* Logical Device Number */ 244*479ab7f0SSascha Wildner u_char enable; /* pnp enable */ 245*479ab7f0SSascha Wildner u_char irq[2]; /* IRQ Number */ 246*479ab7f0SSascha Wildner u_char irq_type[2]; /* IRQ Type */ 247*479ab7f0SSascha Wildner u_char drq[2]; 248*479ab7f0SSascha Wildner u_short port[8]; /* The Base Address of the Port */ 249*479ab7f0SSascha Wildner struct { 250*479ab7f0SSascha Wildner u_long base; /* Memory Base Address */ 251*479ab7f0SSascha Wildner int control; /* Memory Control Register */ 252*479ab7f0SSascha Wildner u_long range; /* Memory Range *OR* Upper Limit */ 253*479ab7f0SSascha Wildner } mem[4]; 254*479ab7f0SSascha Wildner }; 255*479ab7f0SSascha Wildner 256*479ab7f0SSascha Wildner #ifdef _KERNEL 257*479ab7f0SSascha Wildner 258*479ab7f0SSascha Wildner struct pnp_device { 259*479ab7f0SSascha Wildner char *pd_name; 260*479ab7f0SSascha Wildner char * (*pd_probe ) (u_long csn, u_long vendor_id); 261*479ab7f0SSascha Wildner void (*pd_attach ) (u_long csn, u_long vend_id, char * name, 262*479ab7f0SSascha Wildner struct isa_device *dev); 263*479ab7f0SSascha Wildner u_long *pd_count; 264*479ab7f0SSascha Wildner u_int *imask ; 265*479ab7f0SSascha Wildner }; 266*479ab7f0SSascha Wildner 267*479ab7f0SSascha Wildner struct _pnp_id { 268*479ab7f0SSascha Wildner u_long vendor_id; 269*479ab7f0SSascha Wildner u_long serial; 270*479ab7f0SSascha Wildner u_char checksum; 271*479ab7f0SSascha Wildner } ; 272*479ab7f0SSascha Wildner 273*479ab7f0SSascha Wildner struct pnp_dlist_node { 274*479ab7f0SSascha Wildner struct pnp_device *pnp; 275*479ab7f0SSascha Wildner struct isa_device dev; 276*479ab7f0SSascha Wildner struct pnp_dlist_node *next; 277*479ab7f0SSascha Wildner }; 278*479ab7f0SSascha Wildner 279*479ab7f0SSascha Wildner typedef struct _pnp_id pnp_id; 280*479ab7f0SSascha Wildner extern pnp_id pnp_devices[MAX_PNP_CARDS]; 281*479ab7f0SSascha Wildner 282*479ab7f0SSascha Wildner /* 283*479ab7f0SSascha Wildner * these two functions are for use in drivers 284*479ab7f0SSascha Wildner */ 285*479ab7f0SSascha Wildner int read_pnp_parms(struct pnp_cinfo *d, int ldn); 286*479ab7f0SSascha Wildner int write_pnp_parms(struct pnp_cinfo *d, int ldn); 287*479ab7f0SSascha Wildner int enable_pnp_card(void); 288*479ab7f0SSascha Wildner 289*479ab7f0SSascha Wildner /* 290*479ab7f0SSascha Wildner * used by autoconfigure to actually probe and attach drivers 291*479ab7f0SSascha Wildner */ 292*479ab7f0SSascha Wildner void pnp_configure(void); 293*479ab7f0SSascha Wildner 294*479ab7f0SSascha Wildner #endif /* _KERNEL */ 295*479ab7f0SSascha Wildner 296*479ab7f0SSascha Wildner #endif /* !_BOOT_COMMON_ISAPNP_H_ */ 297