diff mbox series

[ndctl,2/7] libcxl: add accessors for capacity fields of the IDENTIFY command

Message ID 577012d59f5b6b9754d2ce1147585ce5f91a3108.1641233076.git.alison.schofield@intel.com
State Superseded
Headers show
Series Add partitioning support for CXL memdevs | expand

Commit Message

Alison Schofield Jan. 3, 2022, 8:16 p.m. UTC
From: Alison Schofield <alison.schofield@intel.com>

Add accessors to retrieve total capacity, volatile only capacity,
and persistent only capacity from the IDENTIFY mailbox command.
These values are useful when partitioning the device.

Signed-off-by: Alison Schofield <alison.schofield@intel.com>
---
 cxl/libcxl.h       |  3 +++
 cxl/lib/libcxl.c   | 29 +++++++++++++++++++++++++++++
 cxl/lib/libcxl.sym |  3 +++
 3 files changed, 35 insertions(+)

Comments

Ira Weiny Jan. 6, 2022, 8:36 p.m. UTC | #1
On Mon, Jan 03, 2022 at 12:16:13PM -0800, Schofield, Alison wrote:
> From: Alison Schofield <alison.schofield@intel.com>
> 
> Add accessors to retrieve total capacity, volatile only capacity,
> and persistent only capacity from the IDENTIFY mailbox command.
> These values are useful when partitioning the device.

Reword:

The total capacity, volatile only capacity, and persistent only capacity are
required to properly formulate a set partition info command.

Provide functions to retrieve these values from the IDENTIFY command.  Like the
partition information commands these return the values in bytes.

> 
> Signed-off-by: Alison Schofield <alison.schofield@intel.com>
> ---
>  cxl/libcxl.h       |  3 +++
>  cxl/lib/libcxl.c   | 29 +++++++++++++++++++++++++++++
>  cxl/lib/libcxl.sym |  3 +++
>  3 files changed, 35 insertions(+)
> 
> diff --git a/cxl/libcxl.h b/cxl/libcxl.h
> index 7cf9061..d333b6d 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_capacity(struct cxl_cmd *cmd);
> +unsigned long long cxl_cmd_identify_get_volatile_only_capacity(struct cxl_cmd *cmd);
> +unsigned long long cxl_cmd_identify_get_persistent_only_capacity(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);
> diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
> index f3d4022..715d8e4 100644
> --- a/cxl/lib/libcxl.c
> +++ b/cxl/lib/libcxl.c
> @@ -1102,6 +1102,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_capacity(struct cxl_cmd *cmd)

Is there someplace that all the libcxl functions are documented?  Like the
other functions I would like to ensure the user knows these are returning
values in bytes.

Ira

> +{
> +	cmd_identify_get_capacity_field(cmd, total_capacity);
> +}
> +
> +CXL_EXPORT unsigned long long
> +cxl_cmd_identify_get_volatile_only_capacity(struct cxl_cmd *cmd)
> +{
> +	cmd_identify_get_capacity_field(cmd, volatile_capacity);
> +}
> +
> +CXL_EXPORT unsigned long long
> +cxl_cmd_identify_get_persistent_only_capacity(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 09d6d94..bed6427 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_capacity;
> +	cxl_cmd_identify_get_volatile_only_capacity;
> +	cxl_cmd_identify_get_persistent_only_capacity;
>  	cxl_cmd_identify_get_partition_align;
>  	cxl_cmd_identify_get_label_size;
>  	cxl_cmd_new_get_health_info;
> -- 
> 2.31.1
>
Alison Schofield Jan. 7, 2022, 8:25 p.m. UTC | #2
On Thu, Jan 06, 2022 at 12:36:39PM -0800, Ira Weiny wrote:
> On Mon, Jan 03, 2022 at 12:16:13PM -0800, Schofield, Alison wrote:
> > From: Alison Schofield <alison.schofield@intel.com>
> > 
> > Add accessors to retrieve total capacity, volatile only capacity,
> > and persistent only capacity from the IDENTIFY mailbox command.
> > These values are useful when partitioning the device.
> 
> Reword:
> 
> The total capacity, volatile only capacity, and persistent only capacity are
> required to properly formulate a set partition info command.
> 
> Provide functions to retrieve these values from the IDENTIFY command.  Like the
> partition information commands these return the values in bytes.
> 

Will reword. Thanks.

> > 
> > +
> > +CXL_EXPORT unsigned long long
> > +cxl_cmd_identify_get_total_capacity(struct cxl_cmd *cmd)
> 
> Is there someplace that all the libcxl functions are documented?  Like the
> other functions I would like to ensure the user knows these are returning
> values in bytes.

There is a libcxl manpage, source at:
ndctl/Documentation/cxl/lib/libcxl.txt

Synopsis is:
#include <cxl/libcxl.h>
cc ... -lcxl

It describes how to use libcxl, ie alloc, submit, and get info back from
a command. I believe the intent is the user references cxl/libcxl.h to
find the accessors available. Along that line, it doesn't make any
sweeping statements about formats of data returned and I believe, based
on Dan's comments about the long descriptive names, that is by design.
ie. the name should say it all.

I'll rename these all to be _bytes instead of _capacity, as you
suggested in the prior patch.

> 
> Ira
> 
snip
> > +{
diff mbox series

Patch

diff --git a/cxl/libcxl.h b/cxl/libcxl.h
index 7cf9061..d333b6d 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_capacity(struct cxl_cmd *cmd);
+unsigned long long cxl_cmd_identify_get_volatile_only_capacity(struct cxl_cmd *cmd);
+unsigned long long cxl_cmd_identify_get_persistent_only_capacity(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);
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
index f3d4022..715d8e4 100644
--- a/cxl/lib/libcxl.c
+++ b/cxl/lib/libcxl.c
@@ -1102,6 +1102,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_capacity(struct cxl_cmd *cmd)
+{
+	cmd_identify_get_capacity_field(cmd, total_capacity);
+}
+
+CXL_EXPORT unsigned long long
+cxl_cmd_identify_get_volatile_only_capacity(struct cxl_cmd *cmd)
+{
+	cmd_identify_get_capacity_field(cmd, volatile_capacity);
+}
+
+CXL_EXPORT unsigned long long
+cxl_cmd_identify_get_persistent_only_capacity(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 09d6d94..bed6427 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_capacity;
+	cxl_cmd_identify_get_volatile_only_capacity;
+	cxl_cmd_identify_get_persistent_only_capacity;
 	cxl_cmd_identify_get_partition_align;
 	cxl_cmd_identify_get_label_size;
 	cxl_cmd_new_get_health_info;