Message ID | 20210701201005.3065299-11-vishal.l.verma@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial CXL support | expand |
On Thu, Jul 1, 2021 at 1:10 PM Vishal Verma <vishal.l.verma@intel.com> wrote: > > Add a command allocator and accessor APIs for the 'GET_LSA' mailbox > command. > > Cc: Ben Widawsky <ben.widawsky@intel.com> > Cc: Dan Williams <dan.j.williams@intel.com> > Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> > --- > cxl/lib/private.h | 5 +++++ > cxl/lib/libcxl.c | 31 +++++++++++++++++++++++++++++++ > cxl/libcxl.h | 3 +++ > cxl/lib/libcxl.sym | 2 ++ > 4 files changed, 41 insertions(+) > > diff --git a/cxl/lib/private.h b/cxl/lib/private.h > index 2232f4c..fb1dd8e 100644 > --- a/cxl/lib/private.h > +++ b/cxl/lib/private.h > @@ -73,6 +73,11 @@ struct cxl_cmd_identify { > u8 qos_telemetry_caps; > } __attribute__((packed)); > > +struct cxl_cmd_get_lsa_in { > + le32 offset; > + le32 length; > +} __attribute__((packed)); > + > struct cxl_cmd_get_health_info { > u8 health_status; > u8 media_status; > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > index 2e33c5e..d2c38c9 100644 > --- a/cxl/lib/libcxl.c > +++ b/cxl/lib/libcxl.c > @@ -799,6 +799,37 @@ CXL_EXPORT struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev, > return cmd; > } > > +CXL_EXPORT struct cxl_cmd *cxl_cmd_new_get_lsa(struct cxl_memdev *memdev, > + unsigned int offset, unsigned int length) What about a rename here to cxl_cmd_new_read_label? Because, like before, 'get' is overloaded in lib{cxl,ndctl,daxctl} land, and 'lsa' is a spec acronym that we don't need to be matchy-matchy with if there's a better name for libcxl users. That said, that's only a mild preference if you like the symmetry with the spec. > +{ > + struct cxl_cmd_get_lsa_in *get_lsa; > + struct cxl_cmd *cmd; > + > + cmd = cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_GET_LSA); > + if (!cmd) > + return NULL; > + > + get_lsa = (void *)cmd->send_cmd->in.payload; > + get_lsa->offset = cpu_to_le32(offset); > + get_lsa->length = cpu_to_le32(length); > + return cmd; > +} > + > +#define cmd_get_void(cmd, N) \ > +do { \ > + void *p = (void *)cmd->send_cmd->out.payload; \ > + if (cmd->send_cmd->id != CXL_MEM_COMMAND_ID_##N) \ > + return NULL; \ > + if (cmd->status < 0) \ > + return NULL; \ > + return p; \ > +} while(0); > + > +CXL_EXPORT void *cxl_cmd_get_lsa_get_payload(struct cxl_cmd *cmd) Here's another get_X_get that might be better as cxl_cmd_read_label_get_payload. I also liked the ndctl behavior where it was made difficult to do out of bounds access to this buffer because the user had to go through ndctl_cmd_cfg_read_get_data() which did error checking if they tried to access more of the payload than was initially requested. > +{ > + cmd_get_void(cmd, GET_LSA); > +} > + > CXL_EXPORT int cxl_cmd_submit(struct cxl_cmd *cmd) > { > struct cxl_memdev *memdev = cmd->memdev; > diff --git a/cxl/libcxl.h b/cxl/libcxl.h > index 56ae4af..6edbd8d 100644 > --- a/cxl/libcxl.h > +++ b/cxl/libcxl.h > @@ -71,6 +71,9 @@ int cxl_cmd_get_health_info_get_temperature(struct cxl_cmd *cmd); > int cxl_cmd_get_health_info_get_dirty_shutdowns(struct cxl_cmd *cmd); > int cxl_cmd_get_health_info_get_volatile_errors(struct cxl_cmd *cmd); > int cxl_cmd_get_health_info_get_pmem_errors(struct cxl_cmd *cmd); > +struct cxl_cmd *cxl_cmd_new_get_lsa(struct cxl_memdev *memdev, > + unsigned int offset, unsigned int length); > +void *cxl_cmd_get_lsa_get_payload(struct cxl_cmd *cmd); > > #ifdef __cplusplus > } /* extern "C" */ > diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym > index e00443d..2c6193b 100644 > --- a/cxl/lib/libcxl.sym > +++ b/cxl/lib/libcxl.sym > @@ -52,4 +52,6 @@ global: > cxl_cmd_get_health_info_get_dirty_shutdowns; > cxl_cmd_get_health_info_get_volatile_errors; > cxl_cmd_get_health_info_get_pmem_errors; > + cxl_cmd_new_get_lsa; > + cxl_cmd_get_lsa_get_payload; > } LIBCXL_2; > -- > 2.31.1 >
diff --git a/cxl/lib/private.h b/cxl/lib/private.h index 2232f4c..fb1dd8e 100644 --- a/cxl/lib/private.h +++ b/cxl/lib/private.h @@ -73,6 +73,11 @@ struct cxl_cmd_identify { u8 qos_telemetry_caps; } __attribute__((packed)); +struct cxl_cmd_get_lsa_in { + le32 offset; + le32 length; +} __attribute__((packed)); + struct cxl_cmd_get_health_info { u8 health_status; u8 media_status; diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 2e33c5e..d2c38c9 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -799,6 +799,37 @@ CXL_EXPORT struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev, return cmd; } +CXL_EXPORT struct cxl_cmd *cxl_cmd_new_get_lsa(struct cxl_memdev *memdev, + unsigned int offset, unsigned int length) +{ + struct cxl_cmd_get_lsa_in *get_lsa; + struct cxl_cmd *cmd; + + cmd = cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_GET_LSA); + if (!cmd) + return NULL; + + get_lsa = (void *)cmd->send_cmd->in.payload; + get_lsa->offset = cpu_to_le32(offset); + get_lsa->length = cpu_to_le32(length); + return cmd; +} + +#define cmd_get_void(cmd, N) \ +do { \ + void *p = (void *)cmd->send_cmd->out.payload; \ + if (cmd->send_cmd->id != CXL_MEM_COMMAND_ID_##N) \ + return NULL; \ + if (cmd->status < 0) \ + return NULL; \ + return p; \ +} while(0); + +CXL_EXPORT void *cxl_cmd_get_lsa_get_payload(struct cxl_cmd *cmd) +{ + cmd_get_void(cmd, GET_LSA); +} + CXL_EXPORT int cxl_cmd_submit(struct cxl_cmd *cmd) { struct cxl_memdev *memdev = cmd->memdev; diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 56ae4af..6edbd8d 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -71,6 +71,9 @@ int cxl_cmd_get_health_info_get_temperature(struct cxl_cmd *cmd); int cxl_cmd_get_health_info_get_dirty_shutdowns(struct cxl_cmd *cmd); int cxl_cmd_get_health_info_get_volatile_errors(struct cxl_cmd *cmd); int cxl_cmd_get_health_info_get_pmem_errors(struct cxl_cmd *cmd); +struct cxl_cmd *cxl_cmd_new_get_lsa(struct cxl_memdev *memdev, + unsigned int offset, unsigned int length); +void *cxl_cmd_get_lsa_get_payload(struct cxl_cmd *cmd); #ifdef __cplusplus } /* extern "C" */ diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index e00443d..2c6193b 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -52,4 +52,6 @@ global: cxl_cmd_get_health_info_get_dirty_shutdowns; cxl_cmd_get_health_info_get_volatile_errors; cxl_cmd_get_health_info_get_pmem_errors; + cxl_cmd_new_get_lsa; + cxl_cmd_get_lsa_get_payload; } LIBCXL_2;
Add a command allocator and accessor APIs for the 'GET_LSA' mailbox command. Cc: Ben Widawsky <ben.widawsky@intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> --- cxl/lib/private.h | 5 +++++ cxl/lib/libcxl.c | 31 +++++++++++++++++++++++++++++++ cxl/libcxl.h | 3 +++ cxl/lib/libcxl.sym | 2 ++ 4 files changed, 41 insertions(+)