PNP(3)                                                     PNP(3)

          pnp - Plug 'n' Play ISA and PCI Interfaces

          bind -a '#$' /dev
9          /dev/pci/
9          /dev/pnp/ctl
          This device provides a limited interface to the PCI bus and
          Plug 'n' Play ISA devices.

        PCI Interface
          PCI devices are addressed logically by a bus number, a
          device number on that bus, and a function number within the
          device.  The set of all such device functions may be enumer-
          ated by traversing the /dev/pci directory; the driver serves
          two files for each function.  These are a control file
          (`/dev/pci/') which may be read for a textual
          summary of the device function, and a `raw' file
          (`/dev/pci/') which may be used to read or
          write the raw contents of PCI configuration space.

          The first field of a PCI control file contains the class,
          sub-class and programming interface values for the device
          function, expressed as 2-digit hexadecimal values, and sepa-
          rated by periods.  The second field yields the vendor ID and
          device ID, each as 4-digit hex numbers, separated by a
          slash.  The third field is the associated interrupt line in
          decimal.  The remainder of the line enumerates any valid
          base address registers for the function, using two fields
          for each.  In the first field, the index of the register is
          followed by a colon, and then the value of the register
          itself.  The following field gives the associated size of
          the memory (or I/O space) that is mapped by the register.

        Plug 'n' Play
          Plug 'n' Play ISA devices are discovered by sending a fixed
          `unlock' sequence over an I/O port, and then reading back
          data from another port.  An arbitration algorithm is used to
          separate out the individual cards and enumerate them in
          turn.  Each card is assigned a unique number, called a CSN,
          in the range 1-255 as a result of enumeration.  Cards also
          have a fixed 64 bit identification number, set by the manu-
          facturer, which is used by the arbitration algorithm to

9     Page 1                       Plan 9             (printed 7/23/24)

     PNP(3)                                                     PNP(3)

          resolve conflicts.  The first 32 bits describe the type of
          the card, and the second 32 bits form a serial number for
          the particular instance of that card type.  When formatted
          textually, it appears as 3 upper-case letters (typically
          representing the manufacturer), followed by 4 hex digits,
          then a period, then 8 hex digits.  The substring before the
          period is the card type, and the substring after the period
          is the serial number.

          The enumeration algorithm needs to be enabled by specifying
          the port number to write the unlock sequence out on.  This
          can be configured to take place at boot time by adding a
          line like the following to plan9.ini:


          Here port should be chosen to not conflict with any existing
          devices.  It must be in the range 0x203-0x3ff.  Alterna-
          tively, one can use the following command:

               echo port 0x203 >/dev/pnp/ctl

          Note that a side-effect of PnP enumeration is to reset the
          configuration state of all such cards; any settings made by
          a Plug and Play BIOS will be lost.  Reading the file
          /dev/pnp/ctl returns one of the strings enabled port or

          For each enumerated card, two files are served in /dev/pnp.
          A control file (`/dev/pnp/csnnctl') may be read to determine
          the ID of the card, and a raw file (`/dev/pnp/csnnraw') may
          be read to obtain the configuration data associated with the
          card.  It is intended that the control file should take com-
          mands which set the various configurable resources of the
          card, but this has not been implemented yet.

          A mechanism is provided for configuring cards via
          plan9.ini(8). A line of the form pnpn=idstring ...  will
          cause the driver to look for the card named by idstring and,
          if found, assign it the CSN n. The intention is that any
          additional text after the idstring is interpreted as if it
          was written to the card's ctl file, but this is not yet

          To list all PCI functions:

               cat /dev/pci/*ctl

          To find just the PCI video card (class 3):

               grep '^03' /dev/pci/*ctl

     Page 2                       Plan 9             (printed 7/23/24)

     PNP(3)                                                     PNP(3)



          Access to the I/O and memory regions of a PCI device is not

          The ability to set a Plug 'n' Play card's configurable set-
          tings has not been implemented.

          There should be a user program for identifying and configur-
          ing Plug 'n' Play cards.

     Page 3                       Plan 9             (printed 7/23/24)