diff mbox series

[RFC,1/5] cxl/region: Only allow CXL capable targets

Message ID 20210618005200.997804-2-ben.widawsky@intel.com
State New, archived
Headers show
Series Introduce memdev driver | expand

Commit Message

Ben Widawsky June 18, 2021, 12:51 a.m. UTC
A cxl_memdev exists for all CXL endpoints that support the CXL.io
protocol. If that device cannot participate in CXL.mem protocol, then it
cannot be part of a region's interleave set.

The ABI allows setting a target which is currently not CXL.mem capable
and only will fail when the binding to the region driver occurs. This is
in line with the other configuration parameters which are only strictly
validated when the driver gets bound to the region.

Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
---
 drivers/cxl/mem.h    |  5 +++++
 drivers/cxl/region.c | 12 +++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

Comments

Jonathan Cameron June 18, 2021, 2:08 p.m. UTC | #1
On Thu, 17 Jun 2021 17:51:56 -0700
Ben Widawsky <ben.widawsky@intel.com> wrote:

> A cxl_memdev exists for all CXL endpoints that support the CXL.io
> protocol. If that device cannot participate in CXL.mem protocol, then it
> cannot be part of a region's interleave set.
> 
> The ABI allows setting a target which is currently not CXL.mem capable
> and only will fail when the binding to the region driver occurs. This is
> in line with the other configuration parameters which are only strictly
> validated when the driver gets bound to the region.
> 
> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
> ---
>  drivers/cxl/mem.h    |  5 +++++
>  drivers/cxl/region.c | 12 +++++++++++-
>  2 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/cxl/mem.h b/drivers/cxl/mem.h
> index ff1f9c57e089..3d51bf6c090f 100644
> --- a/drivers/cxl/mem.h
> +++ b/drivers/cxl/mem.h
> @@ -84,4 +84,9 @@ struct cxl_mem {
>  	struct range ram_range;
>  };
>  
> +static inline bool is_cxl_capable(struct cxl_memdev *cxlmd)

is_cxl_mem_capable()?

Can be cxl capable in many other senses!

> +{
> +	return false;
> +}
> +
>  #endif /* __CXL_MEM_H__ */
> diff --git a/drivers/cxl/region.c b/drivers/cxl/region.c
> index 2e73ece001ec..837f4314ffcc 100644
> --- a/drivers/cxl/region.c
> +++ b/drivers/cxl/region.c
> @@ -176,6 +176,10 @@ static size_t set_targetN(struct cxl_region *region, const char *buf, int n, siz
>  		return -ENOENT;
>  
>  	cxlmd = to_cxl_memdev(memdev_dev);
> +	if (!is_cxl_capable(cxlmd))
> +		dev_dbg(&region->dev,
> +			"Setting a target which doesn't support CXL.mem");
> +
>  	get_device(&cxlmd->dev);
>  	region->targets[n] = cxlmd;
>  
> @@ -432,11 +436,17 @@ static int bind_region(struct cxl_region *region)
>  		return -ENXIO;
>  	}
>  
> -	for (i = 0; i < region->eniw; i++)
> +	for (i = 0; i < region->eniw; i++) {
>  		if (!region->targets[i]) {
>  			trace_cxl_region_bind(region, "Missing memory device target");
>  			return -ENXIO;
>  		}
> +		if (!is_cxl_capable(region->targets[i])) {
> +			trace_cxl_region_bind(region,
> +					      "Target isn't CXL.mem capable");
> +			return -ENODEV;
> +		}
> +	}
>  
>  	rc = allocate_region_addr(region);
>  	if (rc)
diff mbox series

Patch

diff --git a/drivers/cxl/mem.h b/drivers/cxl/mem.h
index ff1f9c57e089..3d51bf6c090f 100644
--- a/drivers/cxl/mem.h
+++ b/drivers/cxl/mem.h
@@ -84,4 +84,9 @@  struct cxl_mem {
 	struct range ram_range;
 };
 
+static inline bool is_cxl_capable(struct cxl_memdev *cxlmd)
+{
+	return false;
+}
+
 #endif /* __CXL_MEM_H__ */
diff --git a/drivers/cxl/region.c b/drivers/cxl/region.c
index 2e73ece001ec..837f4314ffcc 100644
--- a/drivers/cxl/region.c
+++ b/drivers/cxl/region.c
@@ -176,6 +176,10 @@  static size_t set_targetN(struct cxl_region *region, const char *buf, int n, siz
 		return -ENOENT;
 
 	cxlmd = to_cxl_memdev(memdev_dev);
+	if (!is_cxl_capable(cxlmd))
+		dev_dbg(&region->dev,
+			"Setting a target which doesn't support CXL.mem");
+
 	get_device(&cxlmd->dev);
 	region->targets[n] = cxlmd;
 
@@ -432,11 +436,17 @@  static int bind_region(struct cxl_region *region)
 		return -ENXIO;
 	}
 
-	for (i = 0; i < region->eniw; i++)
+	for (i = 0; i < region->eniw; i++) {
 		if (!region->targets[i]) {
 			trace_cxl_region_bind(region, "Missing memory device target");
 			return -ENXIO;
 		}
+		if (!is_cxl_capable(region->targets[i])) {
+			trace_cxl_region_bind(region,
+					      "Target isn't CXL.mem capable");
+			return -ENODEV;
+		}
+	}
 
 	rc = allocate_region_addr(region);
 	if (rc)