From 6461a1d8ae31c7f99fd5dff8c0cbd550da2995de Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Thu, 4 Feb 2021 15:53:59 -0800 Subject: [PATCH 1/2] msm: pcie: add mhi register space as PCIe RC resource There are MHI registers which PCIe RC can use for debug purposes such as dumping PCIe link ASPM stats. Add mhi register space as a PCIe RC resource so that RC driver can access MHI space. Change-Id: I4392219b4f2e7007f5f263e4a9285bf630b2e71b Signed-off-by: Tony Truong --- drivers/pci/controller/pci-msm.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/pci/controller/pci-msm.c b/drivers/pci/controller/pci-msm.c index 02162de5eeb8..e3444c2f59b8 100644 --- a/drivers/pci/controller/pci-msm.c +++ b/drivers/pci/controller/pci-msm.c @@ -332,6 +332,7 @@ enum msm_pcie_res { MSM_PCIE_RES_ELBI, MSM_PCIE_RES_IATU, MSM_PCIE_RES_CONF, + MSM_PCIE_RES_MHI, MSM_PCIE_RES_TCSR, MSM_PCIE_RES_RUMI, MSM_PCIE_MAX_RES, @@ -710,6 +711,7 @@ struct msm_pcie_dev_t { void __iomem *iatu; void __iomem *dm_core; void __iomem *conf; + void __iomem *mhi; void __iomem *tcsr; void __iomem *rumi; @@ -1063,6 +1065,7 @@ static const struct msm_pcie_res_info_t msm_pcie_res_info[MSM_PCIE_MAX_RES] = { {"elbi", NULL, NULL}, {"iatu", NULL, NULL}, {"conf", NULL, NULL}, + {"mhi", NULL, NULL}, {"tcsr", NULL, NULL}, {"rumi", NULL, NULL} }; @@ -4066,6 +4069,7 @@ static int msm_pcie_get_reg(struct msm_pcie_dev_t *pcie_dev) pcie_dev->iatu = pcie_dev->res[MSM_PCIE_RES_IATU].base; pcie_dev->dm_core = pcie_dev->res[MSM_PCIE_RES_DM_CORE].base; pcie_dev->conf = pcie_dev->res[MSM_PCIE_RES_CONF].base; + pcie_dev->mhi = pcie_dev->res[MSM_PCIE_RES_MHI].base; pcie_dev->tcsr = pcie_dev->res[MSM_PCIE_RES_TCSR].base; pcie_dev->rumi = pcie_dev->res[MSM_PCIE_RES_RUMI].base; @@ -4182,6 +4186,7 @@ static void msm_pcie_release_resources(struct msm_pcie_dev_t *dev) dev->iatu = NULL; dev->dm_core = NULL; dev->conf = NULL; + dev->mhi = NULL; dev->tcsr = NULL; dev->rumi = NULL; } From 1d5224ec26b310e4dc8c3d4e857ea4ebcb999f11 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Thu, 4 Feb 2021 16:39:43 -0800 Subject: [PATCH 2/2] msm: pcie: add sysfs entry to output PCIe link ASPM stats Provide users a way to check how many times the link between root complex and its partner have entered L0s, L1, L1.1, and L1.2. Change-Id: If3170d26221d05039afc0a2433bebaf0c3799549 Signed-off-by: Tony Truong --- drivers/pci/controller/pci-msm.c | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/pci/controller/pci-msm.c b/drivers/pci/controller/pci-msm.c index e3444c2f59b8..5308b0c758cf 100644 --- a/drivers/pci/controller/pci-msm.c +++ b/drivers/pci/controller/pci-msm.c @@ -83,6 +83,11 @@ #define PCIE20_LINK_DOWN_AXI_ECAM_BLOCK_STATUS (0x630) #define PCIE20_PARF_STATUS (0x230) +#define PCIE20_PARF_DEBUG_CNT_IN_L0S (0xc10) +#define PCIE20_PARF_DEBUG_CNT_IN_L1 (0xc0c) +#define PCIE20_PARF_DEBUG_CNT_IN_L1SUB_L1 (0xc84) +#define PCIE20_PARF_DEBUG_CNT_IN_L1SUB_L2 (0xc88) + #define PCIE20_PARF_CLKREQ_OVERRIDE (0x2b0) #define PCIE20_PARF_CLKREQ_IN_VALUE (BIT(3)) #define PCIE20_PARF_CLKREQ_IN_ENABLE (BIT(1)) @@ -2136,6 +2141,36 @@ static ssize_t enumerate_store(struct device *dev, } static DEVICE_ATTR_WO(enumerate); +static ssize_t aspm_stat_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct msm_pcie_dev_t *pcie_dev = dev_get_drvdata(dev); + + if (!pcie_dev->mhi) + return scnprintf(buf, PAGE_SIZE, + "PCIe: RC%d: No dev or MHI space found\n", + pcie_dev->rc_idx); + + if (pcie_dev->link_status != MSM_PCIE_LINK_ENABLED) + return scnprintf(buf, PAGE_SIZE, + "PCIe: RC%d: registers are not accessible\n", + pcie_dev->rc_idx); + + return scnprintf(buf, PAGE_SIZE, + "PCIe: RC%d: L0s: %u L1: %u L1.1: %u L1.2: %u\n", + pcie_dev->rc_idx, + readl_relaxed(pcie_dev->mhi + + PCIE20_PARF_DEBUG_CNT_IN_L0S), + readl_relaxed(pcie_dev->mhi + + PCIE20_PARF_DEBUG_CNT_IN_L1), + readl_relaxed(pcie_dev->mhi + + PCIE20_PARF_DEBUG_CNT_IN_L1SUB_L1), + readl_relaxed(pcie_dev->mhi + + PCIE20_PARF_DEBUG_CNT_IN_L1SUB_L2)); +} +static DEVICE_ATTR_RO(aspm_stat); + static ssize_t l23_rdy_poll_timeout_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -2170,6 +2205,7 @@ static DEVICE_ATTR_RW(l23_rdy_poll_timeout); static struct attribute *msm_pcie_debug_attrs[] = { &dev_attr_link_check_max_count.attr, &dev_attr_enumerate.attr, + &dev_attr_aspm_stat.attr, &dev_attr_l23_rdy_poll_timeout.attr, NULL, };