PCI: rcar: Move the inbound index check
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
This commit is contained in:
Родитель
af072edb83
Коммит
85bff4c3d3
|
@ -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;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче