Commit 021b7e42 authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by Dave Jiang
Browse files

cxl/pci: Introduce cxl_gpf_get_dvsec()



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: default avatarDavidlohr Bueso <dave@stgolabs.net>
Reviewed-by: default avatarLi Ming <ming.li@zohomail.com>
Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://patch.msgid.link/20250220220235.276831-2-dave@stgolabs.net


Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
parent a52b6a2c
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -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);

+2 −0
Original line number Diff line number Diff line
@@ -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__ */