PCI and ISA are the most commonly used peripheral interfaces in the PC world, but they aren’t the only ones. Here’s a summary of the features of other buses found in the PC market.
''Micro Channel Architecture'' (MCA) is an IBM standard used in PS/2 computers and some laptops. The main problem with Micro Channel is the lack of documentation, which has resulted in a lack of Linux support for MCA. As of 2.1.15, however, MCA patches that had been floating around have been included in the official kernel; newer kernels can therefore run on PS/2 computers.
At the hardware level, Micro Channel has more features than ISA. It supports multimaster DMA, 32-bit address and data lines, shared interrupt lines, and geographical addressing to access per-board configuration registers. Such registers are called ``Programmable Option Select,'' or POS, but they don’t have all the features of the PCI registers. Linux support for Micro Channel includes functions that are exported to modules.
A device driver can read the integer value MCA_bus
to
see if it is running on a Micro Channel computer.
MCA_bus
is non-zero only if the kernel is running in an
MCA unit. If the symbol is a preprocessor macro, the macro
MCA_bus__is_a_macro
is defined as well. If
MCA_bus__is_a_macro
is undefined, then MCA_bus
is an
integer variable exported to modularized code. As a matter of fact,
MCA_bus
is still a macro hardwired to 0 for every platform except
the PC--the Linux x86 port changed the macro to a variable in
2.1.15. Both MCA_BUS
and MCA_bus__is_a_macro
are
defined in <asm/processor.h>
.
The Extended ISA (EISA) bus is a 32-bit extension to ISA, with a compatible interface connector; ISA device boards can be plugged into an EISA connector. The additional wires are routed under the ISA contacts.
Like PCI and MCA, the EISA bus is designed to host jumperless devices, and it has the same features as MCA: 32-bit address and data lines, multimaster DMA, and shared interrupt lines. EISA devices are configured by software, but they don’t need any particular operating system support. EISA drivers already exist in the Linux kernel for Ethernet devices and SCSI controllers.
An EISA driver checks the value EISA_bus
to determine if
the host computer carries an EISA bus. Like
MCA_bus
, EISA_bus
is either a macro or a variable,
depending on whether EISA_bus__is_a_macro
is defined. Both symbols
are defined in <asm/processor.h>
.
As far as the driver is concerned, there is no special support for EISA in the kernel, and the programmer must deal with ISA extensions by himself. The driver uses standard EISA I/O operations to access the EISA registers. The drivers that are already in the kernel can be used as sample code.
Another extension to ISA is the ``VESA Local Bus'' interface bus, which extends the ISA connectors by adding a third lengthwise slot. This extra slot can be used ``standalone'' by VLB devices; since it duplicates all important signals from the ISA connectors, devices can be built that plug only into the VLB socket without using the ISA sockets. Standalone VLB peripherals are rare, because most devices need to reach the back panel so their external connectors are available.
The VESA bus is much more limited in its capabilities than the EISA, MCA, and PCI buses and is disappearing from the market. No special kernel support exists for VLB. Both the ``Lance'' Ethernet driver and the IDE disk driver in Linux 2.0 can deal with VLB versions of their devices.
18.188.66.13