@@ -93,4 +93,9 @@ struct cxl_mem {
struct range ram_range;
};
+static inline bool is_cxl_mem_capable(struct cxl_memdev *cxlmd)
+{
+ return false;
+}
+
#endif /* __CXL_MEM_H__ */
@@ -63,11 +63,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_mem_capable(region->targets[i])) {
+ trace_cxl_region_bind(region,
+ "Target isn't CXL.mem capable");
+ return -ENODEV;
+ }
+ }
rc = allocate_region_addr(region);
if (rc)
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 | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-)