mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-24 07:46:28 -05:00
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: 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>
This commit is contained in:
committed by
Dave Jiang
parent
a52b6a2c1c
commit
021b7e42fa
@@ -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);
|
||||
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
Reference in New Issue
Block a user