|
@@ -336,14 +336,19 @@ static const struct irq_domain_ops msi_domain_ops = {
|
|
|
* xilinx_pcie_enable_msi - Enable MSI support
|
|
* xilinx_pcie_enable_msi - Enable MSI support
|
|
|
* @port: PCIe port information
|
|
* @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;
|
|
phys_addr_t msg_addr;
|
|
|
|
|
|
|
|
port->msi_pages = __get_free_pages(GFP_KERNEL, 0);
|
|
port->msi_pages = __get_free_pages(GFP_KERNEL, 0);
|
|
|
|
|
+ if (!port->msi_pages)
|
|
|
|
|
+ return -ENOMEM;
|
|
|
|
|
+
|
|
|
msg_addr = virt_to_phys((void *)port->msi_pages);
|
|
msg_addr = virt_to_phys((void *)port->msi_pages);
|
|
|
pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1);
|
|
pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1);
|
|
|
pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2);
|
|
pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* INTx Functions */
|
|
/* 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 *dev = port->dev;
|
|
|
struct device_node *node = dev->of_node;
|
|
struct device_node *node = dev->of_node;
|
|
|
struct device_node *pcie_intc_node;
|
|
struct device_node *pcie_intc_node;
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
|
|
/* Setup INTx */
|
|
/* Setup INTx */
|
|
|
pcie_intc_node = of_get_next_child(node, NULL);
|
|
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;
|
|
return -ENODEV;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- xilinx_pcie_enable_msi(port);
|
|
|
|
|
|
|
+ ret = xilinx_pcie_enable_msi(port);
|
|
|
|
|
+ if (ret)
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|