* [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 2:14 [PATCH v2 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
@ 2025-02-19 2:14 ` Davidlohr Bueso
0 siblings, 0 replies; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-19 2:14 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, dave, linux-cxl
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>
---
drivers/cxl/core/pci.c | 38 ++++++++++++++++++++++++++++----------
drivers/cxl/cxl.h | 2 ++
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index a5c65f79db18..2226cca3382d 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -1072,6 +1072,27 @@ 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 */
+int cxl_gpf_get_dvsec(struct device *dev, bool port)
+{
+ struct pci_dev *pdev;
+ int dvsec;
+
+ if (!dev_is_pci(dev))
+ return -EINVAL;
+
+ pdev = to_pci_dev(dev);
+ if (!pdev)
+ return -EINVAL;
+
+ dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
+ port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
+ if (!dvsec)
+ pci_warn(pdev, "%s GPF DVSEC not present\n",
+ 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 +1137,23 @@ 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 <= 0)
return -EINVAL;
- }
port->gpf_dvsec = dvsec;
}
+ pdev = to_pci_dev(dport_dev);
+ if (!pdev)
+ return -EINVAL;
+
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 1);
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 2);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 6baec4ba9141..acbbba41356d 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -901,4 +901,6 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port);
#define __mock static
#endif
+int cxl_gpf_get_dvsec(struct device *dev, bool port);
+
#endif /* __CXL_H__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v3 0/4] cxl: Dirty shutdown followups
@ 2025-02-19 3:05 Davidlohr Bueso
2025-02-19 3:05 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
0 siblings, 1 reply; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-19 3:05 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, dave, linux-cxl
Changes from v2:
- remove leftover cxl_gpf_device() declaration
Changes from v1 (https://lore.kernel.org/linux-cxl/20250205040842.1253616-1-dave@stgolabs.net/):
- crated a new cxl_gpf_get_dvsec() helper to share for port and dev gpf (DaveJ)
- renamed cxl_dirty_shutdown_state() to cxl_arm_dirty_shutdown() (DaveJ)
- exported the cxl_gpf_get_dvsec() symbol used outside of core (Yi, DaveJ)
- introduced CXL_INVALID_DIRTY_SHUTDOWN_COUNT (DaveJ)
- use u64 for cxl_nvd->dirty_shutdowns,
- rename to cxl_nvdimm_setup_dirty_tracking() and use return statements (DaveJ)
- picked up review tag in patch 4 (DaveJ)
Hi,
Some followup patches to the GPF work. First two patches are from feedback
provided by DaveJ. The third patch adds a $platform/dirty_shutdown sysfs
attribute to expose the count to userspace. Fourth patch adds support
emulating the set shutdown state command for the mock device.
Applies against the -next branch of cxl.git.
Thanks!
Davidlohr Bueso (4):
cxl/pci: Introduce cxl_gpf_get_dvsec()
cxl/pmem: Rename cxl_dirty_shutdown_state()
cxl/pmem: Export dirty shutdown count via sysfs
tools/testing/cxl: Set Shutdown State support
Documentation/ABI/testing/sysfs-bus-cxl | 12 +++
Documentation/driver-api/cxl/maturity-map.rst | 2 +-
drivers/cxl/core/mbox.c | 25 +++++-
drivers/cxl/core/pci.c | 38 ++++++---
drivers/cxl/cxl.h | 3 +
drivers/cxl/cxlmem.h | 15 +++-
drivers/cxl/pmem.c | 77 +++++++++++++++++--
tools/testing/cxl/test/mem.c | 23 ++++++
8 files changed, 173 insertions(+), 22 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 3:05 [PATCH v3 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
@ 2025-02-19 3:05 ` Davidlohr Bueso
0 siblings, 0 replies; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-19 3:05 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, dave, linux-cxl
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>
---
drivers/cxl/core/pci.c | 38 ++++++++++++++++++++++++++++----------
drivers/cxl/cxl.h | 2 ++
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index a5c65f79db18..2226cca3382d 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -1072,6 +1072,27 @@ 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 */
+int cxl_gpf_get_dvsec(struct device *dev, bool port)
+{
+ struct pci_dev *pdev;
+ int dvsec;
+
+ if (!dev_is_pci(dev))
+ return -EINVAL;
+
+ pdev = to_pci_dev(dev);
+ if (!pdev)
+ return -EINVAL;
+
+ dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
+ port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
+ if (!dvsec)
+ pci_warn(pdev, "%s GPF DVSEC not present\n",
+ 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 +1137,23 @@ 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 <= 0)
return -EINVAL;
- }
port->gpf_dvsec = dvsec;
}
+ pdev = to_pci_dev(dport_dev);
+ if (!pdev)
+ return -EINVAL;
+
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 1);
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 2);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 6baec4ba9141..acbbba41356d 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -901,4 +901,6 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port);
#define __mock static
#endif
+int cxl_gpf_get_dvsec(struct device *dev, bool port);
+
#endif /* __CXL_H__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 6:28 [PATCH v3 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
@ 2025-02-19 6:28 ` Davidlohr Bueso
2025-02-19 16:27 ` Dave Jiang
2025-02-20 0:55 ` Li Ming
0 siblings, 2 replies; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-19 6:28 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, dave, linux-cxl
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>
---
drivers/cxl/core/pci.c | 38 ++++++++++++++++++++++++++++----------
drivers/cxl/cxl.h | 2 ++
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index a5c65f79db18..2226cca3382d 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -1072,6 +1072,27 @@ 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 */
+int cxl_gpf_get_dvsec(struct device *dev, bool port)
+{
+ struct pci_dev *pdev;
+ int dvsec;
+
+ if (!dev_is_pci(dev))
+ return -EINVAL;
+
+ pdev = to_pci_dev(dev);
+ if (!pdev)
+ return -EINVAL;
+
+ dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
+ port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
+ if (!dvsec)
+ pci_warn(pdev, "%s GPF DVSEC not present\n",
+ 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 +1137,23 @@ 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 <= 0)
return -EINVAL;
- }
port->gpf_dvsec = dvsec;
}
+ pdev = to_pci_dev(dport_dev);
+ if (!pdev)
+ return -EINVAL;
+
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 1);
update_gpf_port_dvsec(pdev, port->gpf_dvsec, 2);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 6baec4ba9141..acbbba41356d 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -901,4 +901,6 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port);
#define __mock static
#endif
+int cxl_gpf_get_dvsec(struct device *dev, bool port);
+
#endif /* __CXL_H__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 6:28 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
@ 2025-02-19 16:27 ` Dave Jiang
2025-02-19 22:54 ` Davidlohr Bueso
2025-02-20 0:55 ` Li Ming
1 sibling, 1 reply; 14+ messages in thread
From: Dave Jiang @ 2025-02-19 16:27 UTC (permalink / raw)
To: Davidlohr Bueso, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, linux-cxl
On 2/18/25 11:28 PM, Davidlohr Bueso wrote:
> 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>
> ---
> drivers/cxl/core/pci.c | 38 ++++++++++++++++++++++++++++----------
> drivers/cxl/cxl.h | 2 ++
> 2 files changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
> index a5c65f79db18..2226cca3382d 100644
> --- a/drivers/cxl/core/pci.c
> +++ b/drivers/cxl/core/pci.c
> @@ -1072,6 +1072,27 @@ 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 */
>
> +int cxl_gpf_get_dvsec(struct device *dev, bool port)
Maybe consider enum instead of bool. That would make it more readable. if not, maybe rename the bool to is_port
> +{
> + struct pci_dev *pdev;
> + int dvsec;
> +
> + if (!dev_is_pci(dev))
> + return -EINVAL;
Since this function is mostly a wrapper for pci_find_dvsec_capability(), why not have it return type to be u16 and just return 0 here? That way when you check you only need to verify if it's 0 (failed).
> +
> + pdev = to_pci_dev(dev);
> + if (!pdev)
> + return -EINVAL;
No need to check here. to_pci_dev() does not return a NULL.
> +
> + dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
> + port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
> + if (!dvsec)
> + pci_warn(pdev, "%s GPF DVSEC not present\n",
why not just dev_warn() since this is cxl code and not PCI core
> + 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 +1137,23 @@ 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 <= 0)
> return -EINVAL;
> - }
>
> port->gpf_dvsec = dvsec;
> }
>
> + pdev = to_pci_dev(dport_dev);
> + if (!pdev)
> + return -EINVAL;
No need to check here. macro does not return NULL.
> +
> update_gpf_port_dvsec(pdev, port->gpf_dvsec, 1);
> update_gpf_port_dvsec(pdev, port->gpf_dvsec, 2);
>
> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
> index 6baec4ba9141..acbbba41356d 100644
> --- a/drivers/cxl/cxl.h
> +++ b/drivers/cxl/cxl.h
> @@ -901,4 +901,6 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port);
> #define __mock static
> #endif
>
> +int cxl_gpf_get_dvsec(struct device *dev, bool port);
> +
> #endif /* __CXL_H__ */
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 16:27 ` Dave Jiang
@ 2025-02-19 22:54 ` Davidlohr Bueso
0 siblings, 0 replies; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-19 22:54 UTC (permalink / raw)
To: Dave Jiang
Cc: dan.j.williams, jonathan.cameron, alison.schofield, ira.weiny,
vishal.l.verma, seven.yi.lee, a.manzanares, fan.ni, anisa.su,
linux-cxl
On Wed, 19 Feb 2025, Dave Jiang wrote:
>> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
>> index a5c65f79db18..2226cca3382d 100644
>> --- a/drivers/cxl/core/pci.c
>> +++ b/drivers/cxl/core/pci.c
>> @@ -1072,6 +1072,27 @@ 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 */
>>
>> +int cxl_gpf_get_dvsec(struct device *dev, bool port)
>
>Maybe consider enum instead of bool. That would make it more readable. if not, maybe rename the bool to is_port
>
>> +{
>> + struct pci_dev *pdev;
>> + int dvsec;
>> +
>> + if (!dev_is_pci(dev))
>> + return -EINVAL;
>
>Since this function is mostly a wrapper for pci_find_dvsec_capability(), why not have it return type to be u16 and just return 0 here? That way when you check you only need to verify if it's 0 (failed).
I kind of wanted to not have a u16 return just because it was ugly for cxl general
calls, but yeah it is better to follow the pci call itself, given the name of this
cxl helper is *dvsec*.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-19 6:28 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-19 16:27 ` Dave Jiang
@ 2025-02-20 0:55 ` Li Ming
1 sibling, 0 replies; 14+ messages in thread
From: Li Ming @ 2025-02-20 0:55 UTC (permalink / raw)
To: Davidlohr Bueso
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, a.manzanares, fan.ni, anisa.su, linux-cxl,
dave.jiang, dan.j.williams
On 2/19/2025 2:28 PM, Davidlohr Bueso wrote:
> 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>
> ---
> drivers/cxl/core/pci.c | 38 ++++++++++++++++++++++++++++----------
> drivers/cxl/cxl.h | 2 ++
> 2 files changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
> index a5c65f79db18..2226cca3382d 100644
> --- a/drivers/cxl/core/pci.c
> +++ b/drivers/cxl/core/pci.c
> @@ -1072,6 +1072,27 @@ 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 */
>
> +int cxl_gpf_get_dvsec(struct device *dev, bool port)
> +{
> + struct pci_dev *pdev;
> + int dvsec;
> +
> + if (!dev_is_pci(dev))
> + return -EINVAL;
> +
> + pdev = to_pci_dev(dev);
> + if (!pdev)
> + return -EINVAL;
My understanding is checking the returned value of to_pci_dev() is not needed, to_pci_dev() is a container_of() macro. Besides, above already checks if the device is a PCI device.
> +
> + dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
> + port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF);
> + if (!dvsec)
> + pci_warn(pdev, "%s GPF DVSEC not present\n",
> + 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 +1137,23 @@ 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 <= 0)
> return -EINVAL;
> - }
>
> port->gpf_dvsec = dvsec;
> }
>
> + pdev = to_pci_dev(dport_dev);
> + if (!pdev)
> + return -EINVAL;
Same as above.
Other looks good to me, feel free to add
Reviewed-by: Li Ming <ming.li@zohomail.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 1:36 [PATCH v4 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
@ 2025-02-20 1:36 ` Davidlohr Bueso
2025-02-20 15:34 ` Dave Jiang
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-20 1:36 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, ming.li, a.manzanares, fan.ni, anisa.su, dave,
linux-cxl
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.
Reviewed-by: Li Ming <ming.li@zohomail.com>
Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
---
drivers/cxl/core/pci.c | 30 ++++++++++++++++++++----------
drivers/cxl/cxl.h | 2 ++
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index a5c65f79db18..96fecb799cbc 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -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);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 6baec4ba9141..29f2ab0d5bf6 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -901,4 +901,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__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 1:36 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
@ 2025-02-20 15:34 ` Dave Jiang
2025-02-20 16:08 ` Ira Weiny
` (2 subsequent siblings)
3 siblings, 0 replies; 14+ messages in thread
From: Dave Jiang @ 2025-02-20 15:34 UTC (permalink / raw)
To: Davidlohr Bueso, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, ming.li, a.manzanares, fan.ni, anisa.su, linux-cxl
On 2/19/25 6:36 PM, Davidlohr Bueso wrote:
> 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.
>
> Reviewed-by: Li Ming <ming.li@zohomail.com>
> Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
> ---
> drivers/cxl/core/pci.c | 30 ++++++++++++++++++++----------
> drivers/cxl/cxl.h | 2 ++
> 2 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
> index a5c65f79db18..96fecb799cbc 100644
> --- a/drivers/cxl/core/pci.c
> +++ b/drivers/cxl/core/pci.c
> @@ -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);
>
> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
> index 6baec4ba9141..29f2ab0d5bf6 100644
> --- a/drivers/cxl/cxl.h
> +++ b/drivers/cxl/cxl.h
> @@ -901,4 +901,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__ */
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 1:36 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-20 15:34 ` Dave Jiang
@ 2025-02-20 16:08 ` Ira Weiny
2025-02-20 17:04 ` Jonathan Cameron
2025-02-21 0:15 ` Fan Ni
3 siblings, 0 replies; 14+ messages in thread
From: Ira Weiny @ 2025-02-20 16:08 UTC (permalink / raw)
To: Davidlohr Bueso, dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, ming.li, a.manzanares, fan.ni, anisa.su, dave,
linux-cxl
Davidlohr Bueso wrote:
> 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.
>
> Reviewed-by: Li Ming <ming.li@zohomail.com>
> Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
[snip]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 1:36 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-20 15:34 ` Dave Jiang
2025-02-20 16:08 ` Ira Weiny
@ 2025-02-20 17:04 ` Jonathan Cameron
2025-02-21 0:15 ` Fan Ni
3 siblings, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2025-02-20 17:04 UTC (permalink / raw)
To: Davidlohr Bueso
Cc: dave.jiang, dan.j.williams, alison.schofield, ira.weiny,
vishal.l.verma, seven.yi.lee, ming.li, a.manzanares, fan.ni,
anisa.su, linux-cxl
On Wed, 19 Feb 2025 17:36:01 -0800
Davidlohr Bueso <dave@stgolabs.net> wrote:
> 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.
>
> Reviewed-by: Li Ming <ming.li@zohomail.com>
> Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Maybe an enum for the port vs device thing would have been nice but
I'm not that bothered and a single use enum is bit nasty.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 22:02 [PATCH v5 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
@ 2025-02-20 22:02 ` Davidlohr Bueso
2025-02-21 11:46 ` Jonathan Cameron
0 siblings, 1 reply; 14+ messages in thread
From: Davidlohr Bueso @ 2025-02-20 22:02 UTC (permalink / raw)
To: dave.jiang, dan.j.williams
Cc: jonathan.cameron, alison.schofield, ira.weiny, vishal.l.verma,
seven.yi.lee, ming.li, a.manzanares, fan.ni, anisa.su, dave,
linux-cxl
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>
---
drivers/cxl/core/pci.c | 30 ++++++++++++++++++++----------
drivers/cxl/cxl.h | 2 ++
2 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
index a5c65f79db18..96fecb799cbc 100644
--- a/drivers/cxl/core/pci.c
+++ b/drivers/cxl/core/pci.c
@@ -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);
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 6baec4ba9141..29f2ab0d5bf6 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -901,4 +901,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__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 1:36 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
` (2 preceding siblings ...)
2025-02-20 17:04 ` Jonathan Cameron
@ 2025-02-21 0:15 ` Fan Ni
3 siblings, 0 replies; 14+ messages in thread
From: Fan Ni @ 2025-02-21 0:15 UTC (permalink / raw)
To: Davidlohr Bueso
Cc: dave.jiang, dan.j.williams, jonathan.cameron, alison.schofield,
ira.weiny, vishal.l.verma, seven.yi.lee, ming.li, a.manzanares,
anisa.su, linux-cxl
On Wed, Feb 19, 2025 at 05:36:01PM -0800, Davidlohr Bueso wrote:
> 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.
>
> Reviewed-by: Li Ming <ming.li@zohomail.com>
> Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
> ---
Reviewed-by: Fan Ni <fan.ni@samsung.com>
> drivers/cxl/core/pci.c | 30 ++++++++++++++++++++----------
> drivers/cxl/cxl.h | 2 ++
> 2 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c
> index a5c65f79db18..96fecb799cbc 100644
> --- a/drivers/cxl/core/pci.c
> +++ b/drivers/cxl/core/pci.c
> @@ -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);
>
> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
> index 6baec4ba9141..29f2ab0d5bf6 100644
> --- a/drivers/cxl/cxl.h
> +++ b/drivers/cxl/cxl.h
> @@ -901,4 +901,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__ */
> --
> 2.39.5
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec()
2025-02-20 22:02 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
@ 2025-02-21 11:46 ` Jonathan Cameron
0 siblings, 0 replies; 14+ messages in thread
From: Jonathan Cameron @ 2025-02-21 11:46 UTC (permalink / raw)
To: Davidlohr Bueso
Cc: dave.jiang, dan.j.williams, alison.schofield, ira.weiny,
vishal.l.verma, seven.yi.lee, ming.li, a.manzanares, fan.ni,
anisa.su, linux-cxl
On Thu, 20 Feb 2025 14:02:32 -0800
Davidlohr Bueso <dave@stgolabs.net> wrote:
> 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>
(was in v4 reply)
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-02-21 11:46 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-19 3:05 [PATCH v3 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
2025-02-19 3:05 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
-- strict thread matches above, loose matches on Subject: below --
2025-02-20 22:02 [PATCH v5 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
2025-02-20 22:02 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-21 11:46 ` Jonathan Cameron
2025-02-20 1:36 [PATCH v4 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
2025-02-20 1:36 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-20 15:34 ` Dave Jiang
2025-02-20 16:08 ` Ira Weiny
2025-02-20 17:04 ` Jonathan Cameron
2025-02-21 0:15 ` Fan Ni
2025-02-19 6:28 [PATCH v3 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
2025-02-19 6:28 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
2025-02-19 16:27 ` Dave Jiang
2025-02-19 22:54 ` Davidlohr Bueso
2025-02-20 0:55 ` Li Ming
2025-02-19 2:14 [PATCH v2 0/4] cxl: Dirty shutdown followups Davidlohr Bueso
2025-02-19 2:14 ` [PATCH 1/4] cxl/pci: Introduce cxl_gpf_get_dvsec() Davidlohr Bueso
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox