[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240717205511.2541693-6-wei.huang2@amd.com>
Date: Wed, 17 Jul 2024 15:55:06 -0500
From: Wei Huang <wei.huang2@....com>
To: <linux-pci@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
<linux-doc@...r.kernel.org>, <netdev@...r.kernel.org>
CC: <Jonathan.Cameron@...wei.com>, <helgaas@...nel.org>, <corbet@....net>,
<davem@...emloft.net>, <edumazet@...gle.com>, <kuba@...nel.org>,
<pabeni@...hat.com>, <alex.williamson@...hat.com>, <gospo@...adcom.com>,
<michael.chan@...adcom.com>, <ajit.khaparde@...adcom.com>,
<somnath.kotur@...adcom.com>, <andrew.gospodarek@...adcom.com>,
<manoj.panicker2@....com>, <Eric.VanTassell@....com>, <wei.huang2@....com>,
<vadim.fedorenko@...ux.dev>, <horms@...nel.org>, <bagasdotme@...il.com>,
<bhelgaas@...gle.com>
Subject: [PATCH V3 05/10] PCI/TPH: Introduce API to check interrupt vector mode support
Add an API function to allow endpoint device drivers to check
if the interrupt vector mode is allowed. If allowed, drivers
can proceed with updating ST tags.
Co-developed-by: Eric Van Tassell <Eric.VanTassell@....com>
Signed-off-by: Eric Van Tassell <Eric.VanTassell@....com>
Signed-off-by: Wei Huang <wei.huang2@....com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@...adcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@...adcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@...adcom.com>
---
drivers/pci/pcie/tph.c | 29 +++++++++++++++++++++++++++++
include/linux/pci-tph.h | 3 +++
2 files changed, 32 insertions(+)
diff --git a/drivers/pci/pcie/tph.c b/drivers/pci/pcie/tph.c
index fb8e2f920712..7183370b0977 100644
--- a/drivers/pci/pcie/tph.c
+++ b/drivers/pci/pcie/tph.c
@@ -39,6 +39,17 @@ static void set_ctrl_reg_req_en(struct pci_dev *pdev, u8 req_type)
pci_write_config_dword(pdev, pdev->tph_cap + PCI_TPH_CTRL, reg_val);
}
+static bool int_vec_mode_supported(struct pci_dev *pdev)
+{
+ u32 reg_val;
+ u8 mode;
+
+ pci_read_config_dword(pdev, pdev->tph_cap + PCI_TPH_CAP, ®_val);
+ mode = FIELD_GET(PCI_TPH_CAP_INT_VEC, reg_val);
+
+ return !!mode;
+}
+
void pcie_tph_set_nostmode(struct pci_dev *pdev)
{
if (!pdev->tph_cap)
@@ -60,3 +71,21 @@ void pcie_tph_init(struct pci_dev *pdev)
{
pdev->tph_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_TPH);
}
+
+/**
+ * pcie_tph_intr_vec_supported() - Check if interrupt vector mode supported for dev
+ * @pdev: pci device
+ *
+ * Return:
+ * true : intr vector mode supported
+ * false: intr vector mode not supported
+ */
+bool pcie_tph_intr_vec_supported(struct pci_dev *pdev)
+{
+ if (!pdev->tph_cap || pci_tph_disabled() || !pdev->msix_enabled ||
+ !int_vec_mode_supported(pdev))
+ return false;
+
+ return true;
+}
+EXPORT_SYMBOL(pcie_tph_intr_vec_supported);
diff --git a/include/linux/pci-tph.h b/include/linux/pci-tph.h
index 8fce3969277c..854677651d81 100644
--- a/include/linux/pci-tph.h
+++ b/include/linux/pci-tph.h
@@ -12,9 +12,12 @@
#ifdef CONFIG_PCIE_TPH
void pcie_tph_disable(struct pci_dev *dev);
void pcie_tph_set_nostmode(struct pci_dev *dev);
+bool pcie_tph_intr_vec_supported(struct pci_dev *dev);
#else
static inline void pcie_tph_disable(struct pci_dev *dev) {}
static inline void pcie_tph_set_nostmode(struct pci_dev *dev) {}
+static inline bool pcie_tph_intr_vec_supported(struct pci_dev *dev)
+{ return false; }
#endif
#endif /* LINUX_PCI_TPH_H */
--
2.45.1
Powered by blists - more mailing lists