]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
cxl/pci: Introduce cxl_gpf_get_dvsec()
authorDavidlohr Bueso <dave@stgolabs.net>
Thu, 20 Feb 2025 22:02:32 +0000 (14:02 -0800)
committerDave Jiang <dave.jiang@intel.com>
Fri, 14 Mar 2025 22:54:59 +0000 (15:54 -0700)
Add a helper to fetch the port/device GPF dvsecs. This is
currently only used for ports, but a later patch to export
dirty count to users will make use of the device one.

Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Li Ming <ming.li@zohomail.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://patch.msgid.link/20250220220235.276831-2-dave@stgolabs.net
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/pci.c
drivers/cxl/cxl.h

index a5c65f79db1898ba374450ced8f624d9b093ee02..96fecb799cbcf7672b49ac6a2dc2983d8914c4b5 100644 (file)
@@ -1072,6 +1072,22 @@ int cxl_pci_get_bandwidth(struct pci_dev *pdev, struct access_coordinate *c)
 #define GPF_TIMEOUT_BASE_MAX 2
 #define GPF_TIMEOUT_SCALE_MAX 7 /* 10 seconds */
 
+u16 cxl_gpf_get_dvsec(struct device *dev, bool is_port)
+{
+       u16 dvsec;
+
+       if (!dev_is_pci(dev))
+               return 0;
+
+       dvsec = pci_find_dvsec_capability(to_pci_dev(dev), PCI_VENDOR_ID_CXL,
+                       is_port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
+       if (!dvsec)
+               dev_warn(dev, "%s GPF DVSEC not present\n",
+                        is_port ? "Port" : "Device");
+       return dvsec;
+}
+EXPORT_SYMBOL_NS_GPL(cxl_gpf_get_dvsec, "CXL");
+
 static int update_gpf_port_dvsec(struct pci_dev *pdev, int dvsec, int phase)
 {
        u64 base, scale;
@@ -1116,26 +1132,20 @@ int cxl_gpf_port_setup(struct device *dport_dev, struct cxl_port *port)
 {
        struct pci_dev *pdev;
 
-       if (!dev_is_pci(dport_dev))
-               return 0;
-
-       pdev = to_pci_dev(dport_dev);
-       if (!pdev || !port)
+       if (!port)
                return -EINVAL;
 
        if (!port->gpf_dvsec) {
                int dvsec;
 
-               dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
-                                                 CXL_DVSEC_PORT_GPF);
-               if (!dvsec) {
-                       pci_warn(pdev, "Port GPF DVSEC not present\n");
+               dvsec = cxl_gpf_get_dvsec(dport_dev, true);
+               if (!dvsec)
                        return -EINVAL;
-               }
 
                port->gpf_dvsec = dvsec;
        }
 
+       pdev = to_pci_dev(dport_dev);
        update_gpf_port_dvsec(pdev, port->gpf_dvsec, 1);
        update_gpf_port_dvsec(pdev, port->gpf_dvsec, 2);
 
index 55af041df7b20caeac61bcc67c6b053647c87f0e..fc4edd5536b9e94a773a900eb7570dcaac032922 100644 (file)
@@ -922,4 +922,6 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port);
 #define __mock static
 #endif
 
+u16 cxl_gpf_get_dvsec(struct device *dev, bool is_port);
+
 #endif /* __CXL_H__ */