50 lines
2.1 KiB
Plaintext
50 lines
2.1 KiB
Plaintext
|
====================================
|
||
|
SGI IOC4 PCI (multi function) device
|
||
|
====================================
|
||
|
|
||
|
The SGI IOC4 PCI device is a bit of a strange beast, so some notes on
|
||
|
it are in order.
|
||
|
|
||
|
First, even though the IOC4 performs multiple functions, such as an
|
||
|
IDE controller, a serial controller, a PS/2 keyboard/mouse controller,
|
||
|
and an external interrupt mechanism, it's not implemented as a
|
||
|
multifunction device. The consequence of this from a software
|
||
|
standpoint is that all these functions share a single IRQ, and
|
||
|
they can't all register to own the same PCI device ID. To make
|
||
|
matters a bit worse, some of the register blocks (and even registers
|
||
|
themselves) present in IOC4 are mixed-purpose between these several
|
||
|
functions, meaning that there's no clear "owning" device driver.
|
||
|
|
||
|
The solution is to organize the IOC4 driver into several independent
|
||
|
drivers, "ioc4", "sgiioc4", and "ioc4_serial". Note that there is no
|
||
|
PS/2 controller driver as this functionality has never been wired up
|
||
|
on a shipping IO card.
|
||
|
|
||
|
ioc4
|
||
|
====
|
||
|
This is the core (or shim) driver for IOC4. It is responsible for
|
||
|
initializing the basic functionality of the chip, and allocating
|
||
|
the PCI resources that are shared between the IOC4 functions.
|
||
|
|
||
|
This driver also provides registration functions that the other
|
||
|
IOC4 drivers can call to make their presence known. Each driver
|
||
|
needs to provide a probe and remove function, which are invoked
|
||
|
by the core driver at appropriate times. The interface of these
|
||
|
IOC4 function probe and remove operations isn't precisely the same
|
||
|
as PCI device probe and remove operations, but is logically the
|
||
|
same operation.
|
||
|
|
||
|
sgiioc4
|
||
|
=======
|
||
|
This is the IDE driver for IOC4. Its name isn't very descriptive
|
||
|
simply for historical reasons (it used to be the only IOC4 driver
|
||
|
component). There's not much to say about it other than it hooks
|
||
|
up to the ioc4 driver via the appropriate registration, probe, and
|
||
|
remove functions.
|
||
|
|
||
|
ioc4_serial
|
||
|
===========
|
||
|
This is the serial driver for IOC4. There's not much to say about it
|
||
|
other than it hooks up to the ioc4 driver via the appropriate registration,
|
||
|
probe, and remove functions.
|