From: sharath.kumar.d.m@intel.com
To: lpieralisi@kernel.org, kw@linux.com, robh@kernel.org,
bhelgaas@google.com, linux-pci@vger.kernel.org,
dinguyen@kernel.org
Cc: linux-kernel@vger.kernel.org,
D M Sharath Kumar <sharath.kumar.d.m@intel.com>
Subject: [PATCH 1/1] pci: agilex_pci: add pcie rootport support for agilex
Date: Fri, 16 Jun 2023 12:03:13 +0530 [thread overview]
Message-ID: <20230616063313.862996-2-sharath.kumar.d.m@intel.com> (raw)
In-Reply-To: <20230616063313.862996-1-sharath.kumar.d.m@intel.com>
From: D M Sharath Kumar <sharath.kumar.d.m@intel.com>
Signed-off-by: D M Sharath Kumar <sharath.kumar.d.m@intel.com>
---
drivers/pci/controller/pcie-altera.c | 278 ++++++++++++++++++++++++++-
1 file changed, 268 insertions(+), 10 deletions(-)
diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index 18b2361d6462..d198a73c39fe 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -3,6 +3,7 @@
* Copyright Altera Corporation (C) 2013-2015. All rights reserved
*
* Author: Ley Foon Tan <lftan@altera.com>
+ * Author: sharath <sharath.kumar.d.m@intel.com>
* Description: Altera PCIe host controller driver
*/
@@ -18,6 +19,7 @@
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
+#include <linux/bitops.h>
#include "../pci.h"
@@ -79,9 +81,21 @@
#define S10_TLP_FMTTYPE_CFGWR0 0x45
#define S10_TLP_FMTTYPE_CFGWR1 0x44
+#define AGLX_RP_CFG_ADDR(pcie, reg) \
+ (((pcie)->hip_base) + (reg))
+#define AGLX_RP_SECONDARY(pcie) \
+ readb(AGLX_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
+
+#define AGLX_BDF_REG 0x00002004
+#define AGLX_ROOT_PORT_IRQ_STATUS 0x14c
+#define AGLX_ROOT_PORT_IRQ_ENABLE 0x150
+#define CFG_AER BIT(4)
+static u32 port_conf_off;
+
enum altera_pcie_version {
ALTERA_PCIE_V1 = 0,
ALTERA_PCIE_V2,
+ ALTERA_PCIE_V3, /* AGILEX */
};
struct altera_pcie {
@@ -93,6 +107,7 @@ struct altera_pcie {
struct irq_domain *irq_domain;
struct resource bus_range;
const struct altera_pcie_data *pcie_data;
+ void __iomem *cs_base;
};
struct altera_pcie_ops {
@@ -104,6 +119,11 @@ struct altera_pcie_ops {
int size, u32 *value);
int (*rp_write_cfg)(struct altera_pcie *pcie, u8 busno,
int where, int size, u32 value);
+ int (*ep_read_cfg)(struct altera_pcie *pcie, u8 busno,
+ unsigned int devfn, int where, int size, u32 *value);
+ int (*ep_write_cfg)(struct altera_pcie *pcie, u8 busno,
+ unsigned int devfn, int where, int size, u32 value);
+ void (*rp_isr)(struct irq_desc *desc);
};
struct altera_pcie_data {
@@ -133,6 +153,38 @@ static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg)
return readl_relaxed(pcie->cra_base + reg);
}
+static inline void cs_writel(struct altera_pcie *pcie, const u32 value,
+ const u32 reg)
+{
+ writel_relaxed(value, pcie->cs_base + reg);
+}
+
+static inline void cs_writew(struct altera_pcie *pcie, const u32 value,
+ const u32 reg)
+{
+ writew_relaxed(value, pcie->cs_base + reg);
+}
+
+static inline void cs_writeb(struct altera_pcie *pcie, const u32 value,
+ const u32 reg)
+{
+ writeb_relaxed(value, pcie->cs_base + reg);
+}
+
+static inline u32 cs_readl(struct altera_pcie *pcie, const u32 reg)
+{
+ return readl_relaxed(pcie->cs_base + reg);
+}
+
+static inline u32 cs_readw(struct altera_pcie *pcie, const u32 reg)
+{
+ return readw_relaxed(pcie->cs_base + reg);
+}
+
+static inline u32 cs_readb(struct altera_pcie *pcie, const u32 reg)
+{
+ return readb_relaxed(pcie->cs_base + reg);
+}
static bool altera_pcie_link_up(struct altera_pcie *pcie)
{
return !!((cra_readl(pcie, RP_LTSSM) & RP_LTSSM_MASK) == LTSSM_L0);
@@ -147,6 +199,15 @@ static bool s10_altera_pcie_link_up(struct altera_pcie *pcie)
return !!(readw(addr) & PCI_EXP_LNKSTA_DLLLA);
}
+static bool aglx_altera_pcie_link_up(struct altera_pcie *pcie)
+{
+ void __iomem *addr = AGLX_RP_CFG_ADDR(pcie,
+ pcie->pcie_data->cap_offset +
+ PCI_EXP_LNKSTA);
+
+ return !!(readw(addr) & PCI_EXP_LNKSTA_DLLLA);
+}
+
/*
* Altera PCIe port uses BAR0 of RC's configuration space as the translation
* from PCI bus to native BUS. Entire DDR region is mapped into PCIe space
@@ -427,6 +488,126 @@ static int s10_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
return PCIBIOS_SUCCESSFUL;
}
+static int aglx_rp_read_cfg(struct altera_pcie *pcie, int where,
+ int size, u32 *value)
+{
+ void __iomem *addr = AGLX_RP_CFG_ADDR(pcie, where);
+
+ switch (size) {
+ case 1:
+ *value = readb(addr);
+ break;
+ case 2:
+ *value = readw(addr);
+ break;
+ default:
+ *value = readl(addr);
+ break;
+ }
+
+ if (where == 0x3d)
+ *value = 0x01;
+ if (where == 0x3c)
+ *value |= 0x0100;
+
+ return PCIBIOS_SUCCESSFUL;
+}
+
+static int aglx_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
+ int where, int size, u32 value)
+{
+ void __iomem *addr = AGLX_RP_CFG_ADDR(pcie, where);
+
+ switch (size) {
+ case 1:
+ writeb(value, addr);
+ break;
+ case 2:
+ writew(value, addr);
+ break;
+ default:
+ writel(value, addr);
+ break;
+ }
+
+ /*
+ * Monitor changes to PCI_PRIMARY_BUS register on root port
+ * and update local copy of root bus number accordingly.
+ */
+ if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
+ pcie->root_bus_nr = value & 0xff;
+
+ return PCIBIOS_SUCCESSFUL;
+}
+
+static int aglx_ep_write_cfg(struct altera_pcie *pcie, u8 busno,
+ unsigned int devfn, int where, int size, u32 value)
+{
+ cs_writel(pcie, ((busno << 8) | devfn), AGLX_BDF_REG);
+ if (busno > AGLX_RP_SECONDARY(pcie)) {
+ /* type 1 */
+ switch (size) {
+ case 1:
+ cs_writeb(pcie, value, ((1 << 12) | where));
+ break;
+ case 2:
+ cs_writew(pcie, value, ((1 << 12) | where));
+ break;
+ default:
+ cs_writel(pcie, value, ((1 << 12) | where));
+ break;
+ }
+ } else {
+ /* type 0 */
+ switch (size) {
+ case 1:
+ cs_writeb(pcie, value, where);
+ break;
+ case 2:
+ cs_writew(pcie, value, where);
+ break;
+ default:
+ cs_writel(pcie, value, where);
+ break;
+ }
+ }
+ return PCIBIOS_SUCCESSFUL;
+}
+
+static int aglx_ep_read_cfg(struct altera_pcie *pcie, u8 busno,
+ unsigned int devfn, int where, int size, u32 *value)
+{
+ cs_writel(pcie, ((busno << 8) | devfn), AGLX_BDF_REG);
+ if (busno > AGLX_RP_SECONDARY(pcie)) {
+ /* type 0 */
+ switch (size) {
+ case 1:
+ *value = cs_readb(pcie, ((1 << 12) | where));
+ break;
+ case 2:
+ *value = cs_readw(pcie, ((1 << 12) | where));
+ break;
+ default:
+ *value = cs_readl(pcie, ((1 << 12) | where));
+ break;
+ }
+ } else {
+ /* type 0 */
+ switch (size) {
+ case 1:
+ *value = cs_readb(pcie, where);
+ break;
+ case 2:
+ *value = cs_readw(pcie, where);
+ break;
+ default:
+ *value = cs_readl(pcie, where);
+ break;
+ }
+ }
+ return PCIBIOS_SUCCESSFUL;
+}
+
static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
unsigned int devfn, int where, int size,
u32 *value)
@@ -439,6 +620,10 @@ static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
return pcie->pcie_data->ops->rp_read_cfg(pcie, where,
size, value);
+ if (pcie->pcie_data->ops->ep_read_cfg)
+ return pcie->pcie_data->ops->ep_read_cfg(pcie, busno, devfn,
+ where, size, value);
+
switch (size) {
case 1:
byte_en = 1 << (where & 3);
@@ -483,6 +668,10 @@ static int _altera_pcie_cfg_write(struct altera_pcie *pcie, u8 busno,
return pcie->pcie_data->ops->rp_write_cfg(pcie, busno,
where, size, value);
+ if (pcie->pcie_data->ops->ep_write_cfg)
+ return pcie->pcie_data->ops->ep_write_cfg(pcie, busno, devfn,
+ where, size, value);
+
switch (size) {
case 1:
data32 = (value & 0xff) << shift;
@@ -661,7 +850,30 @@ static void altera_pcie_isr(struct irq_desc *desc)
dev_err_ratelimited(dev, "unexpected IRQ, INT%d\n", bit);
}
}
+ chained_irq_exit(chip, desc);
+}
+static void aglx_isr(struct irq_desc *desc)
+{
+ struct irq_chip *chip = irq_desc_get_chip(desc);
+ struct altera_pcie *pcie;
+ struct device *dev;
+ u32 status;
+ int ret;
+
+ chained_irq_enter(chip, desc);
+ pcie = irq_desc_get_handler_data(desc);
+ dev = &pcie->pdev->dev;
+
+ status = readl((pcie->hip_base + port_conf_off
+ + AGLX_ROOT_PORT_IRQ_STATUS));
+ if (status & CFG_AER) {
+ ret = generic_handle_domain_irq(pcie->irq_domain, 0);
+ if (ret)
+ dev_err_ratelimited(dev, "unexpected IRQ,\n");
+ }
+ writel(CFG_AER, (pcie->hip_base + port_conf_off
+ + AGLX_ROOT_PORT_IRQ_STATUS));
chained_irq_exit(chip, desc);
}
@@ -692,11 +904,27 @@ static int altera_pcie_parse_dt(struct altera_pcie *pcie)
{
struct platform_device *pdev = pcie->pdev;
- pcie->cra_base = devm_platform_ioremap_resource_byname(pdev, "Cra");
- if (IS_ERR(pcie->cra_base))
- return PTR_ERR(pcie->cra_base);
+ if ((pcie->pcie_data->version == ALTERA_PCIE_V1) ||
+ (pcie->pcie_data->version == ALTERA_PCIE_V2)) {
+ pcie->cra_base =
+ devm_platform_ioremap_resource_byname(pdev, "Cra");
+ if (IS_ERR(pcie->cra_base))
+ return PTR_ERR(pcie->cra_base);
+ }
- if (pcie->pcie_data->version == ALTERA_PCIE_V2) {
+ if (pcie->pcie_data->version == ALTERA_PCIE_V3) {
+ pcie->cs_base =
+ devm_platform_ioremap_resource_byname(pdev, "Cs");
+ if (IS_ERR(pcie->cs_base))
+ return PTR_ERR(pcie->cs_base);
+ of_property_read_u32(pcie->pdev->dev.of_node, "port_conf_stat",
+ &port_conf_off);
+ dev_info(&pcie->pdev->dev, "port_conf_stat_off =%x\n",
+ port_conf_off);
+ }
+
+ if ((pcie->pcie_data->version == ALTERA_PCIE_V2) ||
+ (pcie->pcie_data->version == ALTERA_PCIE_V3)) {
pcie->hip_base =
devm_platform_ioremap_resource_byname(pdev, "Hip");
if (IS_ERR(pcie->hip_base))
@@ -708,7 +936,8 @@ static int altera_pcie_parse_dt(struct altera_pcie *pcie)
if (pcie->irq < 0)
return pcie->irq;
- irq_set_chained_handler_and_data(pcie->irq, altera_pcie_isr, pcie);
+ irq_set_chained_handler_and_data(pcie->irq,
+ pcie->pcie_data->ops->rp_isr, pcie);
return 0;
}
@@ -721,6 +950,7 @@ static const struct altera_pcie_ops altera_pcie_ops_1_0 = {
.tlp_read_pkt = tlp_read_packet,
.tlp_write_pkt = tlp_write_packet,
.get_link_status = altera_pcie_link_up,
+ .rp_isr = altera_pcie_isr,
};
static const struct altera_pcie_ops altera_pcie_ops_2_0 = {
@@ -729,6 +959,16 @@ static const struct altera_pcie_ops altera_pcie_ops_2_0 = {
.get_link_status = s10_altera_pcie_link_up,
.rp_read_cfg = s10_rp_read_cfg,
.rp_write_cfg = s10_rp_write_cfg,
+ .rp_isr = altera_pcie_isr,
+};
+
+static const struct altera_pcie_ops altera_pcie_ops_3_0 = {
+ .rp_read_cfg = aglx_rp_read_cfg,
+ .rp_write_cfg = aglx_rp_write_cfg,
+ .get_link_status = aglx_altera_pcie_link_up,
+ .ep_read_cfg = aglx_ep_read_cfg,
+ .ep_write_cfg = aglx_ep_write_cfg,
+ .rp_isr = aglx_isr,
};
static const struct altera_pcie_data altera_pcie_1_0_data = {
@@ -751,11 +991,23 @@ static const struct altera_pcie_data altera_pcie_2_0_data = {
.cfgwr1 = S10_TLP_FMTTYPE_CFGWR1,
};
+static const struct altera_pcie_data altera_pcie_3_0_data = {
+ .ops = &altera_pcie_ops_3_0,
+ .version = ALTERA_PCIE_V3,
+ .cap_offset = 0x70,
+ .cfgrd0 = 0,
+ .cfgrd1 = 0,
+ .cfgwr0 = 0,
+ .cfgwr1 = 0,
+};
+
static const struct of_device_id altera_pcie_of_match[] = {
{.compatible = "altr,pcie-root-port-1.0",
.data = &altera_pcie_1_0_data },
{.compatible = "altr,pcie-root-port-2.0",
.data = &altera_pcie_2_0_data },
+ {.compatible = "altr,pcie-root-port-3.0",
+ .data = &altera_pcie_3_0_data },
{},
};
@@ -793,11 +1045,17 @@ static int altera_pcie_probe(struct platform_device *pdev)
return ret;
}
- /* clear all interrupts */
- cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
- /* enable all interrupts */
- cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
- altera_pcie_host_init(pcie);
+ if ((pcie->pcie_data->version == ALTERA_PCIE_V1) ||
+ (pcie->pcie_data->version == ALTERA_PCIE_V2)) {
+ /* clear all interrupts */
+ cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
+ /* enable all interrupts */
+ cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
+ altera_pcie_host_init(pcie);
+ } else if (pcie->pcie_data->version == ALTERA_PCIE_V3) {
+ writel(CFG_AER, (pcie->hip_base + port_conf_off
+ + AGLX_ROOT_PORT_IRQ_ENABLE));
+ }
bridge->sysdata = pcie;
bridge->busnr = pcie->root_bus_nr;
--
2.34.1
next prev parent reply other threads:[~2023-06-16 6:33 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-16 6:33 [PATCH 0/1] pci: agilex_rp: add pci root port support for agilex platform sharath.kumar.d.m
2023-06-16 6:33 ` sharath.kumar.d.m [this message]
2023-06-16 15:21 ` [PATCH 1/1] pci: agilex_pci: add pcie rootport support for agilex Bjorn Helgaas
2023-09-06 11:09 ` [PATCH v2 0/2] PCI: Altera: add support to Agilex family sharath.kumar.d.m
2023-09-06 11:09 ` [PATCH v2 1/2] PCI: altera: refactor driver for supporting new platform sharath.kumar.d.m
2023-09-06 17:08 ` Bjorn Helgaas
2023-09-08 9:09 ` D M, Sharath Kumar
2023-09-08 12:44 ` Bjorn Helgaas
2023-09-08 13:40 ` D M, Sharath Kumar
2023-09-08 19:52 ` Bjorn Helgaas
2023-09-11 10:33 ` [PATCH 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 12:24 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 12:24 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 12:24 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 13:35 ` [PATCH v2 1/2] PCI: altera: refactor driver for supporting new platform D M, Sharath Kumar
2023-09-11 20:08 ` Bjorn Helgaas
2023-09-13 12:59 ` Bjorn Helgaas
2023-09-17 17:05 ` [PATCH v4 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-17 17:05 ` [PATCH v4 1/2] PCI: altera: refactor driver for supporting new platform sharath.kumar.d.m
2023-09-17 17:05 ` [PATCH v4 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-10-25 22:05 ` Bjorn Helgaas
2023-10-28 13:26 ` [PATCH v5 2/2] PCI: altera: add support for agilex7 " sharath.kumar.d.m
2023-10-25 21:51 ` [PATCH v4 0/2] PCI: altera: add support to agilex family Bjorn Helgaas
2023-10-28 13:33 ` [PATCH v5 " sharath.kumar.d.m
2023-09-11 13:53 ` [PATCH v3 " sharath.kumar.d.m
2023-09-11 13:53 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:53 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-15 10:51 ` [PATCH v3 0/2] PCI: altera: add support to agilex family Dinh Nguyen
2023-09-06 11:09 ` [PATCH v2 2/2] PCI: altera: add suport for Agilex Family FPGA sharath.kumar.d.m
2023-09-06 17:12 ` Bjorn Helgaas
2023-09-08 9:15 ` D M, Sharath Kumar
2023-09-08 12:47 ` Bjorn Helgaas
2023-09-08 14:35 ` D M, Sharath Kumar
2023-09-08 19:48 ` Bjorn Helgaas
2023-09-11 10:38 ` [PATCH 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 13:08 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 13:08 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:08 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 14:08 ` [PATCH v2 2/2] PCI: altera: add suport for Agilex Family FPGA D M, Sharath Kumar
2023-09-11 13:16 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 13:16 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:16 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 13:22 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 13:22 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:22 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 13:25 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 13:25 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:25 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 10:15 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 12:16 ` sharath.kumar.d.m
2023-09-11 13:31 ` sharath.kumar.d.m
2023-09-11 13:31 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:31 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
2023-09-11 13:45 ` [PATCH v3 0/2] PCI: altera: add support to agilex family sharath.kumar.d.m
2023-09-11 13:45 ` [PATCH v3 1/2] PCI: altera: refactor driver for supporting new platforms sharath.kumar.d.m
2023-09-11 13:45 ` [PATCH v3 2/2] PCI: altera: add support for agilex family fpga sharath.kumar.d.m
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230616063313.862996-2-sharath.kumar.d.m@intel.com \
--to=sharath.kumar.d.m@intel.com \
--cc=bhelgaas@google.com \
--cc=dinguyen@kernel.org \
--cc=kw@linux.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.