From: Vishal Verma <vishal.l.verma@intel.com>
To: <linux-cxl@vger.kernel.org>
Cc: linux-nvdimm@lists.01.org, Ben Widawsky <ben.widawsky@intel.com>
Subject: [ndctl PATCH v2 11/13] test/libcxl: add a test for {set, get}_lsa commands
Date: Thu, 18 Feb 2021 19:03:29 -0700 [thread overview]
Message-ID: <20210219020331.725687-12-vishal.l.verma@intel.com> (raw)
In-Reply-To: <20210219020331.725687-1-vishal.l.verma@intel.com>
Add a test to store a static string in the label storage area using the
SET_LSA mailbox command, and retrieve it using the GET_LSA command.
Compare the strings sent and received and ensure they match.
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
test/libcxl.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++
test/Makefile.am | 3 +-
2 files changed, 136 insertions(+), 1 deletion(-)
diff --git a/test/libcxl.c b/test/libcxl.c
index 9662f34..1cff32c 100644
--- a/test/libcxl.c
+++ b/test/libcxl.c
@@ -19,6 +19,7 @@
#include <linux/version.h>
#include <util/size.h>
+#include <util/hexdump.h>
#include <ccan/short_types/short_types.h>
#include <ccan/array_size/array_size.h>
#include <ccan/endian/endian.h>
@@ -209,6 +210,138 @@ out_fail:
return rc;
}
+static int debugfs_write_raw_flag(char *str)
+{
+ char *path = "/sys/kernel/debug/cxl/mbox/raw_allow_all";
+ int fd = open(path, O_WRONLY|O_CLOEXEC);
+ int n, len = strlen(str) + 1, rc;
+
+ if (fd < 0)
+ return -errno;
+
+ n = write(fd, str, len);
+ rc = -errno;
+ close(fd);
+ if (n < len) {
+ fprintf(stderr, "failed to write %s to %s: %s\n", str, path,
+ strerror(errno));
+ return rc;
+ }
+ return 0;
+}
+
+static char *test_lsa_data = "LIBCXL_TEST LSA DATA 01";
+static int lsa_size = EXPECT_CMD_IDENTIFY_LSA_SIZE;
+
+static int test_set_lsa(struct cxl_memdev *memdev)
+{
+ int data_size = strlen(test_lsa_data) + 1;
+ struct cxl_cmd *cmd;
+ struct {
+ le32 offset;
+ le32 rsvd;
+ unsigned char data[lsa_size];
+ } __attribute__((packed)) set_lsa;
+ int rc;
+
+ set_lsa.offset = cpu_to_le32(0);
+ set_lsa.rsvd = cpu_to_le32(0);
+ memcpy(set_lsa.data, test_lsa_data, data_size);
+
+ cmd = cxl_cmd_new_raw(memdev, 0x4103);
+ if (!cmd)
+ return -ENOMEM;
+
+ rc = cxl_cmd_set_input_payload(cmd, &set_lsa, sizeof(set_lsa));
+ if (rc) {
+ fprintf(stderr, "%s: %s: cmd setup failed: %s\n",
+ __func__, cxl_memdev_get_devname(memdev),
+ strerror(-rc));
+ goto out_fail;
+ }
+
+ rc = debugfs_write_raw_flag("Y");
+ if (rc < 0)
+ return rc;
+
+ rc = cxl_cmd_submit(cmd);
+ if (rc < 0)
+ fprintf(stderr, "%s: %s: cmd submission failed: %s\n",
+ __func__, cxl_memdev_get_devname(memdev),
+ strerror(-rc));
+
+ rc = cxl_cmd_get_mbox_status(cmd);
+ if (rc != 0) {
+ fprintf(stderr, "%s: %s: firmware status: %d\n",
+ __func__, cxl_memdev_get_devname(memdev), rc);
+ return -ENXIO;
+ }
+
+ if(debugfs_write_raw_flag("N") < 0)
+ fprintf(stderr, "%s: %s: failed to restore raw flag\n",
+ __func__, cxl_memdev_get_devname(memdev));
+
+out_fail:
+ cxl_cmd_unref(cmd);
+ return rc;
+}
+
+static int test_cxl_cmd_lsa(struct cxl_ctx *ctx)
+{
+ int data_size = strlen(test_lsa_data) + 1;
+ struct cxl_memdev *memdev;
+ struct cxl_cmd *cmd;
+ unsigned char *buf;
+ int rc;
+
+ cxl_memdev_foreach(ctx, memdev) {
+ rc = test_set_lsa(memdev);
+ if (rc)
+ return rc;
+
+ cmd = cxl_cmd_new_get_lsa(memdev, 0, lsa_size);
+ if (!cmd)
+ return -ENOMEM;
+ rc = cxl_cmd_set_output_payload(cmd, NULL, lsa_size);
+ if (rc) {
+ fprintf(stderr, "%s: output buffer allocation: %s\n",
+ __func__, strerror(-rc));
+ return rc;
+ }
+ rc = cxl_cmd_submit(cmd);
+ if (rc < 0) {
+ fprintf(stderr, "%s: %s: cmd submission failed: %s\n",
+ __func__, cxl_memdev_get_devname(memdev),
+ strerror(-rc));
+ goto out_fail;
+ }
+
+ rc = cxl_cmd_get_mbox_status(cmd);
+ if (rc != 0) {
+ fprintf(stderr, "%s: %s: firmware status: %d\n",
+ __func__, cxl_memdev_get_devname(memdev), rc);
+ return -ENXIO;
+ }
+
+ buf = cxl_cmd_get_lsa_get_payload(cmd);
+ if (rc < 0)
+ goto out_fail;
+
+ if (memcmp(buf, test_lsa_data, data_size) != 0) {
+ fprintf(stderr, "%s: LSA data mismatch.\n", __func__);
+ hex_dump_buf(buf, data_size);
+ rc = -EIO;
+ goto out_fail;
+ }
+ cxl_cmd_unref(cmd);
+ }
+ return 0;
+
+out_fail:
+ cxl_cmd_unref(cmd);
+ return rc;
+}
+
typedef int (*do_test_fn)(struct cxl_ctx *ctx);
static do_test_fn do_test[] = {
@@ -216,6 +349,7 @@ static do_test_fn do_test[] = {
test_cxl_presence,
test_cxl_emulation_env,
test_cxl_cmd_identify,
+ test_cxl_cmd_lsa,
};
static int test_libcxl(int loglevel, struct test_ctx *test, struct cxl_ctx *ctx)
diff --git a/test/Makefile.am b/test/Makefile.am
index ce492a4..23f4860 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -86,7 +86,8 @@ LIBNDCTL_LIB =\
testcore =\
core.c \
../util/log.c \
- ../util/sysfs.c
+ ../util/sysfs.c \
+ ../util/hexdump.c
libndctl_SOURCES = libndctl.c $(testcore)
libndctl_LDADD = $(LIBNDCTL_LIB) $(UUID_LIBS) $(KMOD_LIBS)
--
2.29.2
_______________________________________________
Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org
To unsubscribe send an email to linux-nvdimm-leave@lists.01.org
next prev parent reply other threads:[~2021-02-19 2:04 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-19 2:03 [ndctl PATCH v2 00/13] Initial CXL support Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 01/13] cxl: add a cxl utility and libcxl library Vishal Verma
2021-02-22 21:36 ` Ben Widawsky
2021-02-23 19:23 ` Verma, Vishal L
2021-02-19 2:03 ` [ndctl PATCH v2 02/13] cxl: add a local copy of the cxl_mem UAPI header Vishal Verma
2021-02-22 21:41 ` Ben Widawsky
2021-02-19 2:03 ` [ndctl PATCH v2 03/13] libcxl: add support for command query and submission Vishal Verma
2021-02-22 21:55 ` Ben Widawsky
2021-02-19 2:03 ` [ndctl PATCH v2 04/13] libcxl: add support for the 'Identify Device' command Vishal Verma
2021-02-22 22:02 ` Ben Widawsky
2021-02-19 2:03 ` [ndctl PATCH v2 05/13] test: rename 'ndctl_test' to 'test_ctx' Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 06/13] test: rename 'ndctl_test_*' helpers to 'test_*' Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 07/13] test: introduce a libcxl unit test Vishal Verma
2021-02-22 22:15 ` Ben Widawsky
2021-02-19 2:03 ` [ndctl PATCH v2 08/13] libcxl: add GET_HEALTH_INFO mailbox command and accessors Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 09/13] libcxl: add support for the 'GET_LSA' command Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 10/13] util/hexdump: Add a util helper to print a buffer in hex Vishal Verma
2021-02-19 2:03 ` Vishal Verma [this message]
2021-02-19 2:03 ` [ndctl PATCH v2 12/13] Documentation/cxl: add library API documentation Vishal Verma
2021-02-19 2:03 ` [ndctl PATCH v2 13/13] test/libcxl: introduce a command size fuzzing test Vishal Verma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210219020331.725687-12-vishal.l.verma@intel.com \
--to=vishal.l.verma@intel.com \
--cc=ben.widawsky@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-nvdimm@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).