提交 8cdabfdd 编写于 作者: P Pali Rohár 提交者: Lorenzo Pieralisi

PCI: mvebu: Check for valid ports

Some mvebu ports do not have to be initialized. So skip these uninitialized
mvebu ports in every port iteration function to prevent access to unmapped
memory or dereferencing NULL pointers. Uninitialized mvebu port has base
address set to NULL.

Link: https://lore.kernel.org/r/20211125124605.25915-2-pali@kernel.orgSigned-off-by: NPali Rohár <pali@kernel.org>
Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
上级 600b7903
...@@ -606,6 +606,9 @@ static struct mvebu_pcie_port *mvebu_pcie_find_port(struct mvebu_pcie *pcie, ...@@ -606,6 +606,9 @@ static struct mvebu_pcie_port *mvebu_pcie_find_port(struct mvebu_pcie *pcie,
for (i = 0; i < pcie->nports; i++) { for (i = 0; i < pcie->nports; i++) {
struct mvebu_pcie_port *port = &pcie->ports[i]; struct mvebu_pcie_port *port = &pcie->ports[i];
if (!port->base)
continue;
if (bus->number == 0 && port->devfn == devfn) if (bus->number == 0 && port->devfn == devfn)
return port; return port;
if (bus->number != 0 && if (bus->number != 0 &&
...@@ -781,6 +784,8 @@ static int mvebu_pcie_suspend(struct device *dev) ...@@ -781,6 +784,8 @@ static int mvebu_pcie_suspend(struct device *dev)
pcie = dev_get_drvdata(dev); pcie = dev_get_drvdata(dev);
for (i = 0; i < pcie->nports; i++) { for (i = 0; i < pcie->nports; i++) {
struct mvebu_pcie_port *port = pcie->ports + i; struct mvebu_pcie_port *port = pcie->ports + i;
if (!port->base)
continue;
port->saved_pcie_stat = mvebu_readl(port, PCIE_STAT_OFF); port->saved_pcie_stat = mvebu_readl(port, PCIE_STAT_OFF);
} }
...@@ -795,6 +800,8 @@ static int mvebu_pcie_resume(struct device *dev) ...@@ -795,6 +800,8 @@ static int mvebu_pcie_resume(struct device *dev)
pcie = dev_get_drvdata(dev); pcie = dev_get_drvdata(dev);
for (i = 0; i < pcie->nports; i++) { for (i = 0; i < pcie->nports; i++) {
struct mvebu_pcie_port *port = pcie->ports + i; struct mvebu_pcie_port *port = pcie->ports + i;
if (!port->base)
continue;
mvebu_writel(port, port->saved_pcie_stat, PCIE_STAT_OFF); mvebu_writel(port, port->saved_pcie_stat, PCIE_STAT_OFF);
mvebu_pcie_setup_hw(port); mvebu_pcie_setup_hw(port);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册