Message ID | 034755a71999a66da79356ec7efbabeaa4eacd88.1644271559.git.alison.schofield@intel.com |
---|---|
State | Superseded |
Headers | show |
Series | Add partitioning support for CXL memdevs | expand |
On Mon, Feb 7, 2022 at 3:06 PM <alison.schofield@intel.com> wrote: > > From: Alison Schofield <alison.schofield@intel.com> > > Users need access to a few additional fields reported by the IDENTIFY Ah, I see the "Users need" pattern... To me, the "Users need" statement is a step removed / secondary from the real driving motivation which is the "CXL PMEM provisioning model specifies / mandates". It feels like a watered down abstraction to me. > mailbox command: total, volatile_only, and persistent_only capacities. > These values are useful when defining partition layouts. > > Add accessors to the libcxl API to retrieve these values from the > IDENTIFY command. > > The fields are specified in multiples of 256MB per the CXL 2.0 spec. > Use the capacity multiplier to convert the raw data into bytes for user > consumption. > > Signed-off-by: Alison Schofield <alison.schofield@intel.com> > --- > cxl/lib/libcxl.c | 36 ++++++++++++++++++++++++++++++++++++ > cxl/lib/libcxl.sym | 3 +++ > cxl/libcxl.h | 3 +++ > 3 files changed, 42 insertions(+) > > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > index 33cf06b..e9d7762 100644 > --- a/cxl/lib/libcxl.c > +++ b/cxl/lib/libcxl.c > @@ -2322,6 +2322,42 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd) > return le32_to_cpu(id->lsa_size); > } > > +static struct cxl_cmd_identify * > +cmd_to_identify(struct cxl_cmd *cmd) > +{ > + if (cxl_cmd_validate_status(cmd, CXL_MEM_COMMAND_ID_IDENTIFY)) > + return NULL; > + > + return cmd->output_payload; > +} > + > +CXL_EXPORT unsigned long long > +cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd) > +{ > + struct cxl_cmd_identify *c; > + > + c = cmd_to_identify(cmd); > + return c ? capacity_to_bytes(c->total_capacity) : ULLONG_MAX; > +} > + > +CXL_EXPORT unsigned long long > +cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd) > +{ > + struct cxl_cmd_identify *c; > + > + c = cmd_to_identify(cmd); > + return c ? capacity_to_bytes(c->volatile_capacity) : ULLONG_MAX; > +} > + > +CXL_EXPORT unsigned long long > +cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd) > +{ > + struct cxl_cmd_identify *c; > + > + c = cmd_to_identify(cmd); > + return c ? capacity_to_bytes(c->persistent_capacity) : ULLONG_MAX; Same style comments as last patch, but otherwise: Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Got it, thanks! <eom> On Tue, Feb 08, 2022 at 12:34:23PM -0800, Dan Williams wrote: > On Mon, Feb 7, 2022 at 3:06 PM <alison.schofield@intel.com> wrote: > > > > From: Alison Schofield <alison.schofield@intel.com> > > > > Users need access to a few additional fields reported by the IDENTIFY > > Ah, I see the "Users need" pattern... To me, the "Users need" > statement is a step removed / secondary from the real driving > motivation which is the "CXL PMEM provisioning model specifies / > mandates". > > It feels like a watered down abstraction to me. > > > mailbox command: total, volatile_only, and persistent_only capacities. > > These values are useful when defining partition layouts. > > > > Add accessors to the libcxl API to retrieve these values from the > > IDENTIFY command. > > > > The fields are specified in multiples of 256MB per the CXL 2.0 spec. > > Use the capacity multiplier to convert the raw data into bytes for user > > consumption. > > > > Signed-off-by: Alison Schofield <alison.schofield@intel.com> > > --- > > cxl/lib/libcxl.c | 36 ++++++++++++++++++++++++++++++++++++ > > cxl/lib/libcxl.sym | 3 +++ > > cxl/libcxl.h | 3 +++ > > 3 files changed, 42 insertions(+) > > > > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > > index 33cf06b..e9d7762 100644 > > --- a/cxl/lib/libcxl.c > > +++ b/cxl/lib/libcxl.c > > @@ -2322,6 +2322,42 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd) > > return le32_to_cpu(id->lsa_size); > > } > > > > +static struct cxl_cmd_identify * > > +cmd_to_identify(struct cxl_cmd *cmd) > > +{ > > + if (cxl_cmd_validate_status(cmd, CXL_MEM_COMMAND_ID_IDENTIFY)) > > + return NULL; > > + > > + return cmd->output_payload; > > +} > > + > > +CXL_EXPORT unsigned long long > > +cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd) > > +{ > > + struct cxl_cmd_identify *c; > > + > > + c = cmd_to_identify(cmd); > > + return c ? capacity_to_bytes(c->total_capacity) : ULLONG_MAX; > > +} > > + > > +CXL_EXPORT unsigned long long > > +cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd) > > +{ > > + struct cxl_cmd_identify *c; > > + > > + c = cmd_to_identify(cmd); > > + return c ? capacity_to_bytes(c->volatile_capacity) : ULLONG_MAX; > > +} > > + > > +CXL_EXPORT unsigned long long > > +cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd) > > +{ > > + struct cxl_cmd_identify *c; > > + > > + c = cmd_to_identify(cmd); > > + return c ? capacity_to_bytes(c->persistent_capacity) : ULLONG_MAX; > > Same style comments as last patch, but otherwise: > > Reviewed-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 33cf06b..e9d7762 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -2322,6 +2322,42 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd) return le32_to_cpu(id->lsa_size); } +static struct cxl_cmd_identify * +cmd_to_identify(struct cxl_cmd *cmd) +{ + if (cxl_cmd_validate_status(cmd, CXL_MEM_COMMAND_ID_IDENTIFY)) + return NULL; + + return cmd->output_payload; +} + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd) +{ + struct cxl_cmd_identify *c; + + c = cmd_to_identify(cmd); + return c ? capacity_to_bytes(c->total_capacity) : ULLONG_MAX; +} + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd) +{ + struct cxl_cmd_identify *c; + + c = cmd_to_identify(cmd); + return c ? capacity_to_bytes(c->volatile_capacity) : ULLONG_MAX; +} + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd) +{ + struct cxl_cmd_identify *c; + + c = cmd_to_identify(cmd); + return c ? capacity_to_bytes(c->persistent_capacity) : ULLONG_MAX; +} + CXL_EXPORT struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev, int opcode) { diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index 509e62d..5ac6e9b 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -160,4 +160,7 @@ global: cxl_cmd_partition_get_active_persistent_size; cxl_cmd_partition_get_next_volatile_size; cxl_cmd_partition_get_next_persistent_size; + cxl_cmd_identify_get_total_size; + cxl_cmd_identify_get_volatile_only_size; + cxl_cmd_identify_get_persistent_only_size; } LIBCXL_1; diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 2c0a8d1..6e18e84 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -201,6 +201,9 @@ int cxl_cmd_get_mbox_status(struct cxl_cmd *cmd); int cxl_cmd_get_out_size(struct cxl_cmd *cmd); struct cxl_cmd *cxl_cmd_new_identify(struct cxl_memdev *memdev); int cxl_cmd_identify_get_fw_rev(struct cxl_cmd *cmd, char *fw_rev, int fw_len); +unsigned long long cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd); +unsigned long long cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd); +unsigned long long cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd); unsigned long long cxl_cmd_identify_get_partition_align(struct cxl_cmd *cmd); unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd); struct cxl_cmd *cxl_cmd_new_get_health_info(struct cxl_memdev *memdev);