lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 124/266] PCI: rcar: Fix incorrect programming of OB windows
    Date
    From: Andrew Murray <andrew.murray@arm.com>

    [ Upstream commit 2b9f217433e31d125fb697ca7974d3de3ecc3e92 ]

    The outbound windows (PCIEPAUR(x), PCIEPALR(x)) describe a mapping between
    a CPU address (which is determined by the window number 'x') and a
    programmed PCI address - Thus allowing the controller to translate CPU
    accesses into PCI accesses.

    However the existing code incorrectly writes the CPU address - lets fix
    this by writing the PCI address instead.

    For memory transactions, existing DT users describe a 1:1 identity mapping
    and thus this change should have no effect. However the same isn't true for
    I/O.

    Link: https://lore.kernel.org/r/20191004132941.6660-1-andrew.murray@arm.com
    Fixes: c25da4778803 ("PCI: rcar: Add Renesas R-Car PCIe driver")
    Tested-by: Marek Vasut <marek.vasut+renesas@gmail.com>
    Signed-off-by: Andrew Murray <andrew.murray@arm.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Vasut <marek.vasut+renesas@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/controller/pcie-rcar.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
    index 1ad0b56f11b4..04114352d0e7 100644
    --- a/drivers/pci/controller/pcie-rcar.c
    +++ b/drivers/pci/controller/pcie-rcar.c
    @@ -335,11 +335,12 @@ static struct pci_ops rcar_pcie_ops = {
    };

    static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie,
    - struct resource *res)
    + struct resource_entry *window)
    {
    /* Setup PCIe address space mappings for each resource */
    resource_size_t size;
    resource_size_t res_start;
    + struct resource *res = window->res;
    u32 mask;

    rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win));
    @@ -353,9 +354,9 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie,
    rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win));

    if (res->flags & IORESOURCE_IO)
    - res_start = pci_pio_to_address(res->start);
    + res_start = pci_pio_to_address(res->start) - window->offset;
    else
    - res_start = res->start;
    + res_start = res->start - window->offset;

    rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPAUR(win));
    rcar_pci_write_reg(pcie, lower_32_bits(res_start) & ~0x7F,
    @@ -384,7 +385,7 @@ static int rcar_pcie_setup(struct list_head *resource, struct rcar_pcie *pci)
    switch (resource_type(res)) {
    case IORESOURCE_IO:
    case IORESOURCE_MEM:
    - rcar_pcie_setup_window(i, pci, res);
    + rcar_pcie_setup_window(i, pci, win);
    i++;
    break;
    case IORESOURCE_BUS:
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-18 03:23    [W:2.325 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site