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.
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 setserial
is saved in the
serial.conf
configuration file. The serial.conf
file should be consulted when the 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 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 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.
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.
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.