+.. SPDX-License-Identifier: GPL-2.0+
+
PCI with Driver Model
=====================
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:
-
+tree file will point to the correct device::
aliases {
pci0 = &pci;
Note we must describe PCI devices with the same bus hierarchy as the
hardware, otherwise driver model cannot detect the correct parent/children
relationship during PCI bus enumeration thus PCI devices won't be bound to
-their drivers accordingly. A working example like below:
+their drivers accordingly. A working example like below::
pci {
#address-cells = <3>;
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:
+driver. For example::
pci@1f,0 {
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:
+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
+ `- * 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.
node. It is required a "sandbox,dev-info" property must be provided in the
host controller node for this functionality to work.
+.. code-block:: none
+
pci1: pci-controller1 {
compatible = "sandbox,pci";
...
cells are PCI device number and function number respectively. The third and
fourth cells are PCI vendor ID and device ID respectively.
-When this bus is scanned we will end up with something like this:
+When this bus is scanned we will end up with something like this::
pci [ + ] pci_sandbo |-- pci-controller1
pci_emul [ ] sandbox_sw | |-- sandbox_swap_case_emul