]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI: rcar: Move the inbound index check
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Sat, 26 Oct 2019 18:26:58 +0000 (20:26 +0200)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 11 Nov 2019 14:29:20 +0000 (14:29 +0000)
Since the 'idx' variable value is stored across multiple calls to
rcar_pcie_inbound_ranges() function, and the 'idx' value is used to
index registers which are written, subsequent calls might cause
the 'idx' value to be high enough to trigger writes into nonexistent
registers.

Fix this by moving the 'idx' value check to the beginning of the loop.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Wolfram Sang <wsa@the-dreams.de>
Cc: linux-renesas-soc@vger.kernel.org
drivers/pci/controller/pcie-rcar.c

index ee1c38c2fac9e69689fa9febf25c05301dfa6386..04ff6c4baa70fe7de3930ee90e946244f3391351 100644 (file)
@@ -1046,6 +1046,10 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
        mask &= ~0xf;
 
        while (cpu_addr < cpu_end) {
+               if (idx >= MAX_NR_INBOUND_MAPS - 1) {
+                       dev_err(pcie->dev, "Failed to map inbound regions!\n");
+                       return -EINVAL;
+               }
                /*
                 * Set up 64-bit inbound regions as the range parser doesn't
                 * distinguish between 32 and 64-bit types.
@@ -1065,11 +1069,6 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
                pci_addr += size;
                cpu_addr += size;
                idx += 2;
-
-               if (idx > MAX_NR_INBOUND_MAPS) {
-                       dev_err(pcie->dev, "Failed to map inbound regions!\n");
-                       return -EINVAL;
-               }
        }
        *index = idx;