anitazha / rpms / ndctl

Forked from rpms/ndctl a year ago
Clone

Blame SOURCES/0132-libcxl-add-GET_PARTITION_INFO-mailbox-command-and-ac.patch

e0018b
From 4f588b964dccf72030b1c432ed5dd8e2856f9d38 Mon Sep 17 00:00:00 2001
e0018b
From: Alison Schofield <alison.schofield@intel.com>
e0018b
Date: Tue, 22 Feb 2022 11:56:03 -0800
e0018b
Subject: [PATCH 132/217] libcxl: add GET_PARTITION_INFO mailbox command and
e0018b
 accessors
e0018b
e0018b
The CXL PMEM provisioning model depends upon the values reported
e0018b
in the CXL GET_PARTITION_INFO mailbox command when changing the
e0018b
partitioning between volatile and persistent capacity.
e0018b
e0018b
Add libcxl APIs to create a new GET_PARTITION_INFO mailbox command,
e0018b
the command output data structure (privately), and accessor APIs to
e0018b
return the fields in the partition info output.
e0018b
e0018b
Per the CXL 2.0 specification, devices report partition capacities
e0018b
as multiples of 256MB. Define and use a capacity multiplier to
e0018b
convert the raw data into bytes for user consumption. Use byte
e0018b
format as the norm for all capacity values produced or consumed
e0018b
using CXL Mailbox commands.
e0018b
e0018b
Link: https://lore.kernel.org/r/6cd7fffe1a95c9a1bc2239cb342067df564401a5.1645558189.git.alison.schofield@intel.com
e0018b
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
e0018b
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
e0018b
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
e0018b
---
e0018b
 Documentation/cxl/lib/libcxl.txt |  1 +
e0018b
 cxl/lib/libcxl.c                 | 66 ++++++++++++++++++++++++++++++++
e0018b
 cxl/lib/libcxl.sym               |  5 +++
e0018b
 cxl/lib/private.h                | 10 +++++
e0018b
 cxl/libcxl.h                     |  5 +++
e0018b
 util/size.h                      |  1 +
e0018b
 6 files changed, 88 insertions(+)
e0018b
e0018b
diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt
e0018b
index 4392b47..a6986ab 100644
e0018b
--- a/Documentation/cxl/lib/libcxl.txt
e0018b
+++ b/Documentation/cxl/lib/libcxl.txt
e0018b
@@ -131,6 +131,7 @@ int cxl_memdev_read_label(struct cxl_memdev *memdev, void *buf, size_t length,
e0018b
 			  size_t offset);
e0018b
 int cxl_memdev_write_label(struct cxl_memdev *memdev, void *buf, size_t length,
e0018b
 			   size_t offset);
e0018b
+struct cxl_cmd *cxl_cmd_new_get_partition(struct cxl_memdev *memdev);
e0018b
 
e0018b
 ----
e0018b
 
e0018b
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
e0018b
index e0b443f..4557a71 100644
e0018b
--- a/cxl/lib/libcxl.c
e0018b
+++ b/cxl/lib/libcxl.c
e0018b
@@ -1985,6 +1985,11 @@ static int cxl_cmd_validate_status(struct cxl_cmd *cmd, u32 id)
e0018b
 	return 0;
e0018b
 }
e0018b
 
e0018b
+static uint64_t cxl_capacity_to_bytes(leint64_t size)
e0018b
+{
e0018b
+	return le64_to_cpu(size) * CXL_CAPACITY_MULTIPLIER;
e0018b
+}
e0018b
+
e0018b
 /* Helpers for health_info fields (no endian conversion) */
e0018b
 #define cmd_get_field_u8(cmd, n, N, field)				\
e0018b
 do {									\
e0018b
@@ -2371,6 +2376,67 @@ CXL_EXPORT ssize_t cxl_cmd_read_label_get_payload(struct cxl_cmd *cmd,
e0018b
 	return length;
e0018b
 }
e0018b
 
e0018b
+CXL_EXPORT struct cxl_cmd *cxl_cmd_new_get_partition(struct cxl_memdev *memdev)
e0018b
+{
e0018b
+	return cxl_cmd_new_generic(memdev,
e0018b
+				   CXL_MEM_COMMAND_ID_GET_PARTITION_INFO);
e0018b
+}
e0018b
+
e0018b
+static struct cxl_cmd_get_partition *
e0018b
+cmd_to_get_partition(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	if (cxl_cmd_validate_status(cmd, CXL_MEM_COMMAND_ID_GET_PARTITION_INFO))
e0018b
+		return NULL;
e0018b
+
e0018b
+	if (!cmd)
e0018b
+		return NULL;
e0018b
+	return cmd->output_payload;
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_partition_get_active_volatile_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_get_partition *c;
e0018b
+
e0018b
+	c = cmd_to_get_partition(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->active_volatile);
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_partition_get_active_persistent_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_get_partition *c;
e0018b
+
e0018b
+	c = cmd_to_get_partition(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->active_persistent);
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_partition_get_next_volatile_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_get_partition *c;
e0018b
+
e0018b
+	c = cmd_to_get_partition(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->next_volatile);
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_partition_get_next_persistent_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_get_partition *c;
e0018b
+
e0018b
+	c = cmd_to_get_partition(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->next_persistent);
e0018b
+}
e0018b
+
e0018b
 CXL_EXPORT int cxl_cmd_submit(struct cxl_cmd *cmd)
e0018b
 {
e0018b
 	struct cxl_memdev *memdev = cmd->memdev;
e0018b
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
e0018b
index e56a2bf..509e62d 100644
e0018b
--- a/cxl/lib/libcxl.sym
e0018b
+++ b/cxl/lib/libcxl.sym
e0018b
@@ -155,4 +155,9 @@ global:
e0018b
 	cxl_dport_get_port;
e0018b
 	cxl_port_get_dport_by_memdev;
e0018b
 	cxl_dport_maps_memdev;
e0018b
+	cxl_cmd_new_get_partition;
e0018b
+	cxl_cmd_partition_get_active_volatile_size;
e0018b
+	cxl_cmd_partition_get_active_persistent_size;
e0018b
+	cxl_cmd_partition_get_next_volatile_size;
e0018b
+	cxl_cmd_partition_get_next_persistent_size;
e0018b
 } LIBCXL_1;
e0018b
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
e0018b
index f483c30..7f3a562 100644
e0018b
--- a/cxl/lib/private.h
e0018b
+++ b/cxl/lib/private.h
e0018b
@@ -7,6 +7,7 @@
e0018b
 #include <cxl/cxl_mem.h>
e0018b
 #include <ccan/endian/endian.h>
e0018b
 #include <ccan/short_types/short_types.h>
e0018b
+#include <util/size.h>
e0018b
 
e0018b
 #define CXL_EXPORT __attribute__ ((visibility("default")))
e0018b
 
e0018b
@@ -185,6 +186,15 @@ struct cxl_cmd_get_health_info {
e0018b
 	le32 pmem_errors;
e0018b
 } __attribute__((packed));
e0018b
 
e0018b
+struct cxl_cmd_get_partition {
e0018b
+	le64 active_volatile;
e0018b
+	le64 active_persistent;
e0018b
+	le64 next_volatile;
e0018b
+	le64 next_persistent;
e0018b
+} __attribute__((packed));
e0018b
+
e0018b
+#define CXL_CAPACITY_MULTIPLIER		SZ_256M
e0018b
+
e0018b
 /* CXL 2.0 8.2.9.5.3 Byte 0 Health Status */
e0018b
 #define CXL_CMD_HEALTH_INFO_STATUS_MAINTENANCE_NEEDED_MASK		BIT(0)
e0018b
 #define CXL_CMD_HEALTH_INFO_STATUS_PERFORMANCE_DEGRADED_MASK		BIT(1)
e0018b
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
e0018b
index 3b2293b..2c0a8d1 100644
e0018b
--- a/cxl/libcxl.h
e0018b
+++ b/cxl/libcxl.h
e0018b
@@ -242,6 +242,11 @@ ssize_t cxl_cmd_read_label_get_payload(struct cxl_cmd *cmd, void *buf,
e0018b
 		unsigned int length);
e0018b
 struct cxl_cmd *cxl_cmd_new_write_label(struct cxl_memdev *memdev,
e0018b
 		void *buf, unsigned int offset, unsigned int length);
e0018b
+struct cxl_cmd *cxl_cmd_new_get_partition(struct cxl_memdev *memdev);
e0018b
+unsigned long long cxl_cmd_partition_get_active_volatile_size(struct cxl_cmd *cmd);
e0018b
+unsigned long long cxl_cmd_partition_get_active_persistent_size(struct cxl_cmd *cmd);
e0018b
+unsigned long long cxl_cmd_partition_get_next_volatile_size(struct cxl_cmd *cmd);
e0018b
+unsigned long long cxl_cmd_partition_get_next_persistent_size(struct cxl_cmd *cmd);
e0018b
 
e0018b
 #ifdef __cplusplus
e0018b
 } /* extern "C" */
e0018b
diff --git a/util/size.h b/util/size.h
e0018b
index a0f3593..e72467f 100644
e0018b
--- a/util/size.h
e0018b
+++ b/util/size.h
e0018b
@@ -15,6 +15,7 @@
e0018b
 #define SZ_4M     0x00400000
e0018b
 #define SZ_16M    0x01000000
e0018b
 #define SZ_64M    0x04000000
e0018b
+#define SZ_256M	  0x10000000
e0018b
 #define SZ_1G     0x40000000
e0018b
 #define SZ_1T 0x10000000000ULL
e0018b
 
e0018b
-- 
e0018b
2.27.0
e0018b