Commit 699ca301 authored by Kangjie Lu's avatar Kangjie Lu Committed by Lorenzo Pieralisi
Browse files

PCI: xilinx: Check for __get_free_pages() failure



If __get_free_pages() fails, return -ENOMEM to avoid a NULL pointer
dereference.

Signed-off-by: default avatarKangjie Lu <kjlu@umn.edu>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Reviewed-by: default avatarMukesh Ojha <mojha@codeaurora.org>
parent 9e98c678
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -336,14 +336,19 @@ static const struct irq_domain_ops msi_domain_ops = {
 * xilinx_pcie_enable_msi - Enable MSI support
 * @port: PCIe port information
 */
static void xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
static int xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
{
	phys_addr_t msg_addr;

	port->msi_pages = __get_free_pages(GFP_KERNEL, 0);
	if (!port->msi_pages)
		return -ENOMEM;

	msg_addr = virt_to_phys((void *)port->msi_pages);
	pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1);
	pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2);

	return 0;
}

/* INTx Functions */
@@ -498,6 +503,7 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port)
	struct device *dev = port->dev;
	struct device_node *node = dev->of_node;
	struct device_node *pcie_intc_node;
	int ret;

	/* Setup INTx */
	pcie_intc_node = of_get_next_child(node, NULL);
@@ -526,7 +532,9 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port)
			return -ENODEV;
		}

		xilinx_pcie_enable_msi(port);
		ret = xilinx_pcie_enable_msi(port);
		if (ret)
			return ret;
	}

	return 0;