From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3FD2FC433F5 for ; Wed, 3 Nov 2021 23:25:22 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8D8F9608FB for ; Wed, 3 Nov 2021 23:25:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8D8F9608FB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 664A083681; Thu, 4 Nov 2021 00:24:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="B0JiT5zm"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BE97083632; Thu, 4 Nov 2021 00:23:55 +0100 (CET) Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 5B3E58290A for ; Thu, 4 Nov 2021 00:23:45 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=kabel@kernel.org Received: by mail.kernel.org (Postfix) with ESMTPSA id E4632611C5; Wed, 3 Nov 2021 23:23:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1635981823; bh=MmIYwxosxe3ld0cThqKzJIjQ3oOxpI+r1qFK3Ulyz78=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B0JiT5zmvkIp3Y3MkfM2x81c5CLCXPfo14Ws73cnvRBSSgc+IXbbF4LdtXYXBkLmn nu3WXMBHkRBX4Xek1TWwdHPKnKKWoZl5XBL4dgkgmeoH76vWw2XxqjfcyR73/lshhK wYGE3qoLajDq5m8LH7gj4VmxJw/KQWyDl2QxzvCvp/O+STT1aKtEThuJBmHKoE5Qxs Agb61e8cM3dAdGmnIyJlnP5i0b0zGwaSVQnk31tgsCnf/4pAiRjJwGJ/mhPbFduASp lIlx3xYgaxtVvaO8mDwa4KYY6PUT8k04uTnIbACYUlecr/Uc4XyZFuWEvAe/derDlQ 3dp1eS02kY+BQ== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Simon Glass , =?UTF-8?q?Pali=20Roh=C3=A1r?= Cc: u-boot@lists.denx.de, =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH v2 06/12] sysinfo: Add get_str_list() method Date: Thu, 4 Nov 2021 00:23:26 +0100 Message-Id: <20211103232332.2737-7-kabel@kernel.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211103232332.2737-1-kabel@kernel.org> References: <20211103232332.2737-1-kabel@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean From: Marek BehĂșn 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 --- 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