June 19, 2001 ISAPNP 9

### NAME

ISAPNP, isapnp_devmatch, isapnp_config, isapnp_unconfig - Plug 'n' Play ISA bus

### SYNOPSIS

```int` isapnp_devmatch(```const struct isapnp_attach_args *ipa``, const struct isapnp_devinfo *dinfo``, int *variant`)
```int` isapnp_config(```bus_space_tag_t iot``, bus_space_tag_t memt``, struct isapnp_attach_args *ipa`)
```void` isapnp_unconfig(```bus_space_tag_t iot``, bus_space_tag_t memt``, struct isapnp_attach_args *ipa`)

### DESCRIPTION

The machine-independent ISAPNP subsystem provides support for ISAPNP devices. ISAPNP devices were developed to support "plug and play" connection on the ISA bus. In all other aspects, the ISAPNP bus is same as the ISA bus (see isa(9)).

Devices on the ISAPNP bus are uniquely identified by a 7-character string. Resources, such as I/O address space and interrupts, should be allocated to the devices by the machine firmware. On some machine the firmware seems doesn't work correctly and NetBSD will attempt to allocate resources as necessary.

### DATA TYPES

Drivers attached to the ISAPNP bus will make use of the following data types:

```struct` `isapnp_matchinfo`
  NetBSD kernel contains a database of known ISAPNP devices. Each entry in the database has a struct isapnp_matchinfo. It contains the following members: `

              const char *name;               /* device id string */
              int variant;                    /* variant flag */

  `

```struct` `isapnp_devinfo`
  Defines the devices supported by a driver. It contains pointer to an array of supported struct isapnp_matchinfo structures and a pointer to another array of compatibility devices. It contains the following members: `

              struct isapnp_matchinfo *devlogic;
              int nlogic;
              struct isapnp_matchinfo *devcompat;
              int ncompat;

  `

```struct` `isapnp_region`
  Describes ISAPNP bus-space regions. It contains the following members: `

              bus_space_handle_t h;
              uint32_t base;
              uint32_t length;

  `

```struct` `isapnp_pin`
  Describes the wiring of interrupts and DMA pins from the ISAPNP bus onto the host processor. It contains the following members: `

              uint8_t  num;
              uint8_t  flags:4;
              uint8_t  type:4;
              uint16_t bits;

  `

```struct` `isapnp_attach_args`
  A structure used to inform the driver of the device properties. It contains the following members: `

              bus_space_tag_t ipa_iot;        /* isa i/o space tag */
              bus_space_tag_t ipa_memt;       /* isa mem space tag */
              bus_dma_tag_t   ipa_dmat;       /* isa dma tag */
              isa_chipset_tag_t       ipa_ic;
              struct isapnp_region    ipa_io[ISAPNP_NUM_IO];
              struct isapnp_region    ipa_mem[ISAPNP_NUM_MEM];
              struct isapnp_region    ipa_mem32[ISAPNP_NUM_MEM32];
              struct isapnp_pin       ipa_irq[ISAPNP_NUM_IRQ];
              struct isapnp_pin       ipa_drq[ISAPNP_NUM_DRQ];

  `

### FUNCTIONS

isapnp_devmatch(```ipa``, dinfo``, variant`)
  Matches the device described by the attachment ```ipa` with the device-match information in ```dinfo`. If the device is matched, isapnp_devmatch(``) returns a non-zero value and variant is the flag describing the device variant. isapnp_devmatch(``) returns zero if the device is not found.

isapnp_config(```iot``, memt``, ipa`)
  Allocate device resources specified by ```ipa`. The device is mapped into the I/O and memory bus spaces specified by bus-space tags ```iot` and ```memt` respectively. The ```ipa_io`, ```ipa_mem`, ```ipa_mem32`, ```ipa_irq`, and ```ipa_drq` members of ```ipa` are updated to reflect the allocated and mapped resources. isapnp_config(``) returns zero on success and non-zero on error.

isapnp_unconfig(```iot``, memt``, ipa`)
  Free the resources allocated by isapnp_config(``).

### AUTOCONFIGURATION

During autoconfiguration, an ISAPNP driver will receive a pointer to ```struct` `isapnp_attach_args` describing the device attached to the ISAPNP bus. Drivers match the device using ispnp_devmatch(``).

During the driver attach step, driver should initially allocate and map resources using isapnp_config(``). The I/O (memory) bus-space resources can be accessed using the bus-space tag ```ipa_iot` (```ipa_memt`) and the bus-space handle ```ipa_io[0].h` (```ipa_mem[0].h`) members of ```ipa`.

Interrupts should be established using isa_intr_establish(``) isa(9) (see) with the IRQ specified by the ```ipa_irq[0].num` member of ```ipa`. Similarly, the standard isa(9) DMA interface should be used with the ```ipa_drq[0].num` member of ```ipa`.

### DMA SUPPORT

Extensive DMA facilities are provided through the isa(9) DMA facilities.

### CODE REFERENCES

This section describes places within the NetBSD source tree where actual code implementing or using the machine-independent ISAPNP subsystem can be found. All pathnames are relative to ```/usr/src`.

The ISAPNP subsystem itself is implemented within the file ```sys/dev/isapnp/isapnp.c`. The database of the known devices exists within the file ```sys/dev/isapnp/isapnpdevs.c` and is generated automatically from the file ```sys/dev/isapnp/isapnpdevs`. New devices should be added to this file. The database can be regenerated using the Makefile ```sys/dev/isapnp/Makefile.isapnpdevs`.

### SEE ALSO

isa(4), isapnp(4), pnpbios(4), autoconf(9), bus_dma(9), bus_space(9), driver(9), isa(9)

### HISTORY

The machine-independent ISAPNP subsystem appear in NetBSD1.3.