Message ID | 20210618005200.997804-2-ben.widawsky@intel.com |
---|---|
State | New, archived |
Headers | show |
Series | Introduce memdev driver | expand |
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(®ion->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 --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(®ion->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)
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(-)