|
@@ -430,6 +430,9 @@ static int kirin_pcie_host_init(struct pcie_port *pp)
|
|
|
{
|
|
|
kirin_pcie_establish_link(pp);
|
|
|
|
|
|
+ if (IS_ENABLED(CONFIG_PCI_MSI))
|
|
|
+ dw_pcie_msi_init(pp);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -445,9 +448,34 @@ static const struct dw_pcie_host_ops kirin_pcie_host_ops = {
|
|
|
.host_init = kirin_pcie_host_init,
|
|
|
};
|
|
|
|
|
|
+static int kirin_pcie_add_msi(struct dw_pcie *pci,
|
|
|
+ struct platform_device *pdev)
|
|
|
+{
|
|
|
+ int irq;
|
|
|
+
|
|
|
+ if (IS_ENABLED(CONFIG_PCI_MSI)) {
|
|
|
+ irq = platform_get_irq(pdev, 0);
|
|
|
+ if (irq < 0) {
|
|
|
+ dev_err(&pdev->dev,
|
|
|
+ "failed to get MSI IRQ (%d)\n", irq);
|
|
|
+ return irq;
|
|
|
+ }
|
|
|
+
|
|
|
+ pci->pp.msi_irq = irq;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int __init kirin_add_pcie_port(struct dw_pcie *pci,
|
|
|
struct platform_device *pdev)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = kirin_pcie_add_msi(pci, pdev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
pci->pp.ops = &kirin_pcie_host_ops;
|
|
|
|
|
|
return dw_pcie_host_init(&pci->pp);
|