From nobody Tue Dec 16 08:30:00 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 639A9C7EE23 for ; Sun, 11 Jun 2023 13:25:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233486AbjFKNZX (ORCPT ); Sun, 11 Jun 2023 09:25:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231255AbjFKNZT (ORCPT ); Sun, 11 Jun 2023 09:25:19 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C2E7BC for ; Sun, 11 Jun 2023 06:25:18 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DD9636162C for ; Sun, 11 Jun 2023 13:25:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C792BC4339C; Sun, 11 Jun 2023 13:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1686489917; bh=iGXfXvl/InzCE01L3sj/3r7/25fU+y8vp67ay4WDSZk=; h=From:Date:Subject:References:In-Reply-To:To:From; b=sD1d1xsciU4UF1mPeH58L23UrGpOKJhQk5GEDMz+6hGModQ/HE6OnnrEFJcTa7GMV 7hwFwq8lYECkfqghCj2MY5ssvXEsJMYtFqZiX+StHYim4UFQddL1MgUnFFCrLIt5PZ V04QBMLPwi59BumYyf7C4Z37mU+ye5d6eZsEF/RGd45SBD8Ta7PKQRxmtJPVGOd/hH AotF4/+qpmcA3Yh38c+We+HO5SljXtFU5mo17NOorcg5CrmctAR/W7wder7ToBLncj 57K211Y+BCmCjxqUoL/JHFHmSx6UX44keX7O1WyEbOFQZQSn81wm9BbjyGNtB/KizG si45pb+eDGnCA== From: Mark Brown Date: Sun, 11 Jun 2023 14:25:02 +0100 Subject: [PATCH 1/2] regmap: Provide a ram backed regmap with raw support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20230610-regcache-raw-kunit-v1-1-583112cd28ac@kernel.org> References: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> In-Reply-To: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> To: linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.13-dev-bfdf5 X-Developer-Signature: v=1; a=openpgp-sha256; l=5358; i=broonie@kernel.org; h=from:subject:message-id; bh=iGXfXvl/InzCE01L3sj/3r7/25fU+y8vp67ay4WDSZk=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBkhcs58m+HeWH7HY7AiWhG5fOA1XIsYUj4h1lWHnha Emy3/gCJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCZIXLOQAKCRAk1otyXVSH0Fn8CA CGIdztpdcZxHw5ek5sxzeUB20CaHawbD3CQLm5mE2Sn4AuyVHgE1OoOTlawyCLNn1+n538YoLwud7+ E2zCUaH/6g+VuMudS7uDrSe6032ZwK6amDcDPyN2anauU+JmXvAe40FbgULzKgMoDsG1ZSfxmQlful OJ5OTMb34omIBUAoP+6hVnzTleeoqUowD9GnCBp0rvKdX0LSgb8tX78M0e/Li47+eg0so2szC7ziKE SlbShUMBwqAzvHTMOyKVcGu13VAGcMneP6yuJaPWMFcUF8lxP/yNThW8Zx6xdk/lAefJpIFMN/WdZN FqN263qa1EvaEjto7p7fEqV8RN/Pg9 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Provide a simple, 16 bit only, RAM backed regmap which supports raw I/O for use in testing. Signed-off-by: Mark Brown --- drivers/base/regmap/Makefile | 2 +- drivers/base/regmap/internal.h | 8 +++ drivers/base/regmap/regmap-raw-ram.c | 133 +++++++++++++++++++++++++++++++= ++++ 3 files changed, 142 insertions(+), 1 deletion(-) diff --git a/drivers/base/regmap/Makefile b/drivers/base/regmap/Makefile index f6c6cb017200..5fdd0845b45e 100644 --- a/drivers/base/regmap/Makefile +++ b/drivers/base/regmap/Makefile @@ -8,7 +8,7 @@ obj-$(CONFIG_DEBUG_FS) +=3D regmap-debugfs.o obj-$(CONFIG_REGMAP_KUNIT) +=3D regmap-kunit.o obj-$(CONFIG_REGMAP_AC97) +=3D regmap-ac97.o obj-$(CONFIG_REGMAP_I2C) +=3D regmap-i2c.o -obj-$(CONFIG_REGMAP_RAM) +=3D regmap-ram.o +obj-$(CONFIG_REGMAP_RAM) +=3D regmap-ram.o regmap-raw-ram.o obj-$(CONFIG_REGMAP_SLIMBUS) +=3D regmap-slimbus.o obj-$(CONFIG_REGMAP_SPI) +=3D regmap-spi.o obj-$(CONFIG_REGMAP_SPMI) +=3D regmap-spmi.o diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 9bd0dfd1e259..d987ce182d22 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -312,6 +312,7 @@ struct regmap_ram_data { unsigned int *vals; /* Allocatd by caller */ bool *read; bool *written; + enum regmap_endian reg_endian; }; =20 /* @@ -326,5 +327,12 @@ struct regmap *__regmap_init_ram(const struct regmap_c= onfig *config, #define regmap_init_ram(config, data) \ __regmap_lockdep_wrapper(__regmap_init_ram, #config, config, data) =20 +struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, + struct regmap_ram_data *data, + struct lock_class_key *lock_key, + const char *lock_name); + +#define regmap_init_raw_ram(config, data) \ + __regmap_lockdep_wrapper(__regmap_init_raw_ram, #config, config, data) =20 #endif diff --git a/drivers/base/regmap/regmap-raw-ram.c b/drivers/base/regmap/reg= map-raw-ram.c new file mode 100644 index 000000000000..c9b800885f3b --- /dev/null +++ b/drivers/base/regmap/regmap-raw-ram.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Register map access API - Memory region with raw access +// +// This is intended for testing only +// +// Copyright (c) 2023, Arm Ltd + +#include +#include +#include +#include +#include +#include +#include + +#include "internal.h" + +static unsigned int decode_reg(enum regmap_endian endian, const void *reg) +{ + const u16 *r =3D reg; + + if (endian =3D=3D REGMAP_ENDIAN_BIG) + return be16_to_cpu(*r); + else + return le16_to_cpu(*r); +} + +static int regmap_raw_ram_gather_write(void *context, + const void *reg, size_t reg_len, + const void *val, size_t val_len) +{ + struct regmap_ram_data *data =3D context; + unsigned int r; + u16 *our_buf =3D (u16 *)data->vals; + int i; + + if (reg_len !=3D 2) + return -EINVAL; + if (val_len % 2) + return -EINVAL; + + r =3D decode_reg(data->reg_endian, reg); + memcpy(&our_buf[r], val, val_len); + + for (i =3D 0; i < val_len / 2; i++) + data->written[r + i] =3D true; +=09 + return 0; +} + +static int regmap_raw_ram_write(void *context, const void *data, size_t co= unt) +{ + return regmap_raw_ram_gather_write(context, data, 2, + data + 2, count - 2); +} + +static int regmap_raw_ram_read(void *context, + const void *reg, size_t reg_len, + void *val, size_t val_len) +{ + struct regmap_ram_data *data =3D context; + unsigned int r; + u16 *our_buf =3D (u16 *)data->vals; + int i; + + if (reg_len !=3D 2) + return -EINVAL; + if (val_len % 2) + return -EINVAL; + + r =3D decode_reg(data->reg_endian, reg); + memcpy(val, &our_buf[r], val_len); + + for (i =3D 0; i < val_len / 2; i++) + data->read[r + i] =3D true; + + return 0; +} + +static void regmap_raw_ram_free_context(void *context) +{ + struct regmap_ram_data *data =3D context; + + kfree(data->vals); + kfree(data->read); + kfree(data->written); + kfree(data); +} + +static const struct regmap_bus regmap_raw_ram =3D { + .fast_io =3D true, + .write =3D regmap_raw_ram_write, + .gather_write =3D regmap_raw_ram_gather_write, + .read =3D regmap_raw_ram_read, + .free_context =3D regmap_raw_ram_free_context, +}; + +struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, + struct regmap_ram_data *data, + struct lock_class_key *lock_key, + const char *lock_name) +{ + struct regmap *map; + + if (config->reg_bits !=3D 16) + return ERR_PTR(-EINVAL); + + if (!config->max_register) { + pr_crit("No max_register specified for RAM regmap\n"); + return ERR_PTR(-EINVAL); + } + + data->read =3D kcalloc(sizeof(bool), config->max_register + 1, + GFP_KERNEL); + if (!data->read) + return ERR_PTR(-ENOMEM); + + data->written =3D kcalloc(sizeof(bool), config->max_register + 1, + GFP_KERNEL); + if (!data->written) + return ERR_PTR(-ENOMEM); + + data->reg_endian =3D config->reg_format_endian; + + map =3D __regmap_init(NULL, ®map_raw_ram, data, config, + lock_key, lock_name); + + return map; +} +EXPORT_SYMBOL_GPL(__regmap_init_raw_ram); + +MODULE_LICENSE("GPL v2"); --=20 2.30.2 From nobody Tue Dec 16 08:30:00 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A994DC7EE23 for ; Sun, 11 Jun 2023 13:25:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233150AbjFKNZ0 (ORCPT ); Sun, 11 Jun 2023 09:25:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56894 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232416AbjFKNZU (ORCPT ); Sun, 11 Jun 2023 09:25:20 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B244122 for ; Sun, 11 Jun 2023 06:25:19 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id CCEF0616A6 for ; Sun, 11 Jun 2023 13:25:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BAA1FC433EF; Sun, 11 Jun 2023 13:25:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1686489918; bh=xPeJ6o7wutI/QhvigGbgtFZYPr0AiK21FcWdUhg4Dy8=; h=From:Date:Subject:References:In-Reply-To:To:From; b=mIndZqAjoUoRYZFild8wzfVnRFu7IlRjVHd99xlAS/FQW8w1/kQdh17ApLbbNuK/N Towsrub5mKAQ6eVXgskTbKJxxvIjjkyj/xHVQntFs2Vmr7KqSb7QUBZrRJ3lPCvawt SrMyxxTziZrTLnl9Z/2gxcMrQo5dmMQn/i7qv1NTX8PI5s8fZyWHvg/Oq/UcS1egUe a8zJlnWItnRGuB3T7KI+ahYQrBaeEWWa09YnW5eqnsIId/MckvlADwbVyBa3rZZLfr hbLCpzesf5lXk9EkWldj2n7aMDYkDHolIkO39/lB1Ft/8xZ+tK5HDRf71gWMxFqWi6 G44cs+XxniXoA== From: Mark Brown Date: Sun, 11 Jun 2023 14:25:03 +0100 Subject: [PATCH 2/2] regmap: Provide basic KUnit coverage for the raw register I/O MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20230610-regcache-raw-kunit-v1-2-583112cd28ac@kernel.org> References: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> In-Reply-To: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> To: linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.13-dev-bfdf5 X-Developer-Signature: v=1; a=openpgp-sha256; l=10475; i=broonie@kernel.org; h=from:subject:message-id; bh=xPeJ6o7wutI/QhvigGbgtFZYPr0AiK21FcWdUhg4Dy8=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBkhcs6Y3Ko/Zy4Hzv3txNA+JSXxP4J49gAEsF09GTl N3wQsAiJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCZIXLOgAKCRAk1otyXVSH0LuQB/ 9mFBWWsM3SpNRrXhHaugTxtYIGn7SYOHHxLmyjaClQW3JqNFfM+wj5mqUZMcP+eV8hEYjvVplKBSPJ zY6OUmQ0GRVSMIQmvFwZ5wb25BmYPPikFIoEgGdYpFUgapK8k+EZpkWbcPjYIqG+1K4sBalJJa4kuB jMr0Jg+/cSMILdzb+zCRrncQdQ0qgG2A7L1qVKyYYo+gAQtIABDkBOListboNlZGsU1oa0cBXDZu1X kRbj8aueRilV6RFl5xxxahLMO3s/FyNARDfXsqBR+BC3z6QMV1or7iGRt0UUUUP3rVa1RWudMfk80a PI03yi0Ji/2AtwWc0F4YWou3t21gWb X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simple tests that cover basic raw I/O, plus basic coverage of cache sync since the caches generate bulk I/O with raw register maps. This could be more comprehensive but it is good for testing generic code. Signed-off-by: Mark Brown --- drivers/base/regmap/regmap-kunit.c | 327 +++++++++++++++++++++++++++++++++= ++++ 1 file changed, 327 insertions(+) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index f76d41688134..4ec5cbfc0ca0 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -712,6 +712,327 @@ static void cache_drop(struct kunit *test) regmap_exit(map); } =20 +struct raw_test_types { + const char *name; + + enum regcache_type cache_type; + enum regmap_endian val_endian; +}; + +static void raw_to_desc(const struct raw_test_types *t, char *desc) +{ + strcpy(desc, t->name); +} + +static const struct raw_test_types raw_types_list[] =3D { + { "none-little", REGCACHE_NONE, REGMAP_ENDIAN_LITTLE }, + { "none-big", REGCACHE_NONE, REGMAP_ENDIAN_BIG }, + { "flat-little", REGCACHE_FLAT, REGMAP_ENDIAN_LITTLE }, + { "flat-big", REGCACHE_FLAT, REGMAP_ENDIAN_BIG }, + { "rbtree-little", REGCACHE_RBTREE, REGMAP_ENDIAN_LITTLE }, + { "rbtree-big", REGCACHE_RBTREE, REGMAP_ENDIAN_BIG }, + { "maple-little", REGCACHE_MAPLE, REGMAP_ENDIAN_LITTLE }, + { "maple-big", REGCACHE_MAPLE, REGMAP_ENDIAN_BIG }, +}; + +KUNIT_ARRAY_PARAM(raw_test_types, raw_types_list, raw_to_desc); + +static const struct raw_test_types raw_cache_types_list[] =3D { + { "flat-little", REGCACHE_FLAT, REGMAP_ENDIAN_LITTLE }, + { "flat-big", REGCACHE_FLAT, REGMAP_ENDIAN_BIG }, + { "rbtree-little", REGCACHE_RBTREE, REGMAP_ENDIAN_LITTLE }, + { "rbtree-big", REGCACHE_RBTREE, REGMAP_ENDIAN_BIG }, + { "maple-little", REGCACHE_MAPLE, REGMAP_ENDIAN_LITTLE }, + { "maple-big", REGCACHE_MAPLE, REGMAP_ENDIAN_BIG }, +}; + +KUNIT_ARRAY_PARAM(raw_test_cache_types, raw_cache_types_list, raw_to_desc); + +static const struct regmap_config raw_regmap_config =3D { + .max_register =3D BLOCK_TEST_SIZE, + + .reg_format_endian =3D REGMAP_ENDIAN_LITTLE, + .reg_bits =3D 16, + .val_bits =3D 16, +}; + +static struct regmap *gen_raw_regmap(struct regmap_config *config, + struct raw_test_types *test_type, + struct regmap_ram_data **data) +{ + u16 *buf; + struct regmap *ret; + size_t size =3D (config->max_register + 1) * config->reg_bits / 8; + int i; + struct reg_default *defaults; + + config->cache_type =3D test_type->cache_type; + config->val_format_endian =3D test_type->val_endian; + + buf =3D kmalloc(size, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + + get_random_bytes(buf, size); + + *data =3D kzalloc(sizeof(**data), GFP_KERNEL); + if (!(*data)) + return ERR_PTR(-ENOMEM); + (*data)->vals =3D (void *)buf; + + config->num_reg_defaults =3D config->max_register + 1; + defaults =3D kcalloc(config->num_reg_defaults, + sizeof(struct reg_default), + GFP_KERNEL); + if (!defaults) + return ERR_PTR(-ENOMEM); + config->reg_defaults =3D defaults; + + for (i =3D 0; i < config->num_reg_defaults; i++) { + defaults[i].reg =3D i; + switch (test_type->val_endian) { + case REGMAP_ENDIAN_LITTLE: + defaults[i].def =3D le16_to_cpu(buf[i]); + break; + case REGMAP_ENDIAN_BIG: + defaults[i].def =3D be16_to_cpu(buf[i]); + break; + default: + return ERR_PTR(-EINVAL); + } + } + + /* + * We use the defaults in the tests but they don't make sense + * to the core if there's no cache. + */ + if (config->cache_type =3D=3D REGCACHE_NONE) + config->num_reg_defaults =3D 0; + + ret =3D regmap_init_raw_ram(config, *data); + if (IS_ERR(ret)) { + kfree(buf); + kfree(*data); + } + + return ret; +} + +static void raw_read_defaults_single(struct kunit *test) +{ + struct raw_test_types *t =3D (struct raw_test_types *)test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int rval; + int i; + + config =3D raw_regmap_config; + + map =3D gen_raw_regmap(&config, t, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + /* Check that we can read the defaults via the API */ + for (i =3D 0; i < config.max_register + 1; i++) { + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); + KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval); + } + + regmap_exit(map); +} + +static void raw_read_defaults(struct kunit *test) +{ + struct raw_test_types *t =3D (struct raw_test_types *)test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + u16 *rval; + u16 def; + size_t val_len; + int i; + + config =3D raw_regmap_config; + + map =3D gen_raw_regmap(&config, t, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + val_len =3D sizeof(*rval) * (config.max_register + 1); + rval =3D kmalloc(val_len, GFP_KERNEL); + KUNIT_ASSERT_TRUE(test, rval !=3D NULL); + if (!rval) + return; +=09 + /* Check that we can read the defaults via the API */ + KUNIT_EXPECT_EQ(test, 0, regmap_raw_read(map, 0, rval, val_len)); + for (i =3D 0; i < config.max_register + 1; i++) { + def =3D config.reg_defaults[i].def; + if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) { + KUNIT_EXPECT_EQ(test, def, be16_to_cpu(rval[i])); + } else { + KUNIT_EXPECT_EQ(test, def, le16_to_cpu(rval[i])); + } + } +=09 + kfree(rval); + regmap_exit(map); +} + +static void raw_write_read_single(struct kunit *test) +{ + struct raw_test_types *t =3D (struct raw_test_types *)test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + u16 val; + unsigned int rval; + + config =3D raw_regmap_config; + + map =3D gen_raw_regmap(&config, t, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + get_random_bytes(&val, sizeof(val)); + + /* If we write a value to a register we can read it back */ + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 0, val)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &rval)); + KUNIT_EXPECT_EQ(test, val, rval); + + regmap_exit(map); +} + +static void raw_write(struct kunit *test) +{ + struct raw_test_types *t =3D (struct raw_test_types *)test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + u16 *hw_buf; + u16 val[2]; + unsigned int rval; + int i; + + config =3D raw_regmap_config; + + map =3D gen_raw_regmap(&config, t, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + hw_buf =3D (u16 *)data->vals; + + get_random_bytes(&val, sizeof(val)); + + /* Do a raw write */ + KUNIT_EXPECT_EQ(test, 0, regmap_raw_write(map, 2, val, sizeof(val))); + + /* We should read back the new values, and defaults for the rest */ + for (i =3D 0; i < config.max_register + 1; i++) { + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); + + switch (i) { + case 2: + case 3: + if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) { + KUNIT_EXPECT_EQ(test, rval, + be16_to_cpu(val[i % 2])); + } else { + KUNIT_EXPECT_EQ(test, rval, + le16_to_cpu(val[i % 2])); + } + break; + default: + KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval); + break; + } + } + + /* The values should appear in the "hardware" */ + KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], val, sizeof(val)); + + regmap_exit(map); +} + +static void raw_sync(struct kunit *test) +{ + struct raw_test_types *t =3D (struct raw_test_types *)test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + u16 val[2]; + u16 *hw_buf; + unsigned int rval; + int i; + + config =3D raw_regmap_config; + + map =3D gen_raw_regmap(&config, t, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + hw_buf =3D (u16 *)data->vals; + + get_random_bytes(&val, sizeof(val)); + + /* Do a regular write and a raw write in cache only mode */ + regcache_cache_only(map, true); + KUNIT_EXPECT_EQ(test, 0, regmap_raw_write(map, 2, val, sizeof(val))); + if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 6, + be16_to_cpu(val[0]))); + else + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 6, + le16_to_cpu(val[0]))); + + /* We should read back the new values, and defaults for the rest */ + for (i =3D 0; i < config.max_register + 1; i++) { + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); + + switch (i) { + case 2: + case 3: + case 6: + if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) { + KUNIT_EXPECT_EQ(test, rval, + be16_to_cpu(val[i % 2])); + } else { + KUNIT_EXPECT_EQ(test, rval, + le16_to_cpu(val[i % 2])); + } + break; + default: + KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval); + break; + } + } +=09 + /* The values should not appear in the "hardware" */ + KUNIT_EXPECT_MEMNEQ(test, &hw_buf[2], val, sizeof(val)); + KUNIT_EXPECT_MEMNEQ(test, &hw_buf[6], val, sizeof(u16)); + + for (i =3D 0; i < config.max_register + 1; i++) + data->written[i] =3D false; + + /* Do the sync */ + regcache_cache_only(map, false); + regcache_mark_dirty(map); + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + + /* The values should now appear in the "hardware" */ + KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], val, sizeof(val)); + KUNIT_EXPECT_MEMEQ(test, &hw_buf[6], val, sizeof(u16)); + + regmap_exit(map); +} + static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(basic_read_write, regcache_types_gen_params), KUNIT_CASE_PARAM(bulk_write, regcache_types_gen_params), @@ -727,6 +1048,12 @@ static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(cache_sync_defaults, real_cache_types_gen_params), KUNIT_CASE_PARAM(cache_sync_patch, real_cache_types_gen_params), KUNIT_CASE_PARAM(cache_drop, sparse_cache_types_gen_params), + + KUNIT_CASE_PARAM(raw_read_defaults_single, raw_test_types_gen_params), + KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params), + KUNIT_CASE_PARAM(raw_write_read_single, raw_test_types_gen_params), + KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params), + KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params), {} }; =20 --=20 2.30.2