Message ID | 55800f227e4d72f90fcdd49affb352fe4386f628.1642535478.git.alison.schofield@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add partitioning support for CXL memdevs | expand |
On Tue, Jan 18, 2022 at 12:20 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 > 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 | 29 +++++++++++++++++++++++++++++ > cxl/lib/libcxl.sym | 3 +++ > cxl/libcxl.h | 3 +++ > 3 files changed, 35 insertions(+) > > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > index 58181c0..1fd584a 100644 > --- a/cxl/lib/libcxl.c > +++ b/cxl/lib/libcxl.c > @@ -1105,6 +1105,35 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd) > return le32_to_cpu(id->lsa_size); > } > > +#define cmd_identify_get_capacity_field(cmd, field) \ > +do { \ > + struct cxl_cmd_identify *c = \ > + (struct cxl_cmd_identify *)cmd->send_cmd->out.payload;\ > + int rc = cxl_cmd_validate_status(cmd, \ > + CXL_MEM_COMMAND_ID_IDENTIFY); \ > + if (rc) \ > + return ULLONG_MAX; \ > + return le64_to_cpu(c->field) * CXL_CAPACITY_MULTIPLIER; \ > +} while (0) This could probably just be 2 functions cmd_to_identify() capacity_to_bytes() ...and then the caller does: return capactity_to_bytes(cmd_to_identify()->field); ...and skip the macro. Otherwise, a macro with a "return" statement can be unwieldy unless that macro is defining an entire function.
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 58181c0..1fd584a 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -1105,6 +1105,35 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd) return le32_to_cpu(id->lsa_size); } +#define cmd_identify_get_capacity_field(cmd, field) \ +do { \ + struct cxl_cmd_identify *c = \ + (struct cxl_cmd_identify *)cmd->send_cmd->out.payload;\ + int rc = cxl_cmd_validate_status(cmd, \ + CXL_MEM_COMMAND_ID_IDENTIFY); \ + if (rc) \ + return ULLONG_MAX; \ + return le64_to_cpu(c->field) * CXL_CAPACITY_MULTIPLIER; \ +} while (0) + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_total_bytes(struct cxl_cmd *cmd) +{ + cmd_identify_get_capacity_field(cmd, total_capacity); +} + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_volatile_only_bytes(struct cxl_cmd *cmd) +{ + cmd_identify_get_capacity_field(cmd, volatile_capacity); +} + +CXL_EXPORT unsigned long long +cxl_cmd_identify_get_persistent_only_bytes(struct cxl_cmd *cmd) +{ + cmd_identify_get_capacity_field(cmd, persistent_capacity); +} + 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 e019c3c..b7e969f 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -31,6 +31,9 @@ global: cxl_cmd_get_out_size; cxl_cmd_new_identify; cxl_cmd_identify_get_fw_rev; + cxl_cmd_identify_get_total_bytes; + cxl_cmd_identify_get_volatile_only_bytes; + cxl_cmd_identify_get_persistent_only_bytes; cxl_cmd_identify_get_partition_align; cxl_cmd_identify_get_label_size; cxl_cmd_new_get_health_info; diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 08fd840..46f99fb 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -68,6 +68,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_bytes(struct cxl_cmd *cmd); +unsigned long long cxl_cmd_identify_get_volatile_only_bytes(struct cxl_cmd *cmd); +unsigned long long cxl_cmd_identify_get_persistent_only_bytes(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);