From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-4.3 required=5.0 tests=ALL_TRUSTED,BAYES_00, RP_MATCHES_RCVD autolearn=ham autolearn_force=no version=3.4.1 From: Daniil Gnusarev To: devel-kernel@lists.altlinux.org Date: Mon, 14 Oct 2024 18:02:12 +0400 Message-ID: <20241014140221.535985-32-gnusarevda@basealt.ru> X-Mailer: git-send-email 2.42.2 In-Reply-To: <20241014140221.535985-1-gnusarevda@basealt.ru> References: <20241014140221.535985-1-gnusarevda@basealt.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [d-kernel] [PATCH 31/39] pci: baikal-pcie: driver compatibility with SDK versions 5.4 X-BeenThere: devel-kernel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux kernel packages development List-Id: ALT Linux kernel packages development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Oct 2024 14:02:15 -0000 Archived-At: List-Archive: List-Post: In SDK version 5.4 for PCIe devices the interrupt names required for the driver are not specified. In this case, interrupts are determined by index. In addition, the "msi-map" property is used as in subsequent versions of SDK. Signed-off-by: Daniil Gnusarev --- drivers/pci/controller/dwc/pcie-baikal-core.c | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-baikal-core.c b/drivers/pci/controller/dwc/pcie-baikal-core.c index 19cb589e48db6..242503bffd888 100644 --- a/drivers/pci/controller/dwc/pcie-baikal-core.c +++ b/drivers/pci/controller/dwc/pcie-baikal-core.c @@ -640,10 +640,62 @@ static int bm1000_add_pcie_port(struct platform_device *pdev) struct dw_pcie_rp *pp = &pci->pp; int ret; - pp->irq = platform_get_irq_byname(pdev, "aer"); + pp->irq = platform_get_irq_byname_optional(pdev, "aer"); if (pp->irq < 0) { - dev_err(dev, "failed to get \"aer\" IRQ\n"); - return pp->irq; + dev_warn(dev, "failed to get \"aer\" IRQ, trying to get by index\n"); + pp->irq = platform_get_irq(pdev, 0); + if (pp->irq < 0) { + dev_err(dev, "failed to get \"aer\" IRQ\n"); + return pp->irq; + } + if (IS_ENABLED(CONFIG_PCI_MSI)) { + u32 lcru[2]; + u32 maps[4]; + struct of_changeset ocs; + struct property *prop; + + pp->msi_irq[0] = platform_get_irq(pdev, 1); + if (pp->msi_irq[0] < 0) { + dev_err(dev, "failed to get \"msi\" IRQ\n"); + return pp->msi_irq[0]; + } + + if (of_property_read_u32_array(dev->of_node, "baikal,pcie-lcru", lcru, 2)) { + dev_err(dev, "failed to read LCRU\n"); + return -EINVAL; + } + if (of_property_read_u32_array(dev->of_node, "msi-map", maps, 4)) { + dev_err(dev, "failed to read msi-map\n"); + return -EINVAL; + } + + of_changeset_init(&ocs); + + prop = of_find_property(dev->of_node, "msi-map", NULL); + if (!prop) { + dev_err(dev, "failed to find property msi-map\n"); + return -EINVAL; + } + + ret=of_changeset_remove_property(&ocs, dev->of_node, prop); + if (ret) { + dev_err(dev, "failed to remove property msi-map\n"); + return ret; + } + + maps[2] = lcru[1] * 0x10000; + ret=of_changeset_add_prop_u32_array(&ocs,dev->of_node,"msi-map",maps,4); + if (ret) { + dev_err(dev, "failed to modify property msi-map\n"); + return ret; + } + + ret=of_changeset_apply(&ocs); + if (ret) { + dev_err(dev, "failed to modify property msi-map\n"); + return ret; + } + } } ret = devm_request_irq(dev, pp->irq, bm1000_pcie_aer_irq_handler, -- 2.42.2