From: "Marek Behún" <kabel@kernel.org>
To: "Simon Glass" <sjg@chromium.org>, "Pali Rohár" <pali@kernel.org>
Cc: u-boot@lists.denx.de, "Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH v2 06/12] sysinfo: Add get_str_list() method
Date: Thu, 4 Nov 2021 00:23:26 +0100 [thread overview]
Message-ID: <20211103232332.2737-7-kabel@kernel.org> (raw)
In-Reply-To: <20211103232332.2737-1-kabel@kernel.org>
From: Marek Behún <marek.behun@nic.cz>
Add get_str_list() method to sysinfo operations.
The get_str_list() method is similar to get_str(), but receives one
additional argument, @idx, and fills in the @idx-th string from a given
list.
Add sandbox implementation together with a unittest.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
drivers/sysinfo/sandbox.c | 15 +++++++++++
drivers/sysinfo/sysinfo-uclass.c | 15 +++++++++++
include/sysinfo.h | 44 ++++++++++++++++++++++++++++++++
test/dm/sysinfo.c | 13 ++++++++++
4 files changed, 87 insertions(+)
diff --git a/drivers/sysinfo/sandbox.c b/drivers/sysinfo/sandbox.c
index 01c845e310..bede40b662 100644
--- a/drivers/sysinfo/sandbox.c
+++ b/drivers/sysinfo/sandbox.c
@@ -81,6 +81,20 @@ int sysinfo_sandbox_get_str(struct udevice *dev, int id, size_t size, char *val)
return -ENOENT;
}
+int sysinfo_sandbox_get_str_list(struct udevice *dev, int id, unsigned idx,
+ size_t size, char *val)
+{
+ if (id != STR_VACATIONSPOT)
+ return -ENOENT;
+
+ if (idx >= ARRAY_SIZE(vacation_spots))
+ return -ERANGE;
+
+ strncpy(val, vacation_spots[idx], size);
+ val[size - 1] = '\0';
+ return strlen(vacation_spots[idx]);
+}
+
static const struct udevice_id sysinfo_sandbox_ids[] = {
{ .compatible = "sandbox,sysinfo-sandbox" },
{ /* sentinel */ }
@@ -91,6 +105,7 @@ static const struct sysinfo_ops sysinfo_sandbox_ops = {
.get_bool = sysinfo_sandbox_get_bool,
.get_int = sysinfo_sandbox_get_int,
.get_str = sysinfo_sandbox_get_str,
+ .get_str_list = sysinfo_sandbox_get_str_list,
};
int sysinfo_sandbox_probe(struct udevice *dev)
diff --git a/drivers/sysinfo/sysinfo-uclass.c b/drivers/sysinfo/sysinfo-uclass.c
index c5cc3cb959..71f9ad105a 100644
--- a/drivers/sysinfo/sysinfo-uclass.c
+++ b/drivers/sysinfo/sysinfo-uclass.c
@@ -92,6 +92,21 @@ int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val)
return ops->get_str(dev, id, size, val);
}
+int sysinfo_get_str_list(struct udevice *dev, int id, unsigned idx, size_t size,
+ char *val)
+{
+ struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
+ struct sysinfo_ops *ops = sysinfo_get_ops(dev);
+
+ if (!priv->detected)
+ return -EPERM;
+
+ if (!ops->get_str_list)
+ return -ENOSYS;
+
+ return ops->get_str_list(dev, id, idx, size, val);
+}
+
UCLASS_DRIVER(sysinfo) = {
.id = UCLASS_SYSINFO,
.name = "sysinfo",
diff --git a/include/sysinfo.h b/include/sysinfo.h
index 6031aec578..0d8a2d1676 100644
--- a/include/sysinfo.h
+++ b/include/sysinfo.h
@@ -106,6 +106,25 @@ struct sysinfo_ops {
int (*get_str)(struct udevice *dev, int id, size_t size, char *val);
+ /**
+ * get_str_list() - Read a specific string data value from a string list
+ * that describes hardware setup.
+ * @dev: The sysinfo instance to gather the data.
+ * @id: A unique identifier for the string list to read from.
+ * @idx: The index of the string in the string list.
+ * @size: The size of the buffer to receive the string data.
+ * If the buffer is not large enough to contain the whole
+ * string, the string must be trimmed to fit in the
+ * buffer including the terminating NULL-byte.
+ * @val: Pointer to a buffer that receives the value read.
+ *
+ * Return: Actual length of the string excluding the terminating
+ * NULL-byte if OK, -ENOENT if list with ID @id does not exist,
+ * -ERANGE if @idx is invalid or -ve on error.
+ */
+ int (*get_str_list)(struct udevice *dev, int id, unsigned idx,
+ size_t size, char *val);
+
/**
* get_fit_loadable - Get the name of an image to load from FIT
* This function can be used to provide the image names based on runtime
@@ -180,6 +199,25 @@ int sysinfo_get_int(struct udevice *dev, int id, int *val);
*/
int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val);
+/**
+ * sysinfo_get_str_list() - Read a specific string data value from a string list
+ * that describes hardware setup.
+ * @dev: The sysinfo instance to gather the data.
+ * @id: A unique identifier for the string list to read from.
+ * @idx: The index of the string in the string list.
+ * @size: The size of the buffer to receive the string data. If the buffer
+ * is not large enough to contain the whole string, the string will
+ * be trimmed to fit in the buffer including the terminating
+ * NULL-byte.
+ * @val: Pointer to a buffer that receives the value read.
+ *
+ * Return: Actual length of the string excluding the terminating NULL-byte if
+ * OK, -ENOENT if list with ID @id does not exist, -ERANGE if @idx is
+ * invalid, -EPERM if called before sysinfo_detect(), else -ve on error.
+ */
+int sysinfo_get_str_list(struct udevice *dev, int id, unsigned idx, size_t size,
+ char *val);
+
/**
* sysinfo_get() - Return the sysinfo device for the sysinfo in question.
* @devp: Pointer to structure to receive the sysinfo device.
@@ -235,6 +273,12 @@ static inline int sysinfo_get_str(struct udevice *dev, int id, size_t size,
return -ENOSYS;
}
+static inline int sysinfo_get_str_list(struct udevice *dev, int id,
+ unsigned idx, size_t size, char *val)
+{
+ return -ENOSYS;
+}
+
static inline int sysinfo_get(struct udevice **devp)
{
return -ENOSYS;
diff --git a/test/dm/sysinfo.c b/test/dm/sysinfo.c
index 2c1bd1ce40..a6b246f2df 100644
--- a/test/dm/sysinfo.c
+++ b/test/dm/sysinfo.c
@@ -58,6 +58,19 @@ static int dm_test_sysinfo(struct unit_test_state *uts)
str));
ut_asserteq_str(str, "Yuggoth");
+ ut_asserteq(6, sysinfo_get_str_list(sysinfo, STR_VACATIONSPOT, 0,
+ sizeof(str), str));
+ ut_asserteq_str(str, "R'lyeh");
+
+ ut_asserteq(17, sysinfo_get_str_list(sysinfo, STR_VACATIONSPOT, 5, 6,
+ str));
+ ut_asserteq_str(str, "The N");
+
+ ut_asserteq(-ENOENT, sysinfo_get_str_list(sysinfo, INT_TEST1, 0,
+ sizeof(str), str));
+ ut_asserteq(-ERANGE, sysinfo_get_str_list(sysinfo, STR_VACATIONSPOT, 10,
+ sizeof(str), str));
+
return 0;
}
--
2.32.0
next prev parent reply other threads:[~2021-11-03 23:25 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-03 23:23 [PATCH v2 00/12] Board specific runtime determined default env Marek Behún
2021-11-03 23:23 ` [PATCH v2 01/12] env: Don't set ready flag if import failed in env_set_default() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 02/12] env: Fix env_get() when returning empty string using env_get_f() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 03/12] env: Simplify env_get_default() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 04/12] sysinfo: Make sysinfo_get_str() behave like snprintf() Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 11:19 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 05/12] test: Use ut_asserteq_str() instead of ut_assertok(strcmp()) Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` Marek Behún [this message]
2021-11-05 2:02 ` [PATCH v2 06/12] sysinfo: Add get_str_list() method Simon Glass
2021-11-05 11:20 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 07/12] sysinfo: Make .detect() non-mandatory Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 08/12] sysinfo: Add support for iterating string list Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 11:24 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 09/12] env: Change return behaviour of env_set_default_vars() Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 10/12] env: Add support for overwriting default environment via sysinfo Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 11/12] arm: mvebu: Espressobin: Use new API for setting default env at runtime Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 8:50 ` Pali Rohár
2021-11-09 15:37 ` Pali Rohár
2021-11-03 23:23 ` [PATCH v2 12/12] env: Remove support for read-write default_environment[] Marek Behún
2021-11-05 2:02 ` Simon Glass
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=20211103232332.2737-7-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=marek.behun@nic.cz \
--cc=pali@kernel.org \
--cc=sjg@chromium.org \
--cc=u-boot@lists.denx.de \
/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