[PATCH v7 11/22] PCI: mvebu: Adapt to the new device tree layout
Bjorn Helgaas
bhelgaas at google.com
Wed Jul 10 04:50:47 EST 2013
On Tue, Jul 9, 2013 at 12:20 PM, Jason Cooper <jason at lakedaemon.net> wrote:
> Bjorn,
>
> On Tue, Jul 09, 2013 at 01:41:13PM -0300, Ezequiel Garcia wrote:
>> From: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
>>
>> The new device tree layout encodes the window's target ID and attribute
>> in the PCIe controller node's ranges property. This allows to parse
>> such entries to obtain such information and use the recently introduced
>> MBus API to create the windows, instead of using the current name based
>> scheme.
>>
>> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
>> ---
>> .../devicetree/bindings/pci/mvebu-pci.txt | 145 ++++++++++++++++-----
>> drivers/pci/host/pci-mvebu.c | 113 +++++++++++-----
>> 2 files changed, 193 insertions(+), 65 deletions(-)
>
> After my conversation with tglx a few days ago [1], I'm even more
> inclined to push patches like this to the correct maintainers. However,
> looking at how this patch fits into the series, it may be better if we
> take it through mvebu/arm-soc with your Ack.
>
> It depends on the patches before it, and the patches after it depend on
> it. Unless I'm reading this wrong, I would have a branch that you would
> pull and base this patch on, which I would then pull and base the rest
> of the series on. Reshuffling the series to alleviate this wouldn't work
> in this case. :-/
>
> Are you ok with that? (fwiw, the code changes are isolated to
> pci-mvebu.c)
Yep, that makes sense to me. With dependencies both ways, it just
seems much simpler to have you push it via mvebu/arm-soc.
Acked-by: Bjorn Helgaas <bhelgaas at google.com>
> thx,
>
> Jason.
>
> [1] http://www.spinics.net/lists/arm-kernel/msg257447.html
>
>>
>> diff --git a/Documentation/devicetree/bindings/pci/mvebu-pci.txt b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
>> index f8d4058..9556e2f 100644
>> --- a/Documentation/devicetree/bindings/pci/mvebu-pci.txt
>> +++ b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
>> @@ -1,6 +1,7 @@
>> * Marvell EBU PCIe interfaces
>>
>> Mandatory properties:
>> +
>> - compatible: one of the following values:
>> marvell,armada-370-pcie
>> marvell,armada-xp-pcie
>> @@ -10,11 +11,49 @@ Mandatory properties:
>> - #interrupt-cells, set to <1>
>> - bus-range: PCI bus numbers covered
>> - device_type, set to "pci"
>> -- ranges: ranges for the PCI memory and I/O regions, as well as the
>> - MMIO registers to control the PCIe interfaces.
>> +- ranges: ranges describing the MMIO registers to control the PCIe
>> + interfaces, and ranges describing the MBus windows needed to access
>> + the memory and I/O regions of each PCIe interface.
>> +
>> +The ranges describing the MMIO registers have the following layout:
>> +
>> + 0x82000000 0 r MBUS_ID(0xf0, 0x01) r 0 s
>> +
>> +where:
>> +
>> + * r is a 32-bits value that gives the offset of the MMIO
>> + registers of this PCIe interface, from the base of the internal
>> + registers.
>> +
>> + * s is a 32-bits value that give the size of this MMIO
>> + registers area. This range entry translates the '0x82000000 0 r' PCI
>> + address into the 'MBUS_ID(0xf0, 0x01) r' CPU address, which is part
>> + of the internal register window (as identified by MBUS_ID(0xf0,
>> + 0x01)).
>> +
>> +The ranges describing the MBus windows have the following layout:
>> +
>> + 0x8t000000 s 0 MBUS_ID(w, a) 0 1 0
>> +
>> +where:
>> +
>> + * t is the type of the MBus window (as defined by the standard PCI DT
>> + bindings), 1 for I/O and 2 for memory.
>>
>> -In addition, the Device Tree node must have sub-nodes describing each
>> + * s is the PCI slot that corresponds to this PCIe interface
>> +
>> + * w is the 'target ID' value for the MBus window
>> +
>> + * a the 'attribute' value for the MBus window.
>> +
>> +Since the location and size of the different MBus windows is not fixed in
>> +hardware, and only determined in runtime, those ranges cover the full first
>> +4 GB of the physical address space, and do not translate into a valid CPU
>> +address.
>> +
>> +In addition, the device tree node must have sub-nodes describing each
>> PCIe interface, having the following mandatory properties:
>> +
>> - reg: used only for interrupt mapping, so only the first four bytes
>> are used to refer to the correct bus number and device number.
>> - assigned-addresses: reference to the MMIO registers used to control
>> @@ -26,7 +65,8 @@ PCIe interface, having the following mandatory properties:
>> - #address-cells, set to <3>
>> - #size-cells, set to <2>
>> - #interrupt-cells, set to <1>
>> -- ranges, empty property.
>> +- ranges, translating the MBus windows ranges of the parent node into
>> + standard PCI addresses.
>> - interrupt-map-mask and interrupt-map, standard PCI properties to
>> define the mapping of the PCIe interface to interrupt numbers.
>>
>> @@ -47,27 +87,50 @@ pcie-controller {
>>
>> bus-range = <0x00 0xff>;
>>
>> - ranges = <0x82000000 0 0xd0040000 0xd0040000 0 0x00002000 /* Port 0.0 registers */
>> - 0x82000000 0 0xd0042000 0xd0042000 0 0x00002000 /* Port 2.0 registers */
>> - 0x82000000 0 0xd0044000 0xd0044000 0 0x00002000 /* Port 0.1 registers */
>> - 0x82000000 0 0xd0048000 0xd0048000 0 0x00002000 /* Port 0.2 registers */
>> - 0x82000000 0 0xd004c000 0xd004c000 0 0x00002000 /* Port 0.3 registers */
>> - 0x82000000 0 0xd0080000 0xd0080000 0 0x00002000 /* Port 1.0 registers */
>> - 0x82000000 0 0xd0082000 0xd0082000 0 0x00002000 /* Port 3.0 registers */
>> - 0x82000000 0 0xd0084000 0xd0084000 0 0x00002000 /* Port 1.1 registers */
>> - 0x82000000 0 0xd0088000 0xd0088000 0 0x00002000 /* Port 1.2 registers */
>> - 0x82000000 0 0xd008c000 0xd008c000 0 0x00002000 /* Port 1.3 registers */
>> - 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
>> - 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
>> + ranges =
>> + <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
>> + 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
>> + 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
>> + 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
>> + 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
>> + 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
>> + 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */
>> + 0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000 /* Port 1.1 registers */
>> + 0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000 /* Port 1.2 registers */
>> + 0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000 /* Port 1.3 registers */
>> + 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
>> + 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
>> + 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
>> + 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO */
>> + 0x82000000 0x3 0 MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
>> + 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
>> + 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
>> + 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
>> +
>> + 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
>> + 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
>> + 0x82000000 0x6 0 MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */
>> + 0x81000000 0x6 0 MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO */
>> + 0x82000000 0x7 0 MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */
>> + 0x81000000 0x7 0 MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO */
>> + 0x82000000 0x8 0 MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */
>> + 0x81000000 0x8 0 MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO */
>> +
>> + 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
>> + 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */
>> +
>> + 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
>> + 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>;
>>
>> pcie at 1,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82000800 0 0xd0040000 0 0x2000>;
>> + assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
>> reg = <0x0800 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
>> + 0x81000000 0 0 0x81000000 0x1 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 58>;
>> marvell,pcie-port = <0>;
>> @@ -78,12 +141,13 @@ pcie-controller {
>>
>> pcie at 2,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82001000 0 0xd0044000 0 0x2000>;
>> + assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
>> reg = <0x1000 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
>> + 0x81000000 0 0 0x81000000 0x2 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 59>;
>> marvell,pcie-port = <0>;
>> @@ -94,12 +158,13 @@ pcie-controller {
>>
>> pcie at 3,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82001800 0 0xd0048000 0 0x2000>;
>> + assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
>> reg = <0x1800 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
>> + 0x81000000 0 0 0x81000000 0x3 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 60>;
>> marvell,pcie-port = <0>;
>> @@ -110,12 +175,13 @@ pcie-controller {
>>
>> pcie at 4,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82002000 0 0xd004c000 0 0x2000>;
>> + assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
>> reg = <0x2000 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
>> + 0x81000000 0 0 0x81000000 0x4 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 61>;
>> marvell,pcie-port = <0>;
>> @@ -126,12 +192,13 @@ pcie-controller {
>>
>> pcie at 5,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82002800 0 0xd0080000 0 0x2000>;
>> + assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
>> reg = <0x2800 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
>> + 0x81000000 0 0 0x81000000 0x5 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 62>;
>> marvell,pcie-port = <1>;
>> @@ -142,12 +209,13 @@ pcie-controller {
>>
>> pcie at 6,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82003000 0 0xd0084000 0 0x2000>;
>> + assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
>> reg = <0x3000 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
>> + 0x81000000 0 0 0x81000000 0x6 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 63>;
>> marvell,pcie-port = <1>;
>> @@ -158,12 +226,13 @@ pcie-controller {
>>
>> pcie at 7,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82003800 0 0xd0088000 0 0x2000>;
>> + assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
>> reg = <0x3800 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
>> + 0x81000000 0 0 0x81000000 0x7 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 64>;
>> marvell,pcie-port = <1>;
>> @@ -174,12 +243,13 @@ pcie-controller {
>>
>> pcie at 8,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82004000 0 0xd008c000 0 0x2000>;
>> + assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
>> reg = <0x4000 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
>> + 0x81000000 0 0 0x81000000 0x8 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 65>;
>> marvell,pcie-port = <1>;
>> @@ -187,14 +257,16 @@ pcie-controller {
>> clocks = <&gateclk 12>;
>> status = "disabled";
>> };
>> +
>> pcie at 9,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82004800 0 0xd0042000 0 0x2000>;
>> + assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
>> reg = <0x4800 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
>> + 0x81000000 0 0 0x81000000 0x9 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 99>;
>> marvell,pcie-port = <2>;
>> @@ -205,12 +277,13 @@ pcie-controller {
>>
>> pcie at 10,0 {
>> device_type = "pci";
>> - assigned-addresses = <0x82005000 0 0xd0082000 0 0x2000>;
>> + assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
>> reg = <0x5000 0 0 0 0>;
>> #address-cells = <3>;
>> #size-cells = <2>;
>> #interrupt-cells = <1>;
>> - ranges;
>> + ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
>> + 0x81000000 0 0 0x81000000 0xa 0 1 0>;
>> interrupt-map-mask = <0 0 0 0>;
>> interrupt-map = <0 0 0 0 &mpic 103>;
>> marvell,pcie-port = <3>;
>> diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
>> index 13a633b..424a7b8 100644
>> --- a/drivers/pci/host/pci-mvebu.c
>> +++ b/drivers/pci/host/pci-mvebu.c
>> @@ -123,6 +123,10 @@ struct mvebu_pcie_port {
>> u32 port;
>> u32 lane;
>> int devfn;
>> + unsigned int mem_target;
>> + unsigned int mem_attr;
>> + unsigned int io_target;
>> + unsigned int io_attr;
>> struct clk *clk;
>> struct mvebu_sw_pci_bridge bridge;
>> struct device_node *dn;
>> @@ -307,10 +311,9 @@ static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port)
>> (port->bridge.iolimitupper << 16)) -
>> iobase);
>>
>> - mvebu_mbus_add_window_remap_flags(port->name, port->iowin_base,
>> - port->iowin_size,
>> - iobase,
>> - MVEBU_MBUS_PCI_IO);
>> + mvebu_mbus_add_window_remap_by_id(port->io_target, port->io_attr,
>> + port->iowin_base, port->iowin_size,
>> + iobase);
>>
>> pci_ioremap_io(iobase, port->iowin_base);
>> }
>> @@ -342,10 +345,8 @@ static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port)
>> (((port->bridge.memlimit & 0xFFF0) << 16) | 0xFFFFF) -
>> port->memwin_base;
>>
>> - mvebu_mbus_add_window_remap_flags(port->name, port->memwin_base,
>> - port->memwin_size,
>> - MVEBU_MBUS_NO_REMAP,
>> - MVEBU_MBUS_PCI_MEM);
>> + mvebu_mbus_add_window_by_id(port->mem_target, port->mem_attr,
>> + port->memwin_base, port->memwin_size);
>> }
>>
>> /*
>> @@ -755,12 +756,54 @@ mvebu_pcie_map_registers(struct platform_device *pdev,
>> return devm_request_and_ioremap(&pdev->dev, ®s);
>> }
>>
>> +#define DT_FLAGS_TO_TYPE(flags) (((flags) >> 24) & 0x03)
>> +#define DT_TYPE_IO 0x1
>> +#define DT_TYPE_MEM32 0x2
>> +#define DT_CPUADDR_TO_TARGET(cpuaddr) (((cpuaddr) >> 56) & 0xFF)
>> +#define DT_CPUADDR_TO_ATTR(cpuaddr) (((cpuaddr) >> 48) & 0xFF)
>> +
>> +static int mvebu_get_tgt_attr(struct device_node *np, int devfn,
>> + unsigned long type, int *tgt, int *attr)
>> +{
>> + const int na = 3, ns = 2;
>> + const __be32 *range;
>> + int rlen, nranges, rangesz, pna, i;
>> +
>> + range = of_get_property(np, "ranges", &rlen);
>> + if (!range)
>> + return -EINVAL;
>> +
>> + pna = of_n_addr_cells(np);
>> + rangesz = pna + na + ns;
>> + nranges = rlen / sizeof(__be32) / rangesz;
>> +
>> + for (i = 0; i < nranges; i++) {
>> + u32 flags = of_read_number(range, 1);
>> + u32 slot = of_read_number(range, 2);
>> + u64 cpuaddr = of_read_number(range + na, pna);
>> + unsigned long rtype;
>> +
>> + if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_IO)
>> + rtype = IORESOURCE_IO;
>> + else if (DT_FLAGS_TO_TYPE(flags) == DT_TYPE_MEM32)
>> + rtype = IORESOURCE_MEM;
>> +
>> + if (slot == PCI_SLOT(devfn) && type == rtype) {
>> + *tgt = DT_CPUADDR_TO_TARGET(cpuaddr);
>> + *attr = DT_CPUADDR_TO_ATTR(cpuaddr);
>> + return 0;
>> + }
>> +
>> + range += rangesz;
>> + }
>> +
>> + return -ENOENT;
>> +}
>> +
>> static int __init mvebu_pcie_probe(struct platform_device *pdev)
>> {
>> struct mvebu_pcie *pcie;
>> struct device_node *np = pdev->dev.of_node;
>> - struct of_pci_range range;
>> - struct of_pci_range_parser parser;
>> struct device_node *child;
>> int i, ret;
>>
>> @@ -771,29 +814,25 @@ static int __init mvebu_pcie_probe(struct platform_device *pdev)
>>
>> pcie->pdev = pdev;
>>
>> - if (of_pci_range_parser_init(&parser, np))
>> + /* Get the PCIe memory and I/O aperture */
>> + mvebu_mbus_get_pcie_mem_aperture(&pcie->mem);
>> + if (resource_size(&pcie->mem) == 0) {
>> + dev_err(&pdev->dev, "invalid memory aperture size\n");
>> return -EINVAL;
>> + }
>>
>> - /* Get the I/O and memory ranges from DT */
>> - for_each_of_pci_range(&parser, &range) {
>> - unsigned long restype = range.flags & IORESOURCE_TYPE_BITS;
>> - if (restype == IORESOURCE_IO) {
>> - of_pci_range_to_resource(&range, np, &pcie->io);
>> - of_pci_range_to_resource(&range, np, &pcie->realio);
>> - pcie->io.name = "I/O";
>> - pcie->realio.start = max_t(resource_size_t,
>> - PCIBIOS_MIN_IO,
>> - range.pci_addr);
>> - pcie->realio.end = min_t(resource_size_t,
>> - IO_SPACE_LIMIT,
>> - range.pci_addr + range.size);
>> - }
>> - if (restype == IORESOURCE_MEM) {
>> - of_pci_range_to_resource(&range, np, &pcie->mem);
>> - pcie->mem.name = "MEM";
>> - }
>> + mvebu_mbus_get_pcie_io_aperture(&pcie->io);
>> + if (resource_size(&pcie->io) == 0) {
>> + dev_err(&pdev->dev, "invalid I/O aperture size\n");
>> + return -EINVAL;
>> }
>>
>> + pcie->realio.flags = pcie->io.flags;
>> + pcie->realio.start = PCIBIOS_MIN_IO;
>> + pcie->realio.end = min_t(resource_size_t,
>> + IO_SPACE_LIMIT,
>> + resource_size(&pcie->io));
>> +
>> /* Get the bus range */
>> ret = of_pci_parse_bus_range(np, &pcie->busn);
>> if (ret) {
>> @@ -841,6 +880,22 @@ static int __init mvebu_pcie_probe(struct platform_device *pdev)
>> if (port->devfn < 0)
>> continue;
>>
>> + ret = mvebu_get_tgt_attr(np, port->devfn, IORESOURCE_MEM,
>> + &port->mem_target, &port->mem_attr);
>> + if (ret < 0) {
>> + dev_err(&pdev->dev, "PCIe%d.%d: cannot get tgt/attr for mem window\n",
>> + port->port, port->lane);
>> + continue;
>> + }
>> +
>> + ret = mvebu_get_tgt_attr(np, port->devfn, IORESOURCE_IO,
>> + &port->io_target, &port->io_attr);
>> + if (ret < 0) {
>> + dev_err(&pdev->dev, "PCIe%d.%d: cannot get tgt/attr for io window\n",
>> + port->port, port->lane);
>> + continue;
>> + }
>> +
>> port->base = mvebu_pcie_map_registers(pdev, child, port);
>> if (!port->base) {
>> dev_err(&pdev->dev, "PCIe%d.%d: cannot map registers\n",
>> --
>> 1.8.1.5
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the devicetree-discuss
mailing list