| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) |
| %YAML 1.2 |
| --- |
| $id: http://devicetree.org/schemas/pci/host-generic-pci.yaml# |
| $schema: http://devicetree.org/meta-schemas/core.yaml# |
| |
| title: Generic PCI host controller |
| |
| maintainers: |
| - Will Deacon <will@kernel.org> |
| |
| description: | |
| Firmware-initialised PCI host controllers and PCI emulations, such as the |
| virtio-pci implementations found in kvmtool and other para-virtualised |
| systems, do not require driver support for complexities such as regulator |
| and clock management. In fact, the controller may not even require the |
| configuration of a control interface by the operating system, instead |
| presenting a set of fixed windows describing a subset of IO, Memory and |
| Configuration Spaces. |
| |
| Configuration Space is assumed to be memory-mapped (as opposed to being |
| accessed via an ioport) and laid out with a direct correspondence to the |
| geography of a PCI bus address by concatenating the various components to |
| form an offset. |
| |
| For CAM, this 24-bit offset is: |
| |
| cfg_offset(bus, device, function, register) = |
| bus << 16 | device << 11 | function << 8 | register |
| |
| While ECAM extends this by 4 bits to accommodate 4k of function space: |
| |
| cfg_offset(bus, device, function, register) = |
| bus << 20 | device << 15 | function << 12 | register |
| |
| properties: |
| compatible: |
| description: Depends on the layout of configuration space (CAM vs ECAM |
| respectively). May also have more specific compatibles. |
| oneOf: |
| - description: |
| PCIe host controller in Arm Juno based on PLDA XpressRICH3-AXI IP |
| items: |
| - const: arm,juno-r1-pcie |
| - const: plda,xpressrich3-axi |
| - const: pci-host-ecam-generic |
| - description: | |
| ThunderX PCI host controller for pass-1.x silicon |
| |
| Firmware-initialized PCI host controller to on-chip devices found on |
| some Cavium ThunderX processors. These devices have ECAM-based config |
| access, but the BARs are all at fixed addresses. We handle the fixed |
| addresses by synthesizing Enhanced Allocation (EA) capabilities for |
| these devices. |
| const: cavium,pci-host-thunder-ecam |
| - description: |
| Cavium ThunderX PEM firmware-initialized PCIe host controller |
| const: cavium,pci-host-thunder-pem |
| - description: |
| HiSilicon Hip06/Hip07 PCIe host bridge in almost-ECAM mode. Some |
| firmware places the host controller in a mode where it is ECAM |
| compliant for all devices other than the root complex. |
| enum: |
| - hisilicon,hip06-pcie-ecam |
| - hisilicon,hip07-pcie-ecam |
| - description: | |
| In some cases, firmware may already have configured the Synopsys |
| DesignWare PCIe controller in RC mode with static ATU window mappings |
| that cover all config, MMIO and I/O spaces in a [mostly] ECAM |
| compatible fashion. In this case, there is no need for the OS to |
| perform any low level setup of clocks, PHYs or device registers, nor |
| is there any reason for the driver to reconfigure ATU windows for |
| config and/or IO space accesses at runtime. |
| |
| In cases where the IP was synthesized with a minimum ATU window size |
| of 64 KB, it cannot be supported by the generic ECAM driver, because |
| it requires special config space accessors that filter accesses to |
| device #1 and beyond on the first bus. |
| items: |
| - enum: |
| - marvell,armada8k-pcie-ecam |
| - socionext,synquacer-pcie-ecam |
| - const: snps,dw-pcie-ecam |
| - description: |
| CAM or ECAM compliant PCI host controllers without any quirks |
| enum: |
| - pci-host-cam-generic |
| - pci-host-ecam-generic |
| |
| reg: |
| description: |
| The Configuration Space base address and size, as accessed from the parent |
| bus. The base address corresponds to the first bus in the "bus-range" |
| property. If no "bus-range" is specified, this will be bus 0 (the |
| default). Some host controllers have a 2nd non-compliant address range, |
| so 2 entries are allowed. |
| minItems: 1 |
| maxItems: 2 |
| |
| ranges: |
| description: |
| As described in IEEE Std 1275-1994, but must provide at least a |
| definition of non-prefetchable memory. One or both of prefetchable Memory |
| and IO Space may also be provided. |
| minItems: 1 |
| maxItems: 3 |
| |
| dma-coherent: true |
| iommu-map: true |
| iommu-map-mask: true |
| msi-parent: true |
| |
| required: |
| - compatible |
| - reg |
| - ranges |
| |
| allOf: |
| - $ref: /schemas/pci/pci-bus.yaml# |
| - if: |
| properties: |
| compatible: |
| contains: |
| const: arm,juno-r1-pcie |
| then: |
| required: |
| - dma-coherent |
| |
| - if: |
| properties: |
| compatible: |
| not: |
| contains: |
| enum: |
| - cavium,pci-host-thunder-pem |
| - hisilicon,hip06-pcie-ecam |
| - hisilicon,hip07-pcie-ecam |
| then: |
| properties: |
| reg: |
| maxItems: 1 |
| |
| unevaluatedProperties: false |
| |
| examples: |
| - | |
| |
| bus { |
| #address-cells = <2>; |
| #size-cells = <2>; |
| pcie@40000000 { |
| compatible = "pci-host-cam-generic"; |
| device_type = "pci"; |
| #address-cells = <3>; |
| #size-cells = <2>; |
| bus-range = <0x0 0x1>; |
| |
| // CPU_PHYSICAL(2) SIZE(2) |
| reg = <0x0 0x40000000 0x0 0x1000000>; |
| |
| // BUS_ADDRESS(3) CPU_PHYSICAL(2) SIZE(2) |
| ranges = <0x01000000 0x0 0x01000000 0x0 0x01000000 0x0 0x00010000>, |
| <0x02000000 0x0 0x41000000 0x0 0x41000000 0x0 0x3f000000>; |
| |
| #interrupt-cells = <0x1>; |
| |
| // PCI_DEVICE(3) INT#(1) CONTROLLER(PHANDLE) CONTROLLER_DATA(3) |
| interrupt-map = < 0x0 0x0 0x0 0x1 &gic 0x0 0x4 0x1>, |
| < 0x800 0x0 0x0 0x1 &gic 0x0 0x5 0x1>, |
| <0x1000 0x0 0x0 0x1 &gic 0x0 0x6 0x1>, |
| <0x1800 0x0 0x0 0x1 &gic 0x0 0x7 0x1>; |
| |
| // PCI_DEVICE(3) INT#(1) |
| interrupt-map-mask = <0xf800 0x0 0x0 0x7>; |
| }; |
| }; |
| ... |