Message ID | 161862021044.3259705.7008520073059739760.stgit@dwillia2-desk3.amr.corp.intel.com |
---|---|
State | Accepted |
Commit | fae8817ae804a682c6823ad1672438f39fc46c28 |
Headers | show |
Series | cxl/mem: Fix memory device capacity probing | expand |
On Fri, 2021-04-16 at 17:43 -0700, Dan Williams wrote: > The CXL Identify Memory Device output payload emits capacity in 256MB > units. The driver is treating the capacity field as bytes. This was > missed because QEMU reports bytes when it should report bytes / 256MB. > > Fixes: 8adaf747c9f0 ("cxl/mem: Find device capabilities") > Cc: Ben Widawsky <ben.widawsky@intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > drivers/cxl/mem.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) Looks good, Reviewed-by: Vishal Verma <vishal.l.verma@intel.com> > > diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c > index 1b5078311f7d..2acc6173da36 100644 > --- a/drivers/cxl/mem.c > +++ b/drivers/cxl/mem.c > @@ -4,6 +4,7 @@ > #include <linux/security.h> > #include <linux/debugfs.h> > #include <linux/module.h> > +#include <linux/sizes.h> > #include <linux/mutex.h> > #include <linux/cdev.h> > #include <linux/idr.h> > @@ -1419,6 +1420,7 @@ static int cxl_mem_enumerate_cmds(struct cxl_mem *cxlm) > */ > static int cxl_mem_identify(struct cxl_mem *cxlm) > { > + /* See CXL 2.0 Table 175 Identify Memory Device Output Payload */ > struct cxl_mbox_identify { > char fw_revision[0x10]; > __le64 total_capacity; > @@ -1447,10 +1449,11 @@ static int cxl_mem_identify(struct cxl_mem *cxlm) > * For now, only the capacity is exported in sysfs > */ > cxlm->ram_range.start = 0; > - cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) - 1; > + cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) * SZ_256M - 1; > > > > > cxlm->pmem_range.start = 0; > - cxlm->pmem_range.end = le64_to_cpu(id.persistent_capacity) - 1; > + cxlm->pmem_range.end = > + le64_to_cpu(id.persistent_capacity) * SZ_256M - 1; > > > > > memcpy(cxlm->firmware_version, id.fw_revision, sizeof(id.fw_revision)); > > > > >
diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c index 1b5078311f7d..2acc6173da36 100644 --- a/drivers/cxl/mem.c +++ b/drivers/cxl/mem.c @@ -4,6 +4,7 @@ #include <linux/security.h> #include <linux/debugfs.h> #include <linux/module.h> +#include <linux/sizes.h> #include <linux/mutex.h> #include <linux/cdev.h> #include <linux/idr.h> @@ -1419,6 +1420,7 @@ static int cxl_mem_enumerate_cmds(struct cxl_mem *cxlm) */ static int cxl_mem_identify(struct cxl_mem *cxlm) { + /* See CXL 2.0 Table 175 Identify Memory Device Output Payload */ struct cxl_mbox_identify { char fw_revision[0x10]; __le64 total_capacity; @@ -1447,10 +1449,11 @@ static int cxl_mem_identify(struct cxl_mem *cxlm) * For now, only the capacity is exported in sysfs */ cxlm->ram_range.start = 0; - cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) - 1; + cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) * SZ_256M - 1; cxlm->pmem_range.start = 0; - cxlm->pmem_range.end = le64_to_cpu(id.persistent_capacity) - 1; + cxlm->pmem_range.end = + le64_to_cpu(id.persistent_capacity) * SZ_256M - 1; memcpy(cxlm->firmware_version, id.fw_revision, sizeof(id.fw_revision));
The CXL Identify Memory Device output payload emits capacity in 256MB units. The driver is treating the capacity field as bytes. This was missed because QEMU reports bytes when it should report bytes / 256MB. Fixes: 8adaf747c9f0 ("cxl/mem: Find device capabilities") Cc: Ben Widawsky <ben.widawsky@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/cxl/mem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)