Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Dec 95 20:45 WET
From:      uhclem@nemesis.lonestar.org (Frank Durda IV)
To:        hackers@freebsd.org, hasty@rah.star-gate.com
Subject:   plug n play detection and initialization
Message-ID:  <m0tN9rG-000C1FC@nemesis.lonestar.org>

next in thread | raw e-mail | index | archive | help
[0]How does one detect and initialize a Plug N Play ISA card?

Terry has pointed to a manual that Microsoft put out that explains
some of the functioning of PnP, and Intel has a few documents as well.

In a nutshell, there a few I/O ports that all of the PnP boards
respond to when the host asks if anyone is out there.  So when
the PnP probe routine starts, he asks if there are any PnP boards present,
and all the PnP boards respond with their model # to a I/O read of the same
port, so the probe routine gets a wired-OR "yes" to that question.  At
least one bit will be on in that reply.  Then the probe code is able to
cause boards with board model IDs (assigned by Microsoft/Intel) lower 
than X to go "off-line".  It then looks to see if any boards are still
responding to the query.  If the answer was "0", then there are no boards
with IDs above X.  Now probe asks if there are any boards below "X".
If so, probe knows there are boards with a model numbers below X.  Probe
then asks for boards greater than X-(limit/4) to go off-line.  If repeats
the query.  By repeating this semi-binary search of IDs-in-range enough
times, the probing code will eventually identify all PnP boards present in
a given machine with a number of iterations that is much lower than what
2^64 would take.

The IDs are two 32-bit fields (hence 2^64) + 8 bit checksum.
The first 32 bits are a vendor identifier.  They never come out and say
it, but it appears to be assumed that different types of boards from the
same vendor could have different 32-bit vendor ids.  The idea of needing
32 bits just for unique manufacturers is a bit excessive.   

The lower 32 bits are a serial #, ethernet address, something that makes
this one board unique.  The vendor must never produce a second board that
has the same lower 32 bits unless the upper 32 bits are also different.
So you can have multiple boards of the same type in the machine and
the full 64 bits will still be unique.

The 32 bit groups can never be all zero.  This allows the wired-OR
to show non-zero bits during the initial binary search.

Once the system has identified all the board IDs present, it will
reactivate each board, one at a time (via the same I/O ports), and
find out what resources the given board needs, what interrupt
choices are available, etc.  A scan is made over all the boards to collect
this information.

This info is then combined with info from any ECU files on the
hard disk or wired into the MLB BIOS.  The ECU and BIOS PnP support
for hardware on the MLB is usually synthetic, and the peripherals don't
really do geniune PnP.  However by examining the BIOS info plus the ECU
info, the probe routines can cause the devices that are PnP to avoid
those devices the probe code cannot relocate.

Then the PnP devices are visited once more and given their I/O, DMA,
IRQ and Memory-map address assignments.   The devices will then appear at
those locations and remain there until the next reboot, although there
is nothing that says you can't move them around whenever you want.

There is a lot of oversimplification above, but you should get the general
idea.

Microsoft took over some of the primary printer status ports to do PnP,
on the logic that no boards decoded those addresses for the opposing
I/O cycles.  I found a genuine IBM printer board that did decode writes of
the status port during the early PnP proposal review period, but MS said
"tough".  So they do a write to the printer status port for setting
addresses, plus that use that address + 0x800, and a third I/O port for
reading that can be located anywhere between 0x200 and 0x3ff.


					Frank Durda IV
					uhclem@nemesis.lonestar.org
					(C) 1995, ask before reprinting




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?m0tN9rG-000C1FC>