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