mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-28 21:09:00 +09:00
![Simon Glass](/assets/img/avatar_default.png)
Add a uclass for PCI controllers and a generic one for PCI devices. Adjust the 'pci' command and the existing PCI support to work with this new uclass. Keep most of the compatibility code in a separate file so that it can be removed one day. TODO: Add more header file comments to the new parts of pci.h Signed-off-by: Simon Glass <sjg@chromium.org>
71 lines
2.0 KiB
Plaintext
71 lines
2.0 KiB
Plaintext
PCI with Driver Model
|
|
=====================
|
|
|
|
How busses are scanned
|
|
----------------------
|
|
|
|
Any config read will end up at pci_read_config(). This uses
|
|
uclass_get_device_by_seq() to get the PCI bus for a particular bus number.
|
|
Bus number 0 will need to be requested first, and the alias in the device
|
|
tree file will point to the correct device:
|
|
|
|
|
|
aliases {
|
|
pci0 = &pci;
|
|
};
|
|
|
|
pci: pci-controller {
|
|
compatible = "sandbox,pci";
|
|
...
|
|
};
|
|
|
|
|
|
If there is no alias the devices will be numbered sequentially in the device
|
|
tree.
|
|
|
|
The call to uclass_get_device by seq() will cause the PCI bus to be probed.
|
|
This does a scan of the bus to locate available devices. These devices are
|
|
bound to their appropriate driver if available. If there is no driver, then
|
|
they are bound to a generic PCI driver which does nothing.
|
|
|
|
After probing a bus, the available devices will appear in the device tree
|
|
under that bus.
|
|
|
|
Note that this is all done on a lazy basis, as needed, so until something is
|
|
touched on PCI it will not be probed.
|
|
|
|
PCI devices can appear in the device tree. If they do this serves to specify
|
|
the driver to use for the device. In this case they will be bound at
|
|
start-up.
|
|
|
|
|
|
Sandbox
|
|
-------
|
|
|
|
With sandbox we need a device emulator for each device on the bus since there
|
|
is no real PCI bus. This works by looking in the device tree node for a
|
|
driver. For example:
|
|
|
|
|
|
pci@1f,0 {
|
|
compatible = "pci-generic";
|
|
reg = <0xf800 0 0 0 0>;
|
|
emul@1f,0 {
|
|
compatible = "sandbox,swap-case";
|
|
};
|
|
};
|
|
|
|
This means that there is a 'sandbox,swap-case' driver at that bus position.
|
|
Note that the first cell in the 'reg' value is the bus/device/function. See
|
|
PCI_BDF() for the encoding (it is also specified in the IEEE Std 1275-1994
|
|
PCI bus binding document, v2.1)
|
|
|
|
When this bus is scanned we will end up with something like this:
|
|
|
|
`- * pci-controller @ 05c660c8, 0
|
|
`- pci@1f,0 @ 05c661c8, 63488
|
|
`- emul@1f,0 @ 05c662c8
|
|
|
|
When accesses go to the pci@1f,0 device they are forwarded to its child, the
|
|
emulator.
|