1ff3e077bSSimon GlassPCI with Driver Model 2ff3e077bSSimon Glass===================== 3ff3e077bSSimon Glass 4ff3e077bSSimon GlassHow busses are scanned 5ff3e077bSSimon Glass---------------------- 6ff3e077bSSimon Glass 7ff3e077bSSimon GlassAny config read will end up at pci_read_config(). This uses 8ff3e077bSSimon Glassuclass_get_device_by_seq() to get the PCI bus for a particular bus number. 9ff3e077bSSimon GlassBus number 0 will need to be requested first, and the alias in the device 10ff3e077bSSimon Glasstree file will point to the correct device: 11ff3e077bSSimon Glass 12ff3e077bSSimon Glass 13ff3e077bSSimon Glass aliases { 14ff3e077bSSimon Glass pci0 = &pci; 15ff3e077bSSimon Glass }; 16ff3e077bSSimon Glass 17ff3e077bSSimon Glass pci: pci-controller { 18ff3e077bSSimon Glass compatible = "sandbox,pci"; 19ff3e077bSSimon Glass ... 20ff3e077bSSimon Glass }; 21ff3e077bSSimon Glass 22ff3e077bSSimon Glass 23ff3e077bSSimon GlassIf there is no alias the devices will be numbered sequentially in the device 24ff3e077bSSimon Glasstree. 25ff3e077bSSimon Glass 26947eb439SBin MengThe call to uclass_get_device() will cause the PCI bus to be probed. 27ff3e077bSSimon GlassThis does a scan of the bus to locate available devices. These devices are 28ff3e077bSSimon Glassbound to their appropriate driver if available. If there is no driver, then 29ff3e077bSSimon Glassthey are bound to a generic PCI driver which does nothing. 30ff3e077bSSimon Glass 31ff3e077bSSimon GlassAfter probing a bus, the available devices will appear in the device tree 32ff3e077bSSimon Glassunder that bus. 33ff3e077bSSimon Glass 34ff3e077bSSimon GlassNote that this is all done on a lazy basis, as needed, so until something is 35947eb439SBin Mengtouched on PCI (eg: a call to pci_find_devices()) it will not be probed. 36ff3e077bSSimon Glass 37*f4b5db7cSBin MengPCI devices can appear in the flattened device tree. If they do this serves to 38*f4b5db7cSBin Mengspecify the driver to use for the device. In this case they will be bound at 39*f4b5db7cSBin Mengfirst. Each PCI device node must have a compatible string list as well as a 40*f4b5db7cSBin Meng<reg> property, as defined by the IEEE Std 1275-1994 PCI bus binding document 41*f4b5db7cSBin Mengv2.1. Note we must describe PCI devices with the same bus hierarchy as the 42*f4b5db7cSBin Menghardware, otherwise driver model cannot detect the correct parent/children 43*f4b5db7cSBin Mengrelationship during PCI bus enumeration thus PCI devices won't be bound to 44*f4b5db7cSBin Mengtheir drivers accordingly. A working example like below: 45*f4b5db7cSBin Meng 46*f4b5db7cSBin Meng pci { 47*f4b5db7cSBin Meng #address-cells = <3>; 48*f4b5db7cSBin Meng #size-cells = <2>; 49*f4b5db7cSBin Meng compatible = "pci-x86"; 50*f4b5db7cSBin Meng u-boot,dm-pre-reloc; 51*f4b5db7cSBin Meng ranges = <0x02000000 0x0 0x40000000 0x40000000 0 0x80000000 52*f4b5db7cSBin Meng 0x42000000 0x0 0xc0000000 0xc0000000 0 0x20000000 53*f4b5db7cSBin Meng 0x01000000 0x0 0x2000 0x2000 0 0xe000>; 54*f4b5db7cSBin Meng 55*f4b5db7cSBin Meng pcie@17,0 { 56*f4b5db7cSBin Meng #address-cells = <3>; 57*f4b5db7cSBin Meng #size-cells = <2>; 58*f4b5db7cSBin Meng compatible = "pci-bridge"; 59*f4b5db7cSBin Meng u-boot,dm-pre-reloc; 60*f4b5db7cSBin Meng reg = <0x0000b800 0x0 0x0 0x0 0x0>; 61*f4b5db7cSBin Meng 62*f4b5db7cSBin Meng topcliff@0,0 { 63*f4b5db7cSBin Meng #address-cells = <3>; 64*f4b5db7cSBin Meng #size-cells = <2>; 65*f4b5db7cSBin Meng compatible = "pci-bridge"; 66*f4b5db7cSBin Meng u-boot,dm-pre-reloc; 67*f4b5db7cSBin Meng reg = <0x00010000 0x0 0x0 0x0 0x0>; 68*f4b5db7cSBin Meng 69*f4b5db7cSBin Meng pciuart0: uart@a,1 { 70*f4b5db7cSBin Meng compatible = "pci8086,8811.00", 71*f4b5db7cSBin Meng "pci8086,8811", 72*f4b5db7cSBin Meng "pciclass,070002", 73*f4b5db7cSBin Meng "pciclass,0700", 74*f4b5db7cSBin Meng "x86-uart"; 75*f4b5db7cSBin Meng u-boot,dm-pre-reloc; 76*f4b5db7cSBin Meng reg = <0x00025100 0x0 0x0 0x0 0x0 77*f4b5db7cSBin Meng 0x01025110 0x0 0x0 0x0 0x0>; 78*f4b5db7cSBin Meng ...... 79*f4b5db7cSBin Meng }; 80*f4b5db7cSBin Meng 81*f4b5db7cSBin Meng ...... 82*f4b5db7cSBin Meng }; 83*f4b5db7cSBin Meng }; 84*f4b5db7cSBin Meng 85*f4b5db7cSBin Meng ...... 86*f4b5db7cSBin Meng }; 87*f4b5db7cSBin Meng 88*f4b5db7cSBin MengIn this example, the root PCI bus node is the "/pci" which matches "pci-x86" 89*f4b5db7cSBin Mengdriver. It has a subnode "pcie@17,0" with driver "pci-bridge". "pcie@17,0" 90*f4b5db7cSBin Mengalso has subnode "topcliff@0,0" which is a "pci-bridge" too. Under that bridge, 91*f4b5db7cSBin Menga PCI UART device "uart@a,1" is described. This exactly reflects the hardware 92*f4b5db7cSBin Mengbus hierarchy: on the root PCI bus, there is a PCIe root port which connects 93*f4b5db7cSBin Mengto a downstream device Topcliff chipset. Inside Topcliff chipset, it has a 94*f4b5db7cSBin MengPCIe-to-PCI bridge and all the chipset integrated devices like the PCI UART 95*f4b5db7cSBin Mengdevice are on the PCI bus. Like other devices in the device tree, if we want 96*f4b5db7cSBin Mengto bind PCI devices before relocation, "u-boot,dm-pre-reloc" must be declared 97*f4b5db7cSBin Mengin each of these nodes. 98*f4b5db7cSBin Meng 99*f4b5db7cSBin MengIf PCI devices are not listed in the device tree, U_BOOT_PCI_DEVICE can be used 100*f4b5db7cSBin Mengto specify the driver to use for the device. The device tree takes precedence 101*f4b5db7cSBin Mengover U_BOOT_PCI_DEVICE. Plese note with U_BOOT_PCI_DEVICE, only drivers with 102*f4b5db7cSBin MengDM_FLAG_PRE_RELOC will be bound before relocation. If neither device tree nor 103*f4b5db7cSBin MengU_BOOT_PCI_DEVICE is provided, the built-in driver (either pci_bridge_drv or 104*f4b5db7cSBin Mengpci_generic_drv) will be used. 105ff3e077bSSimon Glass 106ff3e077bSSimon Glass 107ff3e077bSSimon GlassSandbox 108ff3e077bSSimon Glass------- 109ff3e077bSSimon Glass 110ff3e077bSSimon GlassWith sandbox we need a device emulator for each device on the bus since there 111ff3e077bSSimon Glassis no real PCI bus. This works by looking in the device tree node for a 112ff3e077bSSimon Glassdriver. For example: 113ff3e077bSSimon Glass 114ff3e077bSSimon Glass 115ff3e077bSSimon Glass pci@1f,0 { 116ff3e077bSSimon Glass compatible = "pci-generic"; 117ff3e077bSSimon Glass reg = <0xf800 0 0 0 0>; 118ff3e077bSSimon Glass emul@1f,0 { 119ff3e077bSSimon Glass compatible = "sandbox,swap-case"; 120ff3e077bSSimon Glass }; 121ff3e077bSSimon Glass }; 122ff3e077bSSimon Glass 123ff3e077bSSimon GlassThis means that there is a 'sandbox,swap-case' driver at that bus position. 124ff3e077bSSimon GlassNote that the first cell in the 'reg' value is the bus/device/function. See 125ff3e077bSSimon GlassPCI_BDF() for the encoding (it is also specified in the IEEE Std 1275-1994 126ff3e077bSSimon GlassPCI bus binding document, v2.1) 127ff3e077bSSimon Glass 128ff3e077bSSimon GlassWhen this bus is scanned we will end up with something like this: 129ff3e077bSSimon Glass 130ff3e077bSSimon Glass`- * pci-controller @ 05c660c8, 0 131ff3e077bSSimon Glass `- pci@1f,0 @ 05c661c8, 63488 132ff3e077bSSimon Glass `- emul@1f,0 @ 05c662c8 133ff3e077bSSimon Glass 134ff3e077bSSimon GlassWhen accesses go to the pci@1f,0 device they are forwarded to its child, the 135ff3e077bSSimon Glassemulator. 136