mirror of https://github.com/tLDP/LDP
1423 lines
76 KiB
Plaintext
1423 lines
76 KiB
Plaintext
<!doctype linuxdoc system>
|
|
<article>
|
|
<title> The Linux Plug-and-Play-HOWTO </title>
|
|
<author>David S.Lawyer
|
|
<tt><url url="mailto:dave@lafn.org"></tt>
|
|
|
|
<date> v0.12, June 2000
|
|
|
|
<!--
|
|
Change log:
|
|
v0.12 scanpci, workaround for Dos zeroing PCI IRQs.
|
|
v0.11 May 2000 scanport utility, many typos fixed, setpci hard to use
|
|
v0.10 2 March 2000 typo: /bus/pnp/devices, lspci+, book "Programming
|
|
..."
|
|
v0.09 /proc/bus/pci/devices too cryptic,
|
|
v0.08 my new email
|
|
v0.07 in Windows: remove devices
|
|
v0.06 Oct. 1999 in Windows: forced+, legacy into ESCD, pause key (bios)
|
|
v0.05 Aug. 1999 lspci, url for isapnp, tell the dev. driver, PCI still
|
|
needs PnP
|
|
v0.04 June 1999 alternatives to reinstall Windows?, add D.H. url
|
|
v0.03 May 1999 typos, reinstall Windows, clarity, removed D.H. url
|
|
v0.02 Apr. 1999 /proc/... doesn't show hdw config (except pci)
|
|
v0.01 Mar. 1999 serial PnP spec, PCI interrupts, no DMA on PCI,
|
|
dumpregs for pnpdump , Bus Mastering DMA, clarity rewrites, pciutils
|
|
kernel 2.2 /proc tree, IO range check, Windows may not update ESCD
|
|
v0.00 Nov. 1998
|
|
-->
|
|
<abstract>
|
|
Help with understanding and dealing with the complex Plug-and-Play
|
|
issue. How to get your Linux system to support Plug-and-Play. </abstract>
|
|
<toc>
|
|
|
|
<sect> Introduction
|
|
|
|
<sect1> Copyright, Trademarks, Disclaimer, & Credits
|
|
|
|
<sect2> Copyright
|
|
<p> Copyright (c) 1998-2000 by David S. Lawyer <url url="mailto:dave@lafn.org">
|
|
<!-- license.H begin -->
|
|
|
|
Please freely copy and distribute (sell or give away) this document
|
|
in any format. Forward any corrections and comments to the document
|
|
maintainer. You may create a derivative work and distribute it
|
|
provided that you:
|
|
|
|
<enum>
|
|
<item> Send your derivative work (in the most suitable format such as
|
|
sgml) to the LDP (Linux Documentation Project) or the like for
|
|
posting on the Internet. If not the LDP, then let the LDP know
|
|
where it is available. Except for a translation, send a copy to the
|
|
previous maintainer's url as shown in the latest version.
|
|
<item>License the derivative work in the spirit of this license or use
|
|
GPL. Include a copyright notice and at least a pointer to the
|
|
license used.
|
|
<item>Give due credit to previous authors and major contributors.
|
|
</enum>
|
|
|
|
If you're considering making a derived work other than a
|
|
translation, it's requested that you discuss your plans with the
|
|
current maintainer.
|
|
|
|
<sect2>Disclaimer
|
|
<p> While I haven't intentionally tried to mislead you, there are
|
|
likely a number of errors in this document. Please let me know about
|
|
them. Since this is free documentation, it should be obvious that I
|
|
cannot be held legally responsible for any errors.
|
|
|
|
<sect2>Trademarks.
|
|
<p> Any brand names (starts with a capital letter) should be assumed to
|
|
be a trademark). Such trademarks belong to their respective owners.
|
|
<!-- copyright.H end -->
|
|
|
|
|
|
<sect2> Credits
|
|
<p>
|
|
<itemize>
|
|
<item> Daniel Scott proofread this in March 2000 and found many
|
|
typos, etc.
|
|
<item> Pete Barrett gave a workaround to prevent Windows from zeroing
|
|
PCI IRQs.
|
|
</itemize>
|
|
|
|
<sect1> Future Plans; You Can Help
|
|
<p> Please let me know of any errors in facts, opinions, logic,
|
|
spelling, grammar, clarity, links, etc. But first, if the date is
|
|
over a month old, check to see that you have the latest version.
|
|
Please send me any info that you think belongs in this document.
|
|
|
|
I haven't studied in detail either isapnptools or David Howells'
|
|
patches to the kernel (but I plan to). Nor do I fully understand how
|
|
PnP is configured by the BIOS (it depends on which BIOS) nor how
|
|
Windows9x updates the ESCD. Thus this HOWTO is still incomplete and
|
|
may be inaccurate (let me know where I'm wrong). In this HOWTO I've
|
|
sometimes used ?? to indicate that I don't really know the answer.
|
|
|
|
<sect1> New Versions of this HOWTO
|
|
<p> New versions of the Plug-and-Play-HOWTO should appear every
|
|
month or so and will be available to browse and/or download at LDP
|
|
mirror sites. For a list of mirror sites see: <url
|
|
url="http://linuxdoc.org/mirrors.html">. Various formats are
|
|
available. If you only want to quickly check the date of the latest
|
|
version look at: <url
|
|
url="http://linuxdoc.org/HOWTO/Plug-and-Play-HOWTO.html">.
|
|
The version you are now reading is: v0.12, June 2000 . New is this version are:
|
|
scanpci, workaround for Dos zeroing PCI IRQs. .
|
|
|
|
<sect> What PnP Should Do: Allocate "Bus-Resources"
|
|
<sect1> What is Plug-and-Play (PnP)?
|
|
<p> Oversimplified, Plug-and-Play automatically tells the software
|
|
(device drivers) where to find various pieces of hardware (devices)
|
|
such as modems, network cards, sound cards, etc. Plug-and-Play's task
|
|
is to match up physical devices with the software (device drivers)
|
|
that operates them and to establish channels of communication between
|
|
each device and its driver. In order to achieve this, PnP allocates
|
|
the following "bus-resources" to both drivers and hardware: I/O
|
|
addresses, IRQs, DMA channels (ISA bus only), and memory regions.
|
|
These 4 things are sometimes called 1st order resources. If you don't
|
|
understand what these 4 bus-resources are, read the following
|
|
subsections of this HOWTO: I/O Addresses, IRQs, DMA Channels, Memory
|
|
Regions. An article in Linux Gazette about 3 of these bus-resources
|
|
is <htmlurl url="http://www.linuxgazette.com/issue38/blanchard.html"
|
|
name="Introduction to IRQs, DMAs and Base Addresses">. Once these
|
|
bus-resources have been assigned (and if the correct driver is
|
|
installed), the names for such devices in the /dev directory are ready
|
|
to use.
|
|
|
|
This PnP assignment of bus-resources is sometimes called
|
|
"configuring" but it is only a low level type of configuring. Even
|
|
with PnP fully utilized, much configuring of devices is done by other
|
|
than PnP. For example, for modem configuration an "init string" is
|
|
sent to the modem over the I/0 address "channel". This "init string"
|
|
has nothing to do with PnP although the "channel" used to send it to
|
|
the modem was allocated by PnP. Setting the speed (and many other
|
|
parameters) of a serial port is done by sending messages to the device
|
|
driver from programs run by the user (often automatically boot-time).
|
|
This configuring also has nothing to do with PnP. Thus when talking
|
|
about PnP "configuring" means only a certain type of configuring.
|
|
While other documentation (such a for MS Windows) simply calls
|
|
bus-resources "resources", I have coined the term "bus-resources" so
|
|
as to distinguish it from the multitude of other kinds of resources.
|
|
|
|
<sect1> How a Computer Finds Devices (and conversely)
|
|
<p> A computer consists of a CPU/processor to do the computing and
|
|
memory to store programs and data. In addition, there are a number of
|
|
devices such as various kinds of disk-drives, a video card, a
|
|
keyboard, network cards, modem cards, sound cards, serial and parallel
|
|
ports, etc. There is also a power supply to provide electric energy,
|
|
various buses on a motherboard to connect the devices to the CPU,
|
|
and a case to put all this into.
|
|
|
|
In olden days most all devices had their own plug-in cards (printed
|
|
circuit boards). Today, in addition to plug-in cards, many "devices"
|
|
are small chips permanently mounted on the "motherboard". Cards which
|
|
plug into the motherboard may contain more than one device. Memory
|
|
chips are also sometimes considered to be devices but are not
|
|
plug-and-play in the sense used in this HOWTO.
|
|
|
|
For the computer system to work right, each device must be under the
|
|
control of its "device driver". This is software which is a part of
|
|
the operating system (perhaps loaded as a module) and runs on the CPU.
|
|
Device drivers are associated with "special files" in the /dev
|
|
directory although they are not really files. They have names such as
|
|
hda1 (first partition on hard drive a), ttyS0 (the first serial port),
|
|
eth1 (the second ethernet card), etc. To make matters more
|
|
complicated, the particular device driver selected, say for eth1, will
|
|
depend on the type of ethernet card you have. Thus eth1 can't just be
|
|
assigned to any ethernet driver. It must be assigned to a certain
|
|
driver that will work for the type of ethernet card you have
|
|
installed. To control a device, the CPU (under the control of the
|
|
device driver) sends commands (and data) to and reads info from the
|
|
various devices. In order to do this each device driver must know the
|
|
address of the device it controls. Knowing such an address is
|
|
equivalent to setting up a communication channel, even though the
|
|
physical "channel" is actually the data bus inside the PC which is
|
|
shared with almost everything else.
|
|
|
|
The communication channel is actually a little more complex than
|
|
described above. An "address" is actually a range of addresses and
|
|
there is a reverse part of the channel (known as interrupts) which
|
|
allows devices to send an urgent "help" request to their device
|
|
driver.
|
|
|
|
<sect1> I/O Addresses, etc.
|
|
<p> PC's have 3 address spaces: I/O, main memory, and configuration
|
|
(only on the PCI bus). All of these 3 types of addresses share the
|
|
same address bus inside the PC. But the voltage on certain dedicated
|
|
wires on the PC's bus tells which "space" an address is in: I/O, main
|
|
memory, or configuration. See <ref id="addresses_" name="Addresses">
|
|
for more details. Devices were originally located in I/O address space
|
|
although today they may use space in main memory. An I/0 address is
|
|
sometimes just called "I/O", "IO", "i/o" or "io". The term "I/O port"
|
|
also used. There are two main steps to allocate the I/O addresses (or
|
|
other bus-resources such as interrupts):
|
|
|
|
<enum>
|
|
<item> Set the I/O address, etc. on the card (in one of its registers)
|
|
<item> Let its device driver know what this I/O address, etc. is
|
|
</enum>
|
|
|
|
The two step process above is something like the two part problem of
|
|
finding someone's house number on a street. You must obtain (and
|
|
write down) the house number and someone must install a number on the
|
|
front of the house so that it may be found. In computers, the device
|
|
driver must obtain the address and the device hardware must get
|
|
the same address set in one of its registers. Both of these must be done,
|
|
but some people make the mistake of doing only one of these and then
|
|
wonder why the computer can't find the device. For example, they will
|
|
use "setserial" to assign an address to a serial port without
|
|
realizing that this only tells the driver an address. It doesn't set
|
|
the address in the serial port hardware itself. If the serial port
|
|
actually had a different address (or none at all) and you told
|
|
setserial wrong, then you're in trouble.
|
|
|
|
Another obvious requirement is that before the device driver can use
|
|
an address it must be first set on the card. Since device drivers
|
|
often start up soon after you start the computer, they sometimes try
|
|
to access a card (to see if it's there, etc.) before the address has
|
|
been set in the card by a PnP configuration program. Then you see an
|
|
error message that they can't find the card even though it's there
|
|
(but doesn't yet have an address).
|
|
|
|
What was said in the last 2 paragraphs regarding I/O addresses applies
|
|
with equal force to other bus-resources: <ref id="interrupt_over"
|
|
name="IRQs --Overview">, <ref id="dma_" name="DMA Channels">, and <ref
|
|
id="mem_" name="Memory Regions">. What these are will be explained
|
|
in the next 3 sections.
|
|
|
|
<sect1> IRQs --Overview <label id="interrupt_over">
|
|
<p> After reading this you may read <ref id="interrupt_detail" name=
|
|
"Interrupts --Details"> for some more details. The following is
|
|
intentionally oversimplified: Besides the address, there is also an
|
|
interrupt number to deal with (such as IRQ 5). It's called an IRQ
|
|
(Interrupt ReQuest) number. We already mentioned above that the
|
|
device driver must know the address of a card in order to be able to
|
|
communicate with it. But what about communication in the opposite
|
|
direction? Suppose the device needs to tell its device driver
|
|
something immediately? For example, the device may have just received
|
|
a lot of bytes destined for main memory and the device needs to call
|
|
its driver to fetch these bytes at once and transfer them from the
|
|
device's nearly full buffer into main memory. Another example is to
|
|
signal the driver that the device has finished sending a bunch of
|
|
bytes and is now waiting for some more bytes to send.
|
|
|
|
How should the device signal its driver? It can't use the main data
|
|
bus since it's likely already in use. Instead it puts a voltage on a
|
|
dedicated interrupt wire (part of the bus) which is often reserved for
|
|
that device alone. This signal is called an interrupt. There are the
|
|
equivalent of 16 such wires in a PC and each wire leads (indirectly)
|
|
to a certain device driver. Each wire has a unique IRQ (Interrupt
|
|
ReQuest) number. The device must put its interrupt on the correct
|
|
wire and the device driver must listen for the interrupt on the
|
|
correct wire. Which wire the device uses is determined by the IRQ
|
|
number stored in the device. This same IRQ number must be known to
|
|
the device driver so that the device driver knows which IRQ line to
|
|
listen to.
|
|
|
|
Once the device driver gets the interrupt from the device it must find
|
|
out why the interrupt was issued and take appropriate action to
|
|
service the interrupt. On the ISA bus each device needs its own
|
|
unique IRQ number. For the PCI bus and other special cases the
|
|
sharing of IRQs is allowed.
|
|
|
|
<sect1> DMA Channels <label id="dma_">
|
|
<p> DMA channels are only for the ISA bus. DMA stands for "Direct Memory
|
|
Access". This is where a device is allowed to take over the main
|
|
computer bus from the CPU and transfer bytes directly to main memory.
|
|
Normally the CPU would make such a transfer in a two step process:
|
|
<enum>
|
|
<item>reading from the I/O memory space of the device and putting these
|
|
bytes into the CPU itself
|
|
<item> writing these bytes from the CPU to main memory
|
|
</enum>
|
|
<enum>
|
|
<item> With DMA it's usually a one step process of sending the bytes
|
|
directly from the device to memory
|
|
</enum>
|
|
The device must have such capabilities built into its hardware and
|
|
thus not all devices can do DMA. While DMA is going on the CPU can't
|
|
do too much since the main bus is being used by the DMA transfer.
|
|
|
|
The PCI bus doesn't really have any DMA but instead it has something
|
|
even better: bus mastering. It works something like DMA and is
|
|
sometimes called DMA (for example, hard disk drives that call
|
|
themselves "UltraDMA"). It allows devices to temporarily become bus
|
|
masters and to transfer bytes almost like the bus master was the CPU.
|
|
It doesn't use any channel numbers since the organization of the PCI
|
|
bus is such that the PCI hardware knows which device is currently the
|
|
bus master and which device is requesting to become a bus master.
|
|
Thus there is no allocation of DMA channels for the PCI bus.
|
|
|
|
When a device on the ISA bus wants to do DMA it issues a DMA-request
|
|
using dedicated DMA request wires much like an interrupt request. DMA
|
|
actually could have been handled by using interrupts but this would
|
|
introduce some delays so it's faster to do it by having a special type
|
|
of interrupt known as a DMA-request. Like interrupts, DMA-requests
|
|
are numbered so as to identify which device is making the request.
|
|
This number is called a DMA-channel. Since DMA transfers all use the
|
|
main bus (and only one can run at a time) they all actually use the
|
|
same channel but the "DMA channel" number serves to identify who is
|
|
using the "channel". Hardware registers exist on the motherboard
|
|
which store the current status of each "channel". Thus in order to
|
|
issue a DMA-request, the device must know its DMA-channel number which
|
|
must be stored in a register on the physical device.
|
|
|
|
<sect1> Memory Ranges <label id="mem_">
|
|
<p> Some devices are assigned address space in main memory. It's
|
|
often "shared memory" or "memory-mapped I/O". Sometimes it's ROM
|
|
memory on the device. When discussing bus-resources it's often just
|
|
called "memory". Such a device might also use I/O address space.
|
|
|
|
When you plug in such a card, you are in effect also plugging in a
|
|
memory module for main memory. This memory can either be ROM (Read
|
|
Only Memory) or shared memory. Shared memory is shared between the
|
|
device and the CPU (running the device driver). This memory can serve
|
|
as a means of direct data "transfer" between the device and main
|
|
memory. It's not really a transfer since the device puts data into
|
|
its own memory on its card which also happens to be in main memory.
|
|
Both the card and the device driver need to know where it is. The
|
|
memory address is likely to be very high so that it does not conflict
|
|
with the lower addresses of the memory chips in your computer.
|
|
|
|
ROM is different. It is likely a program (perhaps a device driver)
|
|
which will be used with the device. Hopefully, it may work with Linux
|
|
and not just Windows ?? It may need to be shadowed which means that it
|
|
is copied to your main memory chips in order to run faster. Once it's
|
|
shadowed it's no longer "read only".
|
|
|
|
<sect1> "Resources" to both Device and Driver
|
|
<p> Thus device drivers must be "attached" in some way to the hardware
|
|
they control. This is done by supplying bus-resources (I/O, Memory,
|
|
IRQ's, DMA's) to both the physical device and the device driver
|
|
software. For example, a serial port uses only 2 (out of 4 possible)
|
|
resources: an IRQ and an I/O address. Both of these values must be
|
|
supplied to the device driver and the physical device. The driver
|
|
(and its device) is also given a name in the /dev directory (such as
|
|
ttyS1). The address and IRQ number is stored by the physical device
|
|
in registers on the card (or in a chip on the motherboard). For the
|
|
case of jumpers, this info is always stored in the device hardware (on
|
|
the card, etc.). But for the case of PnP, the register data is
|
|
usually lost when the PC is powered down (turned off) so that the
|
|
resource data must be supplied to each device anew each time the PC is
|
|
powered on.
|
|
|
|
<sect1> The Problem
|
|
<p> The architecture of the PC provides only a limited number of
|
|
IRQ's, DMA channels, I/O address, and memory regions. If there were
|
|
only several devices and they all had standardized bus-resource (such
|
|
as unique I/O addresses and IRQ numbers) there would be no problem of
|
|
attaching device drivers to devices. Each device would have a fixed
|
|
resources which would not conflict with any other device on your
|
|
computer. No two devices would have the same addresses, there would
|
|
be no IRQ conflicts, etc. Each driver would be programmed with the
|
|
unique addresses, IRQ, etc. hard-coded into the program. Life would
|
|
be simple.
|
|
|
|
But it's not. Not only are there so many different devices today that
|
|
conflicts are frequent, but one sometimes needs to have more than one of
|
|
the same type of device. For example, one may want to have a few
|
|
different disk-drives, a few serial ports, etc. For these reasons
|
|
devices need to have some flexibility so that they can be set to
|
|
whatever address, IRQ, etc. is needed to avoid conflicts. But some
|
|
IRQ's and addresses are pretty standard such as the ones for the clock
|
|
and keyboard. These don't need such flexibility.
|
|
|
|
Besides the problem of conflicting allocation of bus-resources, there
|
|
is a problem of making a mistake in telling the device driver what the
|
|
bus-resources are. For example, suppose that you enter IRQ 4 in a
|
|
configuration file when the device is actually set at IRQ 5. This is
|
|
another type of bus-resource allocation error.
|
|
|
|
The allocation of bus-resources, if done correctly, establishes
|
|
channels of communication between physical hardware and their device
|
|
drivers. For example, if a certain I/O address range (resource) is
|
|
allocated to both a device driver and a piece of hardware, then this
|
|
has established a one-way communication channel between them. The
|
|
driver may send commands and info to the device. It's actually a
|
|
little more than one-way since the driver may get information from the
|
|
device by reading its registers. But the device can't initiate any
|
|
communication this way. To initiate communication the device needs an
|
|
IRQ in order to create a two-way communication channel where both the
|
|
driver and the device can initiate communication.
|
|
|
|
<sect1> PnP Finds Devices Plugged Into Serial Ports
|
|
<p> External devices that connect to the serial port via a cable (such
|
|
as external modems) can also be called Plug-and-Play. Since only the
|
|
serial port itself needs bus-resources (an IRQ and I/O address) there are
|
|
no bus-resources to allocate to such plug-in devices. Thus PnP is not
|
|
really needed for them. Even so, there is a PnP specification for
|
|
such external serial devices.
|
|
|
|
A PnP operating system will find such an external device and read its
|
|
model number, etc. Then it may be able to find a device driver for it
|
|
so that you don't have to tell an application program that you have a
|
|
certain device on say /dev/ttyS1. Since you should be able to
|
|
manually inform your application program (via a configuration file,
|
|
etc.) what serial port the device is on (and possibly what model
|
|
number it is) you should not really need this "serial port" feature of
|
|
PnP.
|
|
|
|
<sect> The Plug-and-Play (PnP) Solution
|
|
<sect1> Introduction to PnP
|
|
<p> The term Plug-and-Play (PnP) has various meanings. In the broad
|
|
sense it is just auto-configuration where one just plugs in a device
|
|
and it configures itself. In the sense used in this HOWTO, the
|
|
configuration is only that of configuring PnP bus-resources and letting
|
|
the device drivers know about it. In a more narrow sense it is just
|
|
setting bus-resources in the hardware devices. It may also mean the PnP
|
|
specifications which (among other things) specify how PnP resource
|
|
data is to be read and written to devices (often cards) on the ISA
|
|
bus. The standard PCI (and not PnP) specifications do the same for
|
|
the PCI bus.
|
|
|
|
PnP matches up devices with their device drivers and specifies their
|
|
communication channels. On the ISA bus before Plug-and-Play the
|
|
bus-resources were set in hardware devices by jumpers. Software drivers
|
|
were assigned bus-resources by configuration files (or the like) or by
|
|
probing the for the device at addresses where it's expected to reside.
|
|
The PCI bus was PnP-like from the beginning so it was trivial to
|
|
implement PnP for this bus. Since the PCI bus specifications don't
|
|
use the term PnP it's not clear whether or not the PCI bus should be
|
|
called PnP (but it supports in hardware what today is called PnP).
|
|
|
|
<sect1> How It Works (simplified)
|
|
<p> Here's an oversimplified view of how PnP works. The PnP
|
|
configuration program (perhaps a program in the BIOS) finds all PnP
|
|
devices and asks each what bus-resources it needs. Then it checks what
|
|
bus-resources (IRQs, etc.) it has to give away. Of course if it has
|
|
reserved bus-resources used by non-PnP (legacy) devices (if it knows about
|
|
them) it doesn't give these away. Then it uses some criteria (not
|
|
specified by PnP specifications) to give out the bus-resources so that
|
|
there are no conflicts and so that all devices get what they need (if
|
|
possible). It then tells each physical device what bus-resources are
|
|
assigned to it and the devices set themselves up to use only the
|
|
assigned bus-resources. Then the device drivers somehow find out what
|
|
bus-resources their devices use and are thus able to communicate
|
|
effectively with the devices they control.
|
|
|
|
For example, suppose a card needs one interrupt (IRQ number) and 1 MB
|
|
of shared memory. The PnP program reads this request from the card.
|
|
It then assigns the card IRQ5 and 1 MB of memory addresses space,
|
|
starting at address 0xe9000000. It's not always this simple as the
|
|
card may specify that it can only use certain IRQ numbers (ISA only)
|
|
or that the 1 MB of memory must lie within a certain range of
|
|
addresses. The details are different for the PCI and ISA buses with
|
|
more complexity on the ISA bus.
|
|
|
|
There are some shortcuts that PnP software may use. One is to keep
|
|
track of how it assigned bus-resources at the last configuration (when the
|
|
computer was last used) and reuse this. Windows9x and PnP BIOSs do
|
|
this but standard Linux doesn't. Windows9x stores this info in its
|
|
"Registry" on the hard disk and a PnP BIOS stores it in non-volatile
|
|
memory in your PC (known as ESCD; see <ref id="escd_" name="The BIOS's
|
|
ESCD Database">).
|
|
|
|
Under Linux it's each device for itself and there is no centralized
|
|
non-volatile registry of resource assignments. Some device drivers
|
|
store the last configuration they used and use it next time the
|
|
computer is powered on. They implicitly assume that the rest of the
|
|
hardware will not need to use its bus-resources.
|
|
|
|
If the device hardware remembered their previous configuration, then
|
|
there wouldn't be any hardware to configure at the next boot-time, but
|
|
they seem to forget their configuration when the power is turned off.
|
|
Some devices contain a default configuration (but not necessarily the
|
|
last one used). Thus a PnP configuration program needs to be run each
|
|
time the PC is powered on. Also, if a new device has been added, then
|
|
it too needs to be configured. Allocating bus-resources to this new
|
|
device might involve taking some bus-resources away from an existing
|
|
device and assigning the existing device alternative bus-resources that it
|
|
can use instead.
|
|
|
|
<sect1> Starting Up the PC
|
|
<p> When the PC is first turned on the BIOS chip runs its program to
|
|
get the computer started (the first step is to check out the
|
|
hardware). If the operating system is stored on the hard-drive (as it
|
|
normally is) then the BIOS must know about the hard-drive. If the
|
|
hard-drive is PnP then the BIOS may use PnP methods to find it. Also,
|
|
in order to permit the user to manually configure the BIOS's CMOS and
|
|
respond to error messages when the computer starts up, a screen (video
|
|
card) and keyboard are also required. Thus the BIOS must
|
|
PnP-configure these devices on its own.
|
|
|
|
Once the BIOS has identified the hard-drive, the video card, and the
|
|
keyboard it is ready to start booting (loading the operating system
|
|
into memory from the hard-disk). If you've told the BIOS that you a
|
|
have a PnP operating system (PnP OS), it should start booting the PC
|
|
as above and let the operating system finish the PnP configuring.
|
|
Otherwise, a PnP-BIOS will (prior to booting) likely try to do the
|
|
rest of the PnP configuring of devices (but not their drivers).
|
|
|
|
<sect1> Buses
|
|
<p> ISA is the old bus of the old IBM PC's while PCI is a newer and
|
|
faster bus from Intel. The PCI bus was designed for what is today
|
|
called PnP. It makes it easy (as compared to the ISA bus) to find out
|
|
how PnP bus-resources have been assigned to hardware devices. To see
|
|
what has happened use the commands <tt/lspci/ or scanpci (Xwindows)
|
|
and/or look at <tt>/proc/pci</tt> or possibly <tt>/proc/bus/pci</tt>.
|
|
The boot-up messages on your display are useful (use shift-PageUp to
|
|
back up). See <ref id="boot_time_msgs" name="Boot-time Messages">
|
|
|
|
For the ISA bus there is a real problem with implementing PnP since no
|
|
one had PnP in mind when the ISA bus was designed and there are almost
|
|
no I/O addresses available for PnP to use for sending configuration info
|
|
to physical device. As a result, the way PnP was shoehorned onto the
|
|
ISA bus is very complicated. A whole book has been written about it.
|
|
See <ref id="pnp_book" name="PnP Book">. Among other things, it
|
|
requires that each PnP device be assigned a temporary "handle" by the
|
|
PnP program so that one may address it for PnP configuring. Assigning
|
|
these "handles" is call "isolation". See <ref id="isolation_"
|
|
name="Isolation"> for the complex details.
|
|
|
|
Eventually, the ISA bus should become extinct. When it does, PnP will
|
|
be easier since it will be easy to find out how the BIOS has
|
|
configured the hardware. There will still be the need to match up
|
|
device drivers with devices and also a need to configure devices that
|
|
are added when the PC is up and running. These needs would be
|
|
satisfied if Linux was a PnP operating system.
|
|
|
|
<sect1> Linux Needs to Cope Better with PnP <label id="linux_needs_PnP">
|
|
<p> PnP (for the ISA bus) was invented by Compaq, Intel, and Phoenix.
|
|
Microsoft has been a leading promoter of it. Linux would have been
|
|
better off if PnP had never been "invented". Eventually the ISA bus
|
|
will have become extinct and the PnP-like PCI bus will prevail so that
|
|
we will have in effect gotten an easy-to-implement PnP. But like it
|
|
or not, most all new ISA hardware today is PnP and Linux has no choice
|
|
but to deal effectively with PnP. But standard Linux (as of early
|
|
1999) makes dealing with PnP complicated (especially on the ISA bus)
|
|
while the purpose of PnP was to make it simple.
|
|
|
|
In a sense, Linux is already somewhat PnP for the PCI bus. When the
|
|
PC starts up you may note from the messages on the screen that some
|
|
Linux device drivers often find their hardware devices (and the
|
|
bus-resources the BIOS has assigned them). But there are situations
|
|
that a PnP operating system could handle better:
|
|
<itemize>
|
|
<item>A shortage of bus-resources
|
|
<item>More than one driver for a physical device
|
|
<item>An activated driver which can't find its physical device
|
|
<item>Hot installation of a device (docking, etc.)
|
|
</itemize>
|
|
|
|
Linux users should not need to delve into the details of PnP to
|
|
configure ISA PnP devices as they now need to. One solution would be
|
|
a standardized version of the Linux kernel that supports Plug-and-Play
|
|
on the ISA, PCI, and other buses. A patch to the kernel has been written
|
|
although most drivers don't support it. It's not part of standard
|
|
Linux. See <ref id="patch_kernel" name="Patch Kernel">.
|
|
|
|
<sect> Configuring a PnP BIOS <label id="conf_pnp_bios">
|
|
<p> When the computer is first turned on, the BIOS runs before the
|
|
operating system is loaded. Newer BIOSs are PnP and will configure
|
|
some or all of the PnP devices. For most PnP BIOSs there is no way to
|
|
disable PnP so you have to live with it. Here are some of the choices
|
|
which may exist in your BIOS's CMOS menu:
|
|
|
|
<itemize>
|
|
<item> <ref id="bios_pnp_os" name="Do you have a PnP operating
|
|
system?">
|
|
<item> <ref id="bios_resources" name="How are bus-resources to be controlled?">
|
|
<item> <ref id="bios_reset" name="Reset the configuration?">
|
|
</itemize>
|
|
|
|
<sect1> Do you have a PnP operating system? <label id="bios_pnp_os">
|
|
<p> If you say yes, then the PnP BIOS will PnP-configure the
|
|
hard-drive, video card, and keyboard to make the system bootable. But
|
|
it will leave it up to the operating system to finish the
|
|
configuration job. It may do an <ref id="isolation_"
|
|
name="Isolation"> on the ISA bus leaving the devices disabled but
|
|
ready to be configured by the operating system. For Linux you should
|
|
probably tell it that you don't have a PnP operating system. If you
|
|
don't do this, the BIOS might leave the ISA devices it hasn't
|
|
configured in a disabled state ?? Also PCI devices might not get
|
|
configured ??
|
|
|
|
If you tell the BIOS you don't have a PnP OS, then the BIOS will do
|
|
the configuring itself. Unless you have added new PnP devices, it
|
|
should use the configuration which it has stored in its non-volatile
|
|
memory (ESCD). See <ref id="escd_" name="The BIOS's ESCD Database">.
|
|
If the last session on your computer was with Linux, then there should
|
|
be no change in configuration. See <ref id="bios_conf" name= "BIOS
|
|
Configures PnP">. But if the last session was with Windows9x (which
|
|
is PnP) then Windows could have modified the ESCD. It supposedly does
|
|
this only if you "force" a configuration or install a legacy device.
|
|
See <ref id="W9x_ESCD" name="Using Windows to set ESCD">. If you are
|
|
using the isapnp or PCI Utilities program(s) to do configuring, they
|
|
will run after the BIOS runs and change things the way you told them
|
|
to.
|
|
|
|
<sect2> Interoperability with Windows9x
|
|
<p> If you are running both Linux and Windows on the same PC, how do
|
|
you answer the BIOS's question: Do you have a PnP OS? Normally (and
|
|
truthfully) you would say no for standard Linux and yes for Windows9x.
|
|
But it's a lot of bother to have to set up the BIOS's CMOS menu
|
|
manually each time you want to switch OSs. One solution is set the
|
|
CMOS for no PnP OS, including when you start Windows. One might
|
|
expect that Windows would be able to handle this situation where it is
|
|
presented hardware that has been fully configured by the BIOS. In
|
|
addition, one might expect that even if Windows didn't realize that
|
|
the hardware was already configured, it would redo this configuration
|
|
and then work OK. But it doesn't seem to work this way. It seems
|
|
that Windows may just tell its device drivers what has been stored in
|
|
the Windows' Registry. But the actual hardware configuration (done by
|
|
the BIOS) is what was stored in the ESCD and may not be the same as
|
|
the Registry => trouble.
|
|
|
|
One way to try to get the Registry and the ESCD the same is to install
|
|
(or reinstall) Windows when the BIOS is set for "not a PnP OS". This
|
|
should present Windows with hardware configured by the BIOS. If this
|
|
configuration is without conflicts, Windows will hopefully leave it
|
|
alone and save it in it's Registry. Then the ESCD and the registry
|
|
are in sync. If this works for you (and this is the latest version of
|
|
this HOWTO), let me know as I only have one report of this working out
|
|
OK.
|
|
|
|
Another method is to remove devices that are causing problems in
|
|
Windows by clicking on "remove" in the Device Manager. Then reboot with
|
|
"Not a PnP OS" (set it in the CMOS as you start to boot). Windows
|
|
will then reinstall the devices, hopefully using the bus-resource
|
|
settings configured by the BIOS. Be warned that Windows will likely
|
|
ask you to insert the Window installation CD since it sometimes can't
|
|
find the driver files (and the like) even thought they are still
|
|
there. As a test I "removed" the NIC card which had a Novell
|
|
compatible drivers. Upon rebooting, Windows reinstalled it with
|
|
Microsoft networking instead of Novell. This meant that the Novell
|
|
Client needed to be reinstalled. Let me know about your problems with
|
|
this method (only if this is the latest version of this HOWTO).
|
|
|
|
<sect1> How are bus-resources to be controlled? <label id="bios_resources">
|
|
<p> This may involve just deciding how to allocate IRQ and DMA
|
|
bus-resources. If set to "auto", the BIOS will do the allocation. If set
|
|
to manual, you manually reserve some IRQ's for use on "legacy"
|
|
(non-pnp) cards. The BIOS may or may not otherwise know about your
|
|
legacy cards. The BIOS will only know about your legacy cards if you
|
|
ran ICU (or the like) under Windows to tell the BIOS about them. If
|
|
the BIOS knows about them, then try using "auto". If it doesn't know
|
|
about them then manually reserve the IRQ's needed for the legacy ISA
|
|
cards and let the rest be for the BIOS PnP to allocate.
|
|
|
|
<sect1> Reset the configuration? <label id="bios_reset">
|
|
<p> This will erase the BIOSs ESCD data-base of how your PnP devices
|
|
should be configured as well as the list of how legacy (non-PnP)
|
|
devices are configured. Never do this unless you are convinced that
|
|
this data-base is wrong and needs to be remade. It was stated
|
|
somewhere that you should do this only if you can't get your computer
|
|
to boot. If the BIOS loses the data on legacy devices, then you'll
|
|
need to run ICA again under DOS/Windows to reestablish this data.
|
|
|
|
<sect> How to Deal with PnP Cards
|
|
<sect1> Introduction to Dealing with PnP Cards
|
|
<p> Today most all new internal boards (cards) are Plug-and-Play
|
|
(PnP). Although some software exists in Linux to handle PnP, it is
|
|
not always easy to use. There are 6 different methods listed below to
|
|
cope with PnP (but some may not be feasible in your situation). Which
|
|
one(s) you should use depends on your goals. What may be most
|
|
expedient to do now may not be the easiest and best in the long run.
|
|
A seemingly simple way is to do nothing and just let a PnP-BIOS
|
|
configure it but then you may need to do some exploring to to find out
|
|
what the BIOS has done. A comparison of these methods needs to be
|
|
written by someone who has tried them all. You may need to use more
|
|
than one method to do the job.
|
|
|
|
<itemize>
|
|
<item> <ref id="disable_pnp" name="Disable PnP"> by jumpers or
|
|
DOS/Windows software (but many cards can't do this)
|
|
<item> <ref id="bios_conf" name= "BIOS Configures PnP"> (For the PCI bus
|
|
you only need a PCI BIOS, otherwise you need a PnP BIOS)
|
|
<item> <ref id="isapnp_" name="Isapnp"> is a program you can always
|
|
use to configure PnP devices on the ISA bus only
|
|
<item> <ref id="pciutils_" name="PCI Utilities"> is for configuring the PCI
|
|
bus
|
|
<item> <ref id="windows_conf" name="Windows Configures"> and then you
|
|
boot Linux from within Windows/DOS. Use as a last resort
|
|
<item> <ref id="patch_kernel" name="Patch Kernel"> to transform
|
|
Linux into a PnP operating system
|
|
<item> <ref id="dev_d_conf" name="Device Driver Configures"> but few do
|
|
</itemize>
|
|
|
|
Any of the above will set the bus-resources in the hardware. But only the
|
|
last two should tell device driver what it's done. Only the last one
|
|
definitely tells the driver (since it is the driver). How the driver
|
|
gets informed depends on the driver and you may need to do something to
|
|
inform it. See <ref id="tell_driver_config" name="Tell the Driver the
|
|
Configuration">
|
|
|
|
<sect1> Disable PnP ? <label id="disable_pnp">
|
|
<p> Many devices are PnP only with no option for disabling PnP. But
|
|
for some, you may be able to disable PnP by jumpers or by running a
|
|
Windows program that comes with the device (jumperless configuration).
|
|
This will avoid the often complicated task of configuring PnP. Don't
|
|
forget to tell the BIOS that these bus-resources are reserved. There are
|
|
also some reasons why you might not want to disable PnP:
|
|
|
|
<enum>
|
|
<item> If you have MS Windows on the same machine, then you may want
|
|
to allow PnP to configure devices differently under Windows from what
|
|
it does under Linux.
|
|
<item> The range of selection for IRQ numbers (or port addresses) etc.
|
|
may be quite limited unless you use PnP.
|
|
<item> You might have a Linux device driver that uses PnP methods to
|
|
search for the device it controls.
|
|
<item> If you need to change the configuration in the future, it may
|
|
be easier to do this if it's PnP (no setting of jumpers or running a
|
|
Dos/Windows program).
|
|
<item> You may have (or will have) other PnP devices that need
|
|
configuring so that you'll need to provide for (or learn about) PnP
|
|
anyway.
|
|
</enum>
|
|
Once configured as non-PnP devices, they can't be configured by PnP
|
|
software or the BIOS (until you move jumpers and/or use the
|
|
Dos/Windows configuration software again).
|
|
|
|
<sect1> BIOS Configures PnP <label id="bios_conf">
|
|
<sect2> Intro to Using the BIOS to Configure PnP
|
|
<p> If you have a PnP BIOS, it can configure the hardware. This means
|
|
that your BIOS reads the resource requirements of all devices and
|
|
configures them (allocates bus-resources to them). It is a substitute
|
|
for a PnP OS except that the BIOS doesn't match up the drivers with
|
|
their devices nor tell the drivers how it has done the configuring.
|
|
It should normally use the configuration it has stored in its
|
|
non-volatile memory (ESCD). If it finds a new device or if there's a
|
|
conflict, the BIOS should make the necessary changes to the
|
|
configuration and will not use exactly what was in the ESCD.
|
|
|
|
Your BIOS must support such configuring but there have been cases
|
|
where it doesn't do it correctly or completely. An advantage of using
|
|
the BIOS is that it's simple since in most cases there is nothing to
|
|
set up (except to tell the BIOS's CMOS menu it's not a PnP OS). While
|
|
some device drivers may be able to automatically detect what the
|
|
BIOS has done, in some cases you'll need to determine it (not always
|
|
easy). See <ref id="current_config" name="What Is My Current
|
|
Configuration?"> Another possible advantage is that the BIOS does its
|
|
work before Linux starts so that all the bus-resources are ready to be
|
|
used (and found) by the device drivers that start up later.
|
|
|
|
According to MS it's only optional (not required) that a PnP BIOS be
|
|
able to PnP-configure the devices (without help from MS Windows). But
|
|
it seems that most of the ones made after 1996 ?? or so can do it. We
|
|
should send them thank-you notes if they do it right. They configure
|
|
both the PCI and ISA buses, but it has been claimed that some older
|
|
BIOSs can only do the PCI. To try to find out more about your BIOS,
|
|
look on the Web. Please don't ask me as I don't have data on this.
|
|
The details of the BIOS that you would like to know about may be hard
|
|
to find (or not available). Some BIOSs may have minimal PnP
|
|
capabilities and try to turn over the difficult parts of the
|
|
configuration task to Window utilities. If this happens you'll either
|
|
have to find another method (such as isapnptools) or try to set up the
|
|
ESCD database if the BIOS has one. See the next section.
|
|
|
|
<sect2> The BIOS's ESCD Database <label id="escd_">
|
|
<p> The BIOS maintains a non-volatile database containing a
|
|
PnP-configuration that it will try to use. It's called the ESCD
|
|
(Extended System Configuration Data). Again, the provision of ESCD is
|
|
optional but most PnP-BIOSs have it. The ESCD not only stores the
|
|
resource-configuration of PnP devices but also stores configuration
|
|
information of non-PnP devices (and marks them as such) so as to avoid
|
|
conflicts. The ESCD data is usually saved on a chip and remains
|
|
intact when the power is off, but sometimes it's kept on a hard-drive??
|
|
|
|
The ESCD is intended to hold the last used configuration, but if you
|
|
use a program such as Linux's isapnp or pci utilities (which doesn't
|
|
update the ESCD) then the ESCD will not know about this and will not
|
|
save this configuration in the ESCD. A good PnP OS might update the
|
|
ESCD so you can use it later on for a non-PnP OS (like standard
|
|
Linux). MS Windows does this only in special cases. See <ref
|
|
id="W9x_ESCD" name="Using Windows to set ESCD">.
|
|
|
|
To use what's set in ESCD be sure you've set "Not a PnP OS" or the
|
|
like in the BIOS's CMOS. Then each time the BIOS starts up (before
|
|
the Linux OS is loaded) it should configure things this way. If the
|
|
BIOS detects a new PnP card which is not in the ESCD, then it must
|
|
allocate bus-resources to the card and update the ESCD. It may even
|
|
have to change the bus-resources assigned to existing PnP cards and
|
|
modify the ESCD accordingly.
|
|
|
|
If each device saved its last configuration in its hardware, hardware
|
|
configuring wouldn't be needed each time you start your PC. But it
|
|
doesn't work this way. So all the ESCD data needs to be kept correct
|
|
if you use the BIOS for PnP. There are some BIOSs that don't have an
|
|
ESCD but do have some non-volatile memory to store info on which
|
|
bus-resources have been reserved for use by non-PnP cards. Many BIOSs
|
|
have both.
|
|
|
|
<sect2> Using Windows to set the ESCD <label id="W9x_ESCD">
|
|
<p> If the BIOS doesn't set up the ESCD the way you want it (or the
|
|
way it should be) then it would be nice to have a Linux utility to
|
|
set the ESCD. As of early 1999 there isn't any. Thus one may resort to
|
|
attempting to use Windows (if you have it on the same PC) to do this.
|
|
|
|
There are three ways to use Windows to try to set/modify the ESCD. One
|
|
way is to use the ICU utility designed for DOS or Windows 3.x. It
|
|
should also work OK for Windows 9x/2k ?? Another way is to set up
|
|
devices manually ("forced") under Windows 9x/2k so that Windows will
|
|
put this info into the ESCD when Windows is shut down normally. The
|
|
third way is only for legacy devices that are not plug-and-play. If
|
|
Windows knows about them and what bus-resources they use, then Windows
|
|
should put this info into the ESCD.
|
|
|
|
If PnP devices are configured automatically by Windows without the
|
|
user "forcing" it to change settings, then such settings probably will
|
|
not make it into the ESCD. Of course Windows may well decide on its
|
|
own to configure the same as what is set in the ESCD so they could
|
|
wind up being the same by coincidence.
|
|
|
|
Windows 9x are PnP operating systems and automatically PnP-configure
|
|
devices. They maintain their own PnP-database deep down in the
|
|
Registry (stored in binary Windows files). There is also a lot of
|
|
other configuration stuff in the Registry besides PnP-bus-resources.
|
|
There is both a current PnP resource configuration in memory and
|
|
another (perhaps about the same) stored on the hard disk. To look at
|
|
(the one in memory?) this indirectly in Windows98 or to force changes
|
|
you use the Device Manager.
|
|
|
|
In Windows98 there are 2 ways to get to the Device Manager: 1. My
|
|
Computer --> Control Panel --> System Properties --> Device Manager.
|
|
2. (right-click) My Computer --> Properties --> Device Manager. Then
|
|
in Device Manager you select a device (sometimes a multi-step process
|
|
if there are a few devices of the same class). Then click on
|
|
"Properties" and then on "Resources". To attempt to change the
|
|
resource configuration manually, uncheck "Use automatic settings" and
|
|
then click on "Change Settings". Now try to change the setting, but
|
|
it may not let you change it. If it does let you, you have "forced" a
|
|
change. A message should inform you that it's being forced. If you
|
|
want to keep the existing setting shown by Windows but make it
|
|
"forced" then you will have to force a change to something else and
|
|
then force it back to its original setting.
|
|
|
|
To see what has been "forced" under Windows98 look at the "forced
|
|
hardware" list: Start --> Programs --> Accessories --> System Tools
|
|
--> System Information --> Hardware Resources --> Forced Hardware.
|
|
When you "force" a change of bus-resources in Windows, it should put
|
|
your change into the ESCD (provided you exit Windows normally).
|
|
>From the "System Information" window you may also inspect how IRQs and
|
|
IO ports have been allocated under Windows.
|
|
|
|
Even if Windows shows no conflict of bus-resources, there may be a
|
|
conflict under Linux. That's because Windows may assign bus-resources
|
|
differently than the ESCD does. In the the rare case where all
|
|
devices under Windows are either legacy devices or have been "forced",
|
|
then Windows and the ESCD configurations should be identical.
|
|
|
|
<sect2> Adding a New Device (under Linux or Windows)
|
|
<p> If you add a new PnP device and have the BIOS set to "not a PnP
|
|
OS", then the BIOS should automatically configure it and store the
|
|
configuration in ESCD. If it's a non-PnP legacy device (or one made
|
|
that way by jumpers, etc.) then there are a few options to handle it.
|
|
|
|
You may be able to tell the BIOS directly (via the CMOS setup menus)
|
|
that certain bus-resources it uses (such as IRQs) are reserved and are not
|
|
to be allocated by PnP. This does not put this info into the ESCD.
|
|
But there may be a BIOS menu selection as to whether or not to have
|
|
these CMOS choices override what may be in the ESCD in case of
|
|
conflict. Another method is to run ICU under DOS/Windows. Still
|
|
another is to install it manually under Windows 9x/2k and then make
|
|
sure its configuration is "forced" (see the previous section). If
|
|
it's "forced" Windows should update the ESCD when you shut down the
|
|
PC.
|
|
|
|
<sect1> Isapnp (part of isapnptools) <label id="isapnp_">
|
|
<p> Unfortunately, much of the documentation for isapnp is still
|
|
difficult to understand unless you know the basics of PnP. This HOWTO
|
|
should help you understand it as well the FAQ that comes with it.
|
|
<tt/isapnp/ is only for PnP devices on the ISA bus (non-PCI). Running
|
|
the Linux program "isapnp" at boot-time will configure such devices to
|
|
the resource values specified in /etc/isapnp.conf. Its possible to
|
|
create this configuration file automatically but you then must edit it
|
|
manually to choose between various options. With isapnp, a device
|
|
driver which is part of the kernel may run too early before isapnp has
|
|
set the address, etc. in the hardware. This results in the device
|
|
driver not being able to find the device. The driver tries the right
|
|
address but the address hasn't been set yet in the hardware.
|
|
|
|
If your Linux distribution automatically installed isapnptools, isapnp
|
|
may already be running at startup. In this case, all you need to do
|
|
is to edit /etc/isapnp.conf per "<tt/man isapnp.conf/". Note that
|
|
this is like manually configuring PnP since you make the decisions as
|
|
to how to configure as you edit the configuration file. You can use
|
|
the program "pnpdump" to help create the configuration file. It
|
|
almost creates a configuration file for you but you must skillfully
|
|
edit it a little before using it. It contains some comments to help
|
|
you edit it. If you use "isapnp" for configuring and have a PnP BIOS,
|
|
you should probably tell the BIOS (when you set it up) that you don't
|
|
have a PnP OS since you may want the BIOS to configure the PCI
|
|
devices. While the BIOS may also configure the ISA devices, isapnp
|
|
will redo it.
|
|
|
|
The terminology used in the /etc/isapnp.conf file may seem odd at
|
|
first. For example for an I0 address of 0x3e8 you might see "(IO 0
|
|
(BASE 0x3e8))" instead. The "IO 0" means this is the first (0th) IO
|
|
address-range that this device uses. Another way to express all this
|
|
would be: "IO[0] = 0x3e8" but isapnp doesn't do it this way. "IO 1"
|
|
would mean that this is the second IO address range used by this
|
|
device, etc. "INT 0" has a similar meaning but for IRQs (interrupts).
|
|
A single card may contain several physical devices but the above
|
|
explanation was for just one of these devices.
|
|
|
|
<sect1> PCI Utilities <label id="pciutils_">
|
|
<p> The package PCI Utilities (= pciutils, incorrectly called
|
|
"pcitools"), should let you manually PnP-configure the PCI bus.
|
|
"lspci" or "scanpci" (Xwindows) lists bus-resources while "setpci"
|
|
sets resource allocations in the hardware devices. It appears that
|
|
setpci is mainly intended for use in scripts and presently one needs to
|
|
know the details of the PCI configuration registers in order to use it.
|
|
That's a topic not explained here nor in the manual page for setpci.
|
|
|
|
<sect1> Patch the Kernel to Make Linux PnP <label id="patch_kernel">
|
|
<p> David Howells has created a patch to do this called "Linux Kernel
|
|
Configuration/Resource Manager" (sometimes called Hardware
|
|
Configuration Manager). In late 1999 the patch was not available at
|
|
his website. This may mean there is no patch available for recent
|
|
versions of the kernel.
|
|
|
|
For previous patches the resulting kernel was claimed to be stable
|
|
but bugs have been reported. The patch included documentation such as
|
|
serial.txt to show how to deal with the serial port. It provided
|
|
"files" in the /proc tree so that you can see what is going on and can
|
|
echo commands into one of these files for custom configuration. One
|
|
problem is that most device drivers don't know about it so that you
|
|
still had to use the traditional configuration files, etc. for
|
|
configuration. The webpage for it is <url
|
|
url="http://www.astarte.free-online.co.uk">
|
|
|
|
<sect1> Windows Configures <label id="windows_conf">
|
|
<p> If you have Windows9x (or 2k) on the same PC, then just start
|
|
Windows and let it configure PnP. Then start Linux from Windows (or
|
|
DOS). But there may be a problem with IRQs for PCI devices. As
|
|
Windows shuts down to make way for Linux, it may erase (zero) the IRQ
|
|
which is stored in one of the PCI device's configuration registers.
|
|
Linux will complain that it has found an IRQ of zero.
|
|
|
|
The above is reported to happen if you start Linux using a shortcut
|
|
(PIF file). But a workaround is reported where you still use the
|
|
shortcut PIF. A shortcut is something like a symbolic link in Linux
|
|
but it's more than that since it may be "configured". To start Linux
|
|
(from DOS you create a batch file (script) which starts Linux. (The
|
|
program that starts Linux is in the package called "loadlin"). Then
|
|
create a PIF shortcut to that batch file and get to the "Properties"
|
|
dialog box for the shortcut. Select "Advanced" and then check "MS-DOS
|
|
mode" to get it to start in genuine MS-DOS.
|
|
|
|
Now here's the trick to prevent zeroing the PCI IRQs. Check "Specify
|
|
a new MS-DOS configuration". Then either accept the default
|
|
configuration presented to you or click on "Configuration" to change
|
|
it. Now when you start Linux by clicking on the shortcut, new
|
|
configuration files (Config.sys and Autoexec.bat) will be created per
|
|
your new configuration. The old files are stored as "Config.wos and
|
|
Autoexec.wos". Windows would normally restore these files to their
|
|
original names if Windows were to be entered again and shut down. But
|
|
after Linux boots you don't get back to Windows again so you should
|
|
enter commands in the batch file to rename these files to their *.bat
|
|
and *.sys names. Put the renaming commands into the batch file before
|
|
the line that loads Linux. This will permit Windows (and not Linux)
|
|
to start the next time the PC is powered on.
|
|
|
|
Also it's reported that you should click on the "General" tab (of the
|
|
"Properties" dialog) and check "Read-only". Otherwise Windows may
|
|
reset the "Advanced Settings" to "Use current MS-DOS configuration"
|
|
and PCI IRQs get zeroed. Thus Windows erases the IRQs when you use the
|
|
current MS-DOS configuration but doesn't erase when you use a new
|
|
configuration (which may actually configure things identical to
|
|
the old configuration). Windows does not seem to be very consistent.
|
|
|
|
<sect1> Device Driver Configures <label id="dev_d_conf">
|
|
<p> A few device drivers will use PnP methods to set the bus-resources in
|
|
the hardware but only for the device that they control. Since the
|
|
driver has done the configuring, it obviously knows the configuration
|
|
and there is no need for you to tell it this info.
|
|
|
|
The problem with this is twofold. It's difficult to incorporate all
|
|
of this into the driver, and the driver may grab bus-resources that are
|
|
needed by other devices. It does make it easy for the user but a PnP
|
|
Linux kernel might be better. See <ref id="linux_needs_PnP"
|
|
name="Linux Needs to Cope Better with PnP">.
|
|
|
|
<sect1> PnP Software/Documents <label id="sw_and_docs">
|
|
<p>
|
|
<itemize>
|
|
<item><url url="http://www.roestock.demon.co.uk/isapnptools/"
|
|
name="Isapnptools homepage">
|
|
<item><url url="http://www.astarte.free-online.co.uk" name="Patch to
|
|
make the Linux kernel PnP">
|
|
<item> <url url="http://www.io.com/~cdb/mirrors/lpsg/pnp-linux.html"
|
|
name="PnP driver project">
|
|
<item <url url="http://www.microsoft.com/hwdev/respec/pnpspecs.htm"
|
|
name="PnP Specs. from Microsoft">
|
|
<item> Book: PCI System Architecture, 3rd ed. by Tom Shanley +,
|
|
MindShare 1995. Covers PnP-like features on the PCI bus.
|
|
<item> <label id="pnp_book"> Book: Plug and Play System Architecture,
|
|
by Tom Shanley, Mind Share 1995. Details of PnP on the ISA bus. Only
|
|
a terse overview of PnP on the PCI bus.
|
|
<item> Book: Programming Plug and Play, by James Kelsey, Sams 1995.
|
|
Details of programming to communicate with a PnP BIOS. Covers ISA,
|
|
PCI, and PCMCIA buses.
|
|
</itemize>
|
|
|
|
<sect> Tell the Driver the Configuration <label id="tell_driver_config">
|
|
<sect1> Introduction
|
|
<p> Just how this is done depends upon the driver. Some drivers have
|
|
more than one way to find out how their physical device is configured.
|
|
At one extreme is the case where you must hard-code the bus-resources into
|
|
the kernel and recompile. At the other extreme, the driver does
|
|
everything automatically and you have nothing to do. It may even set
|
|
the bus-resources in the hardware using PnP methods.
|
|
|
|
In the middle are cases where you run a program to give the resource
|
|
info to the driver or put the info in a file. In some cases the
|
|
driver may probe for the device at addresses where it suspects the
|
|
device resides. It may then try to test various IRQs to see which one
|
|
works. It may or may not automatically do this. In other cases the
|
|
driver may use PnP methods to find the device and how the bus-resources
|
|
have been set, but will not actually set them. It may also look in
|
|
some of the files in the /proc directory.
|
|
|
|
One may need to give the bus-resources as a parameter to the kernel to to
|
|
a loadable module. See /usr/lib/modules_help/descr.gz for a list of
|
|
possible parameters. The module to load is listed in /etc/modules
|
|
along with its parameters. In some other case the bus-resources may be
|
|
given as parameters to the kernel. These are put into the lilo.conf
|
|
file as append="...". Then the lilo program must be run to save this
|
|
in the kernel boot code.
|
|
|
|
While there is great non-uniformity about how drivers find out about
|
|
bus-resources, the end goal is the same. There are so many different
|
|
hardware devices and drivers for them that you may need to look at
|
|
documentation for your driver to find out how it finds out about
|
|
bus-resources and what you need to do to insure that it gets the info it
|
|
needs. Some brief info on a few drivers is presented in the following
|
|
section.
|
|
|
|
<sect1> Serial Port Driver: setserial
|
|
<p> For the standard serial port driver (not for multiport cards) you
|
|
use setserial to configure the driver. It is often run from a
|
|
start-up file. In newer versions there is a /etc/serial.conf file
|
|
that you "edit" by simply using the setserial command in the normal
|
|
way and what you set using <tt/setserial/ is saved in the
|
|
<tt>serial.conf</tt> configuration file. The <tt>serial.conf</tt>
|
|
file should be consulted when the <tt/setserial/ command runs from a
|
|
start-up file. Your distribution may or may not set this up for you.
|
|
|
|
There are two different ways to use <tt/setserial/ depending on the options
|
|
you give it. One way is used to manually tell the driver the
|
|
configuration. The other way is to probe at a given address and
|
|
report if a serial port exists there. It can also probe this address
|
|
and try to detect what IRQ is used for this port. The driver runs
|
|
something like <tt/setserial/ at start-up but it doesn't probe for
|
|
IRQs, it just assigns the "standard" IRQ which may be wrong. It does
|
|
probe for the existence of a port. See Serial-HOWTO for more details.
|
|
|
|
<sect1> Sound Card Drivers
|
|
|
|
<sect2> OSS-Lite
|
|
<p> You must give the IO, IRQ, and DMA as parameters to a module
|
|
or compile them into the kernel. But some PCI cards will get
|
|
automatically detected (likely by using the lspci command or the like).
|
|
RedHat supplies a program "sndconfig" which detects ISA PnP cards and
|
|
automatically sets up the modules for loading with the detected
|
|
bus-resources.
|
|
|
|
<sect2> OSS (Open Sound System) and ALSA
|
|
<p> These will detect the card by PnP methods and then select the
|
|
appropriate driver and load it. It will also set the bus-resources on an
|
|
ISA-PnP card. You may need to manually intervene to avoid conflicts.
|
|
For the ALSA driver, support for ISA-PnP is optional and you may use
|
|
isapnp tools if you want to.
|
|
|
|
<sect> What Is My Current Configuration? <label id="current_config">
|
|
<p> Here "configuration" means the assignment of PnP bus-resources
|
|
(addresses, IRQs, and DMAs). There are two parts to this question for
|
|
each device. Each part should have the same answer.
|
|
<enum>
|
|
<item> What is the configuration of the device driver software?
|
|
I.e.: What does the driver think the hardware configuration is?
|
|
<item> What configuration (if any) is set in the device hardware?
|
|
</enum>
|
|
|
|
Of course the configuration of the device hardware and its driver
|
|
should be the same (and it normally is). But if things are not
|
|
working right, there may be a difference. This means the the driver
|
|
has incorrect information about the actual configuration of the
|
|
hardware. This spells trouble. If the software you use doesn't
|
|
adequately tell you what's wrong (or automatically configure it
|
|
correctly) then you need to investigate how your hardware devices and
|
|
their drivers are configured. While Linux device drivers should "tell
|
|
all" in some cases it's not easy to determine what has been set in the
|
|
hardware.
|
|
|
|
Another problem is that when you view configuration messages on the
|
|
screen, it's sometimes not clear whether the reported configuration is
|
|
that of the device driver, the device hardware, or both. If the
|
|
device driver is assigned a configuration and then checks the hardware
|
|
out to see if it's configured the same, then the configuration
|
|
reported by the driver should be that of both the hardware and the
|
|
driver.
|
|
|
|
But some drivers which don't do this may accept a configuration that
|
|
doesn't check out. For example, "setserial" will accept a
|
|
configuration that doesn't check out (even if you've told it to probe
|
|
for bus-resources). Thus "setserial" may only be telling you the
|
|
configuration of the driver and not the hardware.
|
|
|
|
<sect1> Boot-time Messages <label id="boot_time_msgs">
|
|
<p> Some info on configuration may be obtained by reading the messages
|
|
from the BIOS and Linux that appear on the screen when you first start
|
|
the computer. These messages often flash by too fast to read but once
|
|
they stop type Shift-PageUp a few times to scroll back to them. To
|
|
scroll forward thru them type Shift-PageDown. Typing "dmesg" at any
|
|
time to the shell prompt will show only the Linux kernel messages and
|
|
miss some of the most important ones (including ones from the BIOS).
|
|
The messages from Linux may sometimes only show what the device driver
|
|
thinks the configuration is, perhaps as told it via an incorrect
|
|
configuration file.
|
|
|
|
The BIOS messages will show the actual hardware configuration at that
|
|
time, but a PnP OS, isapnp, or pci utilities, may change it later.
|
|
The BIOS messages are displayed first before the ones from Linux. As
|
|
an alternative to eventually using Shift-PageUp to read them, try
|
|
freezing them by hitting the "Pause" key. Press any key to resume.
|
|
But once the messages from Linux start to appear, it's too late to use
|
|
"Pause" since it will not freeze the messages from Linux.
|
|
|
|
<sect1> How Are My Device Drivers Configured?
|
|
<p> There may be a programs you can run from the command line (such as
|
|
"setserial" for serial ports) to determine this. The /proc directory
|
|
tree is useful. /proc/ioports shows the I/O addresses that the
|
|
drivers use (or try if it's wrong). They might not be set this way in
|
|
hardware.
|
|
|
|
/proc/interrupts shows only interrupts currently in use. Many
|
|
interrupts that have been allocated to drivers don't show at all since
|
|
they're not currently being used. For example, even though your
|
|
floppy drive has a floppy disk in it and is ready to use, the
|
|
interrupt for it will not show unless its in use. Again, just because
|
|
an interrupt shows up here doesn't mean that it exists in the
|
|
hardware. A clue that it doesn't exist in hardware will be if it
|
|
shows that 0 interrupts have been issued by this interrupt. Even if
|
|
it shows some interrupts have been issued there is no guarantee that
|
|
they came from the device shown. It could be that some other device
|
|
which is not currently in use has issued them. A device not in use (per
|
|
the kernel) may still issue some interrupts for various reasons.
|
|
|
|
<sect1> How Are My Hardware Devices Configured?
|
|
<p> It's easy to find out what bus-resources have been assigned to
|
|
devices on the PCI bus with the "lspci" or "scanpci" commands. For
|
|
for kernels < 2.2: see <tt>/proc/pci</tt> or <tt>/proc/bus/pci</tt>
|
|
for later kernels. Note that IRQs for <tt>/proc/pci</tt> are in
|
|
hexadecimal. Don't bother trying to decipher
|
|
<tt>/proc/bus/pci/devices</tt> since "lspci" will do that for you.
|
|
|
|
For the ISA bus you may try running <tt>pnpdump --dumpregs</tt>
|
|
but it's not a sure thing. The results may be seem cryptic but they
|
|
can be deciphered. Don't confuse the read-port address which
|
|
<tt/pnpdump/ "tries" (and finds something there) with the I/O address
|
|
of the found device. They are not the same. To try to find missing
|
|
hardware on the ISA bus (both PnP and legacy) try the program
|
|
"scanport" but be warned that it might hang your PC. It will not show
|
|
the IRQ nor will it positively identify the hardware.
|
|
|
|
Messages from the BIOS at boot-time tell you how the hardware
|
|
configuration was then. If you rely on the BIOS for configuring, then
|
|
it should still be the same. Messages from Linux may be from drivers
|
|
that have checked to see that the hardware is there (and possibly
|
|
checked the IRQ and DMA). Of course, if the device works fine, then
|
|
it's likely configured the same as the driver.
|
|
|
|
<sect> Appendix
|
|
<sect1> Addresses <label id="addresses_">
|
|
<p> There are three types of addresses: main memory addresses, I/O
|
|
addresses and configuration addresses. On the PCI bus, configuration
|
|
addresses constitute a separate address space just like I/O addresses
|
|
do. Except for the complicated case of ISA configuration addresses,
|
|
whether or not an address on the bus is a memory address, I/O address,
|
|
or configuration address depends only on the voltage on other wires
|
|
(traces) of the bus.
|
|
|
|
<sect2> ISA Bus Configuration Address (Read-Port etc.)
|
|
<p> For the ISA bus, there is technically no configuration address
|
|
space, but there is a special way for the CPU to access PnP
|
|
configuration registers on the PnP cards. For this purpose 3 @ I/O
|
|
addresses are allocated. This is not 3 addresses for each card but 3
|
|
addresses shared by all cards.
|
|
|
|
These 3 addresses are named read-port, write-port, and address-port.
|
|
Each port is just one byte in size. Each PnP card has many
|
|
configuration registers so that just 3 addresses are not even
|
|
sufficient for these registers on a single card. To communicate with
|
|
a certain card, a specially-assigned card number (handle) is sent to
|
|
all cards at the write-port address. After that the only card still
|
|
listening is the card with this handle. Then the address of the
|
|
configuration register (of that card) is sent to the address-port (of
|
|
all cards --but only one is listening). Next communication takes
|
|
place with one configuration register on that card by either doing a
|
|
read on the read-port or a write on the write-port.
|
|
|
|
The write-port is always at A79 and the address-port is always at 279
|
|
(hex). But the read-port is not fixed but is set by the configuration
|
|
software at some address that will supposedly not conflict with any
|
|
other ISA card. If there is a conflict, it will change the address.
|
|
All PnP cards get "programmed" with this address. Thus if you use say
|
|
isapnp to set or check configuration data it must determine this
|
|
read-port address.
|
|
|
|
<sect2> Address ranges
|
|
<p> The term "address" is sometimes used in this document to mean a
|
|
contiguous range of addresses. Since addresses are given in bytes, a
|
|
single address only contains one byte but I/O (and main memory)
|
|
addresses need more than this. So a range of say 8 bytes is often
|
|
used for I/O address while the range for main memory addresses
|
|
allocated to a device is much larger. For a serial port (an I/O
|
|
device) it's sufficient to give the starting I/O address of the device
|
|
(such as 3F8) since it's well known that the range of addresses for
|
|
serial port is only 8 bytes. The starting address is known as the
|
|
"base address".
|
|
|
|
<sect2> Address space
|
|
<p> For ISA, to access both I/O and (main) memory address "spaces"
|
|
the same address bus is used (the wires used for the address are
|
|
shared). How does the device know whether or not an address which
|
|
appears on the address bus is a memory address or I/O address? Well,
|
|
there are 4 dedicated wires on the bus that convey this information
|
|
and more. If a certain one of these 4 wires is asserted, it says that
|
|
the CPU wants to read from an I/O address, and the main memory ignores
|
|
the address on the bus. The other 3 wires serve similar purposes. In
|
|
summary: Read and write wires exist for both main memory and I/O
|
|
addresses (4 wires in all).
|
|
|
|
For the PCI bus it's the same basic idea also using 4 wires but it's
|
|
done a little differently. Instead of only one or the four wires
|
|
being asserted, a binary number is put on the wires (16 different
|
|
possibilities). Thus more info may be conveyed. Four of these 16
|
|
numbers serve the I/O and memory spaces as in the above paragraph. In
|
|
addition there is also configuration address space which uses up two
|
|
more numbers. Ten extra numbers are left over for other purposes.
|
|
|
|
<sect2> Range Check (ISA Testing for IO Address Conflicts)
|
|
<p> On the ISA bus, there's a method built into each PnP card for
|
|
checking that there are no other cards that use the same address. If
|
|
two or more cards use the same IO address, neither card is likely to
|
|
work right (if at all). Good PnP software should assign bus-resources so
|
|
as to avoid this conflict, but even in this case a legacy card might
|
|
be lurking somewhere with the same address.
|
|
|
|
The test works by a card putting a test number in its own IO
|
|
registers. Then the PnP software reads it and verifies that it reads
|
|
the same test number. If not, something is wrong (such as another
|
|
card with the same address. It repeats the same test with another
|
|
test number. Since it actually checks the range of IO addresses
|
|
assigned to the card, it's called a "range check". It could be better
|
|
called an address-conflict test. If there is an address conflict you
|
|
get an error message and need to resolve it yourself.
|
|
|
|
<sect2> Communicating Directly via Memory
|
|
<p> Traditionally, most I/O devices used only I/O memory to
|
|
communicate with the CPU. For example, the serial port does this.
|
|
The device driver, running on the CPU would read and write data
|
|
to/from the I/O address space and main memory. A faster way would be
|
|
for the device itself to put the data directly into main memory. One
|
|
way to do this is by using <ref id="dma_" name="DMA Channels"> or bus
|
|
mastering. Another way is to allocate some space in main memory to
|
|
the device. This way the device reads and writes directly to main
|
|
memory without having to bother with DMA or bus mastering. Such
|
|
a device may also use IO addresses.
|
|
|
|
<sect1> Interrupts --Details <label id="interrupt_detail">
|
|
<p> Interrupts convey a lot of information but only indirectly. The
|
|
interrupt signal (a voltage on a wire) just tells a chip called the
|
|
interrupt controller that a certain device needs attention. The
|
|
interrupt controller then signals the CPU. The CPU finds the driver
|
|
for this device and runs a part of it known as an "interrupt service
|
|
routine" (or "interrupt handler"). This "routine" tries to find out
|
|
what has happened and then deals with the problem such as transferring
|
|
bytes from (or to) the device. This program (routine) can easily
|
|
find out what has happened since the device has registers at addresses
|
|
known to the the driver software (provided the IRQ number and the I/O
|
|
address of the device has been set correctly). These registers
|
|
contain status information about the device . The software reads the
|
|
contents of these registers and by inspecting the contents, finds out
|
|
what happened, and takes appropriate action..
|
|
|
|
Thus each device driver needs to know what interrupt number (IRQ) to
|
|
listen to. On the PCI bus (and for the serial ports on the ISA bus
|
|
starting with Kernel 2.2) it's possible for two (or more) devices to
|
|
share the same IRQ number. When such an interrupt is issued, the CPU
|
|
runs all interrupt service routines for all devices using that
|
|
interrupt. The first thing the first service routine does is to check
|
|
the device registers to see if an interrupt actually happened for its
|
|
device. If it finds that its device didn't issue an interrupt (a false
|
|
alarm) it likely will immediately exit and the next service routine
|
|
starts, etc.
|
|
|
|
<sect1> PCI Interrupts
|
|
<p> PCI interrupts are different but since they are normally mapped to
|
|
IRQ's they behave in about the same way. A major difference is that
|
|
PCI interrupts may be shared. For example IRQ5 may be shared between
|
|
two PCI devices. This sharing ability is automatic: you don't need
|
|
special hardware or software. There have been some reports of
|
|
situations where such sharing didn't work, but it's likely due to a
|
|
defect in the device driver software. All device drivers for PCI
|
|
devices are supposed to provide for interrupt sharing. Note that
|
|
you can't share the same interrupt between the PCI and ISA bus.
|
|
However, illegal sharing will work provided the devices which are in
|
|
conflict are not in use at the same time. "In use" here means that a
|
|
program is running which "opened" the device in its C programming
|
|
code.
|
|
|
|
You may need to know some of the details of the PCI interrupt system
|
|
in order to set up the BIOS's CMOS or to set jumpers on old PCI cards.
|
|
Each PCI card has 4 possible interrupts: INTA#, INTB#, INTC#, INTD#.
|
|
Thus for a 7-slot system there could be 7 x 4 = 28 different
|
|
interrupt lines. But the specs permit a fewer number of interrupt
|
|
lines. This is not too restrictive since interrupts may be shared.
|
|
Many PCI buses seem to be made with only 4 interrupt lines. Call
|
|
these lines (wires or traces) W, X, Y, Z. Suppose we designate the B
|
|
interrupt from slot 3 as interrupt 3B. Then wire W could be used to
|
|
share interrupts 1A, 2B, 3C, 4D, 5A, 6B, 7C. This is done by
|
|
physically connecting wire W to wires 1A, 2B, etc. Likewise wire X
|
|
could be connected to wires 1B, 2C, 3D, 4A, 5B, 6C, 7D. Then on
|
|
startup, the BIOS maps the X, W, Y, Z to IRQ's. After that it writes
|
|
the IRQ that each device is mapped to into a hardware register in each
|
|
device. Then and anything interrogating the device can find out what
|
|
IRQ it uses.
|
|
|
|
The above mentioned wires X, W, Y, Z are labeled per PCI specs as
|
|
INTA#, INTB#, INTC# and INTD#. This official PCI notation is
|
|
confusing since now INTA# has 2 possible meanings depending on whether
|
|
we are talking about a slot or the PCI bus. For example, if 3C is
|
|
mapped to X then we say that INTC# of slot 3 is cabled to INTA# (X) of
|
|
the PCI bus. Confusing notation.
|
|
|
|
There's another requirement also. A PCI slot must use the lower
|
|
interrupt letters first. Thus if a slot only uses one interrupt, it
|
|
must be INTA#. If it uses 2 interrupts they must be INTA# and INTB#,
|
|
etc. A card in a slot may have up to 8 devices on it but there are
|
|
only 4 PCI interrupts for it. This is OK since interrupts may be
|
|
shared so that each of the 8 devices (if they exist) can have an
|
|
interrupt. The PCI interrupt letter of a device is often fixed and
|
|
hardwired into the device.
|
|
|
|
The BIOS assigns IRQs (interrupts) so as to avoid conflicts with the
|
|
IRQs it knows about on the ISA bus. Sometimes in the CMOS BIOS menu
|
|
one may assign IRQs to PCI cards (but it's not simple as explained
|
|
above). There's a situation where Windows zeroed out all the IRQ
|
|
numbers in the PCI cards after the IRQ mappings had been set. Then
|
|
someone running Windows booted Linux from Windows with the result that
|
|
Linux only found only incorrect IRQs of zero.
|
|
|
|
You might reason that since the PCI is using IRQ's (ISA bus) it might
|
|
be slow, etc. Not really. The ISA Interrupt Controller Chip(s) has a
|
|
direct interrupt wire going to the CPU so it can get immediate
|
|
attention. While signals on the ISA address and data buses need to go
|
|
thru the PCI bus to get to the CPU, the IRQ interrupt signals go there
|
|
almost directly.
|
|
|
|
<sect1> Isolation <label id="isolation_">
|
|
<p> This is only for the ISA bus. Isolation is a complex method of
|
|
assigning a temporary handle (id number or Card Select Number = CSN)
|
|
to each PnP device on the ISA bus. Since there are more efficient
|
|
(but more complex) ways to do this, some might claim that it's a
|
|
simple method. Only one write address is used for PnP writes to all
|
|
PnP devices so that writing to this address goes to all PnP device
|
|
that are listening. This write address is used to send (assign) a
|
|
unique handle to each PnP device. To assign this handle requires that
|
|
only one device be listening when the handle is sent (written) to this
|
|
common address. All PnP devices have a unique serial number which
|
|
they use for the process of isolation. Doing isolation is something
|
|
like a game. It's done using the equivalent of just one common bus
|
|
wire connecting all PnP devices and the isolation program.
|
|
|
|
For the first round of the "game" all PnP devices listen on this wire
|
|
and send out simultaneously a sequence of bits to the wire. The
|
|
allowed bits are either a 1 (positive voltage) or an "open 0" of no
|
|
voltage (open circuit or tri-state). Each PnP device just starts to
|
|
sequentially send out its serial number, bit-by-bit, starting with the
|
|
high-order bit, on this wire. If any device sends a 1, a 1 will be
|
|
heard on the wire by all other devices. If all devices send an "open
|
|
0" nothing will be heard on the wire. The object is to eliminate (by
|
|
the end of this first round) all but highest serial number device.
|
|
"Eliminate" means to cease to listen anymore to the write address that
|
|
all devices still in the game are still listening to. This is also
|
|
called "dropping out". (Note that all serial numbers are of the same
|
|
length.)
|
|
|
|
First consider only the high order bit of the serial number which is
|
|
put on the wire first by all devices which have no handle yet. If any
|
|
PnP device sends out a 0 (open 0) but hears a 1, this means that some
|
|
other PnP device has a higher serial number, so it temporarily drops
|
|
out of this round and doesn't listen anymore until the round is
|
|
finished (when a handle is assigned to the winner: the highest serial
|
|
number). Now the devices still in the game all have the same leading
|
|
digit (a 1) so we may strip off this digit and consider only the
|
|
resulting "stripped serial number" for future participation in this
|
|
round. Then go to the start of this paragraph and repeat until the
|
|
entire serial number has been examined for each device (see below for
|
|
the all-0 case).
|
|
|
|
Thus it's clear that the highest serial number will not be eliminated
|
|
from the game. But what happens if the leading digits (of the
|
|
possibly stripped serial numbers) are all 0? In this case an "open 0"
|
|
is sent on the line and all participants stay in the game. If they
|
|
all have a leading 0 then this is a tie and the 0's are stripped off
|
|
just like the 1's were in the above paragraph. The game then
|
|
continues as the next digit (of the serial number) is sent out.
|
|
|
|
At the end of the round (after the low-order bit of the serial number
|
|
has been sent out by whatever participants remain) only one PnP device
|
|
with the highest serial number remains. It then gets assigned a
|
|
handle and drops out of the game permanently. Then all the dropouts
|
|
from the last round (that don't have a handle yet) reenter the game
|
|
and a new round begins with one less participant. Eventually, all PnP
|
|
devices are assigned handles. It's easy to prove that this algorithm
|
|
works.
|
|
|
|
Once all handles are assigned, they are used to address each PnP
|
|
device and send it a configuration as well as to read configuration
|
|
info from the PnP device. Note that these handles are only used for
|
|
PnP configuration and are not used for normal communication with the
|
|
PnP device. When the computer starts up, all of the handles are lost
|
|
so that a PnP BIOS usually does the isolation process again each time
|
|
you start your PC.
|
|
|
|
END OF Plug-and-Play-HOWTO
|
|
</article>
|
|
|