Message ID | 20231214072839.2367-13-minda.chen@starfivetech.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:3b04:b0:fb:cd0c:d3e with SMTP id c4csp8373832dys; Wed, 13 Dec 2023 23:30:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IGbF5CNsS8WyALDe7vE6wXbqFGTVoQj5pNgF2GuoQmFH6qsVPQ72fy62/sbxgTNHq1pRfPS X-Received: by 2002:a05:6808:11d0:b0:3ba:4c6:f3ae with SMTP id p16-20020a05680811d000b003ba04c6f3aemr9542724oiv.95.1702539050534; Wed, 13 Dec 2023 23:30:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702539050; cv=none; d=google.com; s=arc-20160816; b=ITcvQueSdGHtqr6nJNHCAuoJqjMUWPpiK/4NYeosepB+tZ3wcVcXDafF+T6FBzwbFQ 62PeX//5K6K7/CxvxBCmpYPyvcwWY+Hbl1Z9d5EI/cww1ft3iPK289IRvGeqlWnBV6l9 m04T1wcLw1tqB1UFEF2HvKTxubDp+CqERNpzMZ1yWVUJt/mIlzbbZ8lR4CrTIaIWeueF 9e5TPo/mUEYvs9BQTmkYzWDBpdfcnxXJTIrcc2blBO1Ul/lPLE9juaV49/JbtH0NKLFB mBa8pwElNucJzYsMuYpQ/82wLx2k2fwc4pu8PDuChyDmeIPrVWjVpuJ6l06Qort2sIIe dWsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=zeiARQkjr5yXBmGNlAPA24vMi1xF+eh6xcvnSmFzMEc=; fh=ld3UXb1S5Y4IkunPfuj6e9Ppmc+fy6ncC+eQtrVLfK8=; b=JoAYNtfENAtsW80j4oTgi9q6/RpUOEdOp+pNMBqExiwJEee8DU7Cn3Rx6kQeWutkGT x7URAJvGFqYyWrkEHMUwEhSAbTM25f2BQgVYYNotWLha5IIJl6dftehAOejx1v3caSrM e+oK+LZg3DW8n9zOVC8rfyCnkU9DIAajiOKu/KHmz2XAuwB99+xWnuPOnX0yUMgTrZCF aqoyvRoxKGZf1MjRUbC9fz4b/V1mrsxbGknIliAyDbj2UZQkCCk0XlTssQPEZbPfwD9q 3zY7M2Dy63H7v94X31xxQPG3XCtpOlMvwSCngg5OV2TAMVoaLhssWLWBej/FkJAsKVkD cSmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id e8-20020a056a001a8800b006ceb40f5acesi10988515pfv.334.2023.12.13.23.30.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 23:30:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id C23D080DB716; Wed, 13 Dec 2023 23:30:31 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1443372AbjLNHaI (ORCPT <rfc822;dexuan.linux@gmail.com> + 99 others); Thu, 14 Dec 2023 02:30:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1443390AbjLNH3k (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 14 Dec 2023 02:29:40 -0500 Received: from ex01.ufhost.com (ex01.ufhost.com [61.152.239.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A17BF11A; Wed, 13 Dec 2023 23:29:31 -0800 (PST) Received: from EXMBX166.cuchost.com (unknown [175.102.18.54]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "EXMBX166", Issuer "EXMBX166" (not verified)) by ex01.ufhost.com (Postfix) with ESMTP id 6959324E2FE; Thu, 14 Dec 2023 15:29:30 +0800 (CST) Received: from EXMBX171.cuchost.com (172.16.6.91) by EXMBX166.cuchost.com (172.16.6.76) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Thu, 14 Dec 2023 15:29:30 +0800 Received: from ubuntu.localdomain (113.72.145.168) by EXMBX171.cuchost.com (172.16.6.91) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Thu, 14 Dec 2023 15:29:27 +0800 From: Minda Chen <minda.chen@starfivetech.com> To: Conor Dooley <conor@kernel.org>, =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= <kw@linux.com>, Rob Herring <robh+dt@kernel.org>, Bjorn Helgaas <bhelgaas@google.com>, Lorenzo Pieralisi <lpieralisi@kernel.org>, "Daire McNamara" <daire.mcnamara@microchip.com>, Emil Renner Berthing <emil.renner.berthing@canonical.com>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org> CC: <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>, <linux-pci@vger.kernel.org>, Paul Walmsley <paul.walmsley@sifive.com>, Palmer Dabbelt <palmer@dabbelt.com>, Albert Ou <aou@eecs.berkeley.edu>, Philipp Zabel <p.zabel@pengutronix.de>, Mason Huo <mason.huo@starfivetech.com>, Leyfoon Tan <leyfoon.tan@starfivetech.com>, Kevin Xie <kevin.xie@starfivetech.com>, Minda Chen <minda.chen@starfivetech.com> Subject: [PATCH v13 12/21] PCI: microchip: Add request_event_irq() callback function Date: Thu, 14 Dec 2023 15:28:30 +0800 Message-ID: <20231214072839.2367-13-minda.chen@starfivetech.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20231214072839.2367-1-minda.chen@starfivetech.com> References: <20231214072839.2367-1-minda.chen@starfivetech.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [113.72.145.168] X-ClientProxiedBy: EXCAS064.cuchost.com (172.16.6.24) To EXMBX171.cuchost.com (172.16.6.91) X-YovoleRuleAgent: yovoleflag X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Wed, 13 Dec 2023 23:30:32 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785241587722459262 X-GMAIL-MSGID: 1785241587722459262 |
Series |
Refactoring Microchip PCIe driver and add StarFive PCIe
|
|
Commit Message
Minda Chen
Dec. 14, 2023, 7:28 a.m. UTC
PolarFire implements specific PCIe interrupts except PLDA local interrupt. For lack of MSI controller, these interrupts have to be added to global event field. PolarFire PCIe driver also register additional interrupt symbol name. PolarFire PCIe contain total 28 interrupts event while PLDA contain 13 local interrupts event, interrupt to event num mapping is different. So add a callback function to support different IRQ register function. Also Add PLDA default handler function, which will be moved to pcie- plda-host.c in moving codes patch. Signed-off-by: Minda Chen <minda.chen@starfivetech.com> Acked-by: Conor Dooley <conor.dooley@microchip.com> --- .../pci/controller/plda/pcie-microchip-host.c | 31 ++++++++++++++++--- drivers/pci/controller/plda/pcie-plda.h | 5 +++ 2 files changed, 32 insertions(+), 4 deletions(-)
Comments
On Thu, Dec 14, 2023 at 03:28:30PM +0800, Minda Chen wrote: > PolarFire implements specific PCIe interrupts except PLDA local interrupt. Please explain to me what you want to say here. > For lack of MSI controller, these interrupts have to be added to global > event field. PolarFire PCIe driver also register additional interrupt > symbol name. And here. > PolarFire PCIe contain total 28 interrupts event while PLDA contain 13 > local interrupts event, interrupt to event num mapping is different. It "is different" in different platforms ? Is that correct ? > So add a callback function to support different IRQ register function. > Also Add PLDA default handler function, which will be moved to pcie- > plda-host.c in moving codes patch. As I said before, a patch is a single self-contained change, don't refer to other patches, they may or may not be merged or even exist by the time this one hits mainline. Lorenzo > Signed-off-by: Minda Chen <minda.chen@starfivetech.com> > Acked-by: Conor Dooley <conor.dooley@microchip.com> > --- > .../pci/controller/plda/pcie-microchip-host.c | 31 ++++++++++++++++--- > drivers/pci/controller/plda/pcie-plda.h | 5 +++ > 2 files changed, 32 insertions(+), 4 deletions(-) > > diff --git a/drivers/pci/controller/plda/pcie-microchip-host.c b/drivers/pci/controller/plda/pcie-microchip-host.c > index 7b3f4f74745d..624e4e2e97d3 100644 > --- a/drivers/pci/controller/plda/pcie-microchip-host.c > +++ b/drivers/pci/controller/plda/pcie-microchip-host.c > @@ -643,6 +643,11 @@ static irqreturn_t mc_event_handler(int irq, void *dev_id) > return IRQ_HANDLED; > } > > +static irqreturn_t plda_event_handler(int irq, void *dev_id) > +{ > + return IRQ_HANDLED; > +} > + > static void plda_handle_event(struct irq_desc *desc) > { > struct plda_pcie_rp *port = irq_desc_get_handler_data(desc); > @@ -804,6 +809,17 @@ static int mc_pcie_init_clks(struct device *dev) > return 0; > } > > +static int mc_request_event_irq(struct plda_pcie_rp *plda, int event_irq, > + int event) > +{ > + return devm_request_irq(plda->dev, event_irq, mc_event_handler, > + 0, event_cause[event].sym, plda); > +} > + > +static const struct plda_event mc_event = { > + .request_event_irq = mc_request_event_irq, > +}; > + > static int plda_pcie_init_irq_domains(struct plda_pcie_rp *port) > { > struct device *dev = port->dev; > @@ -905,7 +921,9 @@ static void mc_disable_interrupts(struct mc_pcie *port) > writel_relaxed(GENMASK(31, 0), bridge_base_addr + ISTATUS_HOST); > } > > -static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_rp *port) > +static int plda_init_interrupts(struct platform_device *pdev, > + struct plda_pcie_rp *port, > + const struct plda_event *event) > { > struct device *dev = &pdev->dev; > int irq; > @@ -929,8 +947,13 @@ static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_r > return -ENXIO; > } > > - ret = devm_request_irq(dev, event_irq, mc_event_handler, > - 0, event_cause[i].sym, port); > + if (event->request_event_irq) > + ret = event->request_event_irq(port, event_irq, i); > + else > + ret = devm_request_irq(dev, event_irq, > + plda_event_handler, > + 0, NULL, port); > + > if (ret) { > dev_err(dev, "failed to request IRQ %d\n", event_irq); > return ret; > @@ -984,7 +1007,7 @@ static int mc_platform_init(struct pci_config_window *cfg) > return ret; > > /* Address translation is up; safe to enable interrupts */ > - ret = plda_init_interrupts(pdev, &port->plda); > + ret = plda_init_interrupts(pdev, &port->plda, &mc_event); > if (ret) > return ret; > > diff --git a/drivers/pci/controller/plda/pcie-plda.h b/drivers/pci/controller/plda/pcie-plda.h > index e3d35cef9894..28ed1374e1de 100644 > --- a/drivers/pci/controller/plda/pcie-plda.h > +++ b/drivers/pci/controller/plda/pcie-plda.h > @@ -121,6 +121,11 @@ struct plda_pcie_rp { > int num_events; > }; > > +struct plda_event { > + int (*request_event_irq)(struct plda_pcie_rp *pcie, > + int event_irq, int event); > +}; > + > void plda_pcie_setup_window(void __iomem *bridge_base_addr, u32 index, > phys_addr_t axi_addr, phys_addr_t pci_addr, > size_t size); > -- > 2.17.1 >
On 2023/12/28 0:01, Lorenzo Pieralisi wrote: > On Thu, Dec 14, 2023 at 03:28:30PM +0800, Minda Chen wrote: >> PolarFire implements specific PCIe interrupts except PLDA local interrupt. > > Please explain to me what you want to say here. > >> For lack of MSI controller, these interrupts have to be added to global >> event field. PolarFire PCIe driver also register additional interrupt >> symbol name. > > And here. > The sentence mean architecture should have an advance interrupt controller can support MSI interrupt and these new added interrupts should be added to MSI interrupt. (Like ARM GIC high level version) Maybe this commit message should be deleted. The commit message should claim why add request_event_irq() callback function. Add this callback function is for vendor register the interrupt handler and the name of new added PCIe interrupts. "new added PCIe interrupts" is mean microchip new added interrupt. #define EVENT_PCIE_L2_EXIT 0 #define EVENT_PCIE_HOTRST_EXIT 1 #define EVENT_PCIE_DLUP_EXIT 2 #define EVENT_SEC_TX_RAM_SEC_ERR 3 #define EVENT_SEC_RX_RAM_SEC_ERR 4 #define EVENT_SEC_PCIE2AXI_RAM_SEC_ERR 5 #define EVENT_SEC_AXI2PCIE_RAM_SEC_ERR 6 #define EVENT_DED_TX_RAM_DED_ERR 7 #define EVENT_DED_RX_RAM_DED_ERR 8 #define EVENT_DED_PCIE2AXI_RAM_DED_ERR 9 #define EVENT_DED_AXI2PCIE_RAM_DED_ERR 10 >> PolarFire PCIe contain total 28 interrupts event while PLDA contain 13 >> local interrupts event, interrupt to event num mapping is different. > > It "is different" in different platforms ? Is that correct ? > yes >> So add a callback function to support different IRQ register function. >> Also Add PLDA default handler function, which will be moved to pcie- >> plda-host.c in moving codes patch. > > As I said before, a patch is a single self-contained change, don't > refer to other patches, they may or may not be merged or even exist > by the time this one hits mainline. > > Lorenzo > OK. I will delete the "which will be moved to pcie-plda-host.c in moving codes patch" and change the commit message. >> Signed-off-by: Minda Chen <minda.chen@starfivetech.com> >> Acked-by: Conor Dooley <conor.dooley@microchip.com> >> --- >> .../pci/controller/plda/pcie-microchip-host.c | 31 ++++++++++++++++--- >> drivers/pci/controller/plda/pcie-plda.h | 5 +++ >> 2 files changed, 32 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/pci/controller/plda/pcie-microchip-host.c b/drivers/pci/controller/plda/pcie-microchip-host.c >> index 7b3f4f74745d..624e4e2e97d3 100644 >> --- a/drivers/pci/controller/plda/pcie-microchip-host.c >> +++ b/drivers/pci/controller/plda/pcie-microchip-host.c >> @@ -643,6 +643,11 @@ static irqreturn_t mc_event_handler(int irq, void *dev_id) >> return IRQ_HANDLED; >> } >> >> +static irqreturn_t plda_event_handler(int irq, void *dev_id) >> +{ >> + return IRQ_HANDLED; >> +} >> + >> static void plda_handle_event(struct irq_desc *desc) >> { >> struct plda_pcie_rp *port = irq_desc_get_handler_data(desc); >> @@ -804,6 +809,17 @@ static int mc_pcie_init_clks(struct device *dev) >> return 0; >> } >> >> +static int mc_request_event_irq(struct plda_pcie_rp *plda, int event_irq, >> + int event) >> +{ >> + return devm_request_irq(plda->dev, event_irq, mc_event_handler, >> + 0, event_cause[event].sym, plda); >> +} >> + >> +static const struct plda_event mc_event = { >> + .request_event_irq = mc_request_event_irq, >> +}; >> + >> static int plda_pcie_init_irq_domains(struct plda_pcie_rp *port) >> { >> struct device *dev = port->dev; >> @@ -905,7 +921,9 @@ static void mc_disable_interrupts(struct mc_pcie *port) >> writel_relaxed(GENMASK(31, 0), bridge_base_addr + ISTATUS_HOST); >> } >> >> -static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_rp *port) >> +static int plda_init_interrupts(struct platform_device *pdev, >> + struct plda_pcie_rp *port, >> + const struct plda_event *event) >> { >> struct device *dev = &pdev->dev; >> int irq; >> @@ -929,8 +947,13 @@ static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_r >> return -ENXIO; >> } >> >> - ret = devm_request_irq(dev, event_irq, mc_event_handler, >> - 0, event_cause[i].sym, port); >> + if (event->request_event_irq) >> + ret = event->request_event_irq(port, event_irq, i); >> + else >> + ret = devm_request_irq(dev, event_irq, >> + plda_event_handler, >> + 0, NULL, port); >> + >> if (ret) { >> dev_err(dev, "failed to request IRQ %d\n", event_irq); >> return ret; >> @@ -984,7 +1007,7 @@ static int mc_platform_init(struct pci_config_window *cfg) >> return ret; >> >> /* Address translation is up; safe to enable interrupts */ >> - ret = plda_init_interrupts(pdev, &port->plda); >> + ret = plda_init_interrupts(pdev, &port->plda, &mc_event); >> if (ret) >> return ret; >> >> diff --git a/drivers/pci/controller/plda/pcie-plda.h b/drivers/pci/controller/plda/pcie-plda.h >> index e3d35cef9894..28ed1374e1de 100644 >> --- a/drivers/pci/controller/plda/pcie-plda.h >> +++ b/drivers/pci/controller/plda/pcie-plda.h >> @@ -121,6 +121,11 @@ struct plda_pcie_rp { >> int num_events; >> }; >> >> +struct plda_event { >> + int (*request_event_irq)(struct plda_pcie_rp *pcie, >> + int event_irq, int event); >> +}; >> + >> void plda_pcie_setup_window(void __iomem *bridge_base_addr, u32 index, >> phys_addr_t axi_addr, phys_addr_t pci_addr, >> size_t size); >> -- >> 2.17.1 >>
diff --git a/drivers/pci/controller/plda/pcie-microchip-host.c b/drivers/pci/controller/plda/pcie-microchip-host.c index 7b3f4f74745d..624e4e2e97d3 100644 --- a/drivers/pci/controller/plda/pcie-microchip-host.c +++ b/drivers/pci/controller/plda/pcie-microchip-host.c @@ -643,6 +643,11 @@ static irqreturn_t mc_event_handler(int irq, void *dev_id) return IRQ_HANDLED; } +static irqreturn_t plda_event_handler(int irq, void *dev_id) +{ + return IRQ_HANDLED; +} + static void plda_handle_event(struct irq_desc *desc) { struct plda_pcie_rp *port = irq_desc_get_handler_data(desc); @@ -804,6 +809,17 @@ static int mc_pcie_init_clks(struct device *dev) return 0; } +static int mc_request_event_irq(struct plda_pcie_rp *plda, int event_irq, + int event) +{ + return devm_request_irq(plda->dev, event_irq, mc_event_handler, + 0, event_cause[event].sym, plda); +} + +static const struct plda_event mc_event = { + .request_event_irq = mc_request_event_irq, +}; + static int plda_pcie_init_irq_domains(struct plda_pcie_rp *port) { struct device *dev = port->dev; @@ -905,7 +921,9 @@ static void mc_disable_interrupts(struct mc_pcie *port) writel_relaxed(GENMASK(31, 0), bridge_base_addr + ISTATUS_HOST); } -static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_rp *port) +static int plda_init_interrupts(struct platform_device *pdev, + struct plda_pcie_rp *port, + const struct plda_event *event) { struct device *dev = &pdev->dev; int irq; @@ -929,8 +947,13 @@ static int plda_init_interrupts(struct platform_device *pdev, struct plda_pcie_r return -ENXIO; } - ret = devm_request_irq(dev, event_irq, mc_event_handler, - 0, event_cause[i].sym, port); + if (event->request_event_irq) + ret = event->request_event_irq(port, event_irq, i); + else + ret = devm_request_irq(dev, event_irq, + plda_event_handler, + 0, NULL, port); + if (ret) { dev_err(dev, "failed to request IRQ %d\n", event_irq); return ret; @@ -984,7 +1007,7 @@ static int mc_platform_init(struct pci_config_window *cfg) return ret; /* Address translation is up; safe to enable interrupts */ - ret = plda_init_interrupts(pdev, &port->plda); + ret = plda_init_interrupts(pdev, &port->plda, &mc_event); if (ret) return ret; diff --git a/drivers/pci/controller/plda/pcie-plda.h b/drivers/pci/controller/plda/pcie-plda.h index e3d35cef9894..28ed1374e1de 100644 --- a/drivers/pci/controller/plda/pcie-plda.h +++ b/drivers/pci/controller/plda/pcie-plda.h @@ -121,6 +121,11 @@ struct plda_pcie_rp { int num_events; }; +struct plda_event { + int (*request_event_irq)(struct plda_pcie_rp *pcie, + int event_irq, int event); +}; + void plda_pcie_setup_window(void __iomem *bridge_base_addr, u32 index, phys_addr_t axi_addr, phys_addr_t pci_addr, size_t size);