From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE0D213E8AB for ; Mon, 8 Apr 2024 14:46:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; cv=none; b=AscGmnu0MzDx/GukgR7jvD+scKQkcDgYOuqs+48FA5dmqj9xQzIzQPBoloNqMzzCGWRWmBy14BnJGNyX994X60AOvOTJu2btP5X6Et3E9awq40BWpS0VAWDl0m5CYQcT9aoZ0kfnbGe35MTaf8mPOdgqejVKJiShsvPNgEOiHRM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; c=relaxed/simple; bh=2VvsmAud6HU2mz3SIdnGDsedcDs4k8YOUBKNvajsU88=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bSHUGgBcjX6jHudif4ViYA4EkjLpxinFeNfHl7no5uyf0IavCq2jGbdAhjYCRT7PdQhS5+/o3EqNNe598i8FQtdycbwdZ8srgrEu8wutLrugFvI6QllBekE0Fw1TOz7cqJSFVaMx+llPzgUHJrqAXOomt2U7p024oVMRuYfnhss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=hxzKDxsP; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="hxzKDxsP" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQm026412; Mon, 8 Apr 2024 09:46:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=3TPAwAiwLKJ6paogqx6Zr4LOq26x7e1uKRWSbDHaXj4=; b= hxzKDxsPkPgitM1MrXsce2k8rxInMxpI8rSdbOWXiZild4QgjBFB9FLcg8ysdaPx txaA00Cm6ZZJj4oL3C/U9zvqowLh+B38o6b04TkXheudfFt6revjVhXB5BfWznzY OZbnUR99CFqBnY75z5/tgbmh0Ld21cYH1c61pDIdM/jcZF5nZ1tBCZToqfM90I+d jnFqVONJWvEEB33fknYn3YS8MaLGT2vd//fd2fp+eNr2fAgd8Z1EDWsnbPoxhZ9t V+K0ISGpSvdKF3R+IvpCXKLJgZBm90HkhavIaGUM2L1hEs26+6rvKxtlzfg/7gdm vMJgFkYCvZfgAuvcOhl4Hw== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:04 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id ACC51820243; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 01/11] regmap: kunit: Fix warnings of implicit casts to __le16 and __be16 Date: Mon, 8 Apr 2024 15:45:50 +0100 Message-ID: <20240408144600.230848-2-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: xNhCxnl_K8S4zfaaPeGKnBlPpjM43t2X X-Proofpoint-GUID: xNhCxnl_K8S4zfaaPeGKnBlPpjM43t2X X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Fix warnings about implicit casts to __le16 and __be16 types reported by smatch: drivers/base/regmap/regmap-kunit.c:1118:25: warning: cast to restricted __be16 drivers/base/regmap/regmap-kunit.c:1120:25: warning: cast to restricted __le16 drivers/base/regmap/regmap-kunit.c:1187:33: warning: cast to restricted __be16 drivers/base/regmap/regmap-kunit.c:1190:33: warning: cast to restricted __le16 drivers/base/regmap/regmap-kunit.c:1302:33: warning: cast to restricted __be16 drivers/base/regmap/regmap-kunit.c:1305:33: warning: cast to restricted __le16 Perform a __force cast for all these. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index bb2ab6129f38..b46a4f28c1a1 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -1115,12 +1115,12 @@ static void raw_read_defaults(struct kunit *test) 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])); + KUNIT_EXPECT_EQ(test, def, be16_to_cpu((__force __be16)rval[i])); } else { - KUNIT_EXPECT_EQ(test, def, le16_to_cpu(rval[i])); + KUNIT_EXPECT_EQ(test, def, le16_to_cpu((__force __le16)rval[i])); } } -=09 + kfree(rval); regmap_exit(map); } @@ -1185,10 +1185,10 @@ static void raw_write(struct kunit *test) case 3: if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) { KUNIT_EXPECT_EQ(test, rval, - be16_to_cpu(val[i % 2])); + be16_to_cpu((__force __be16)val[i % 2])); } else { KUNIT_EXPECT_EQ(test, rval, - le16_to_cpu(val[i % 2])); + le16_to_cpu((__force __le16)val[i % 2])); } break; default: @@ -1300,10 +1300,10 @@ static void raw_sync(struct kunit *test) case 3: if (config.val_format_endian =3D=3D REGMAP_ENDIAN_BIG) { KUNIT_EXPECT_EQ(test, rval, - be16_to_cpu(val[i - 2])); + be16_to_cpu((__force __be16)val[i - 2])); } else { KUNIT_EXPECT_EQ(test, rval, - le16_to_cpu(val[i - 2])); + le16_to_cpu((__force __le16)val[i - 2])); } break; case 4: --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C35613EFF4 for ; Mon, 8 Apr 2024 14:46:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587574; cv=none; b=nxRl0w6azTO1oV8lFRBu3dOGLPc3iGFTcydYHDnJThnw1VD0Ifyo86M8vzk9GES+0MhPg670cwASfsUM8RDhG2fyNof0QqgsPWYtmiLpUpG3VOEzlxrFVk3n779XnUsRhzyfcae94xIvXk/pxKltfJK2MgPJJEuKIOzG9ko/GDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587574; c=relaxed/simple; bh=2SVurQAbEqc0jAne35943NOeGvQcOWlmtHKJaIsGM/A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gzDUc7XxnQJ8k5xoFGXx3fs52YJHhYdrZV7Mkac9wCGIlKh6osB3P7LA0Ati9hxv5aGPyYKpx7K5jFKVPUX0IJI4+rQJ93QAdniDlo8ZDTJbopbjRFoYrFgt/d1rh4eATNgPurOjYf3iXOfTpsX3Ou092coDl//zTOBVRCfy7d4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=nIYEutBv; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="nIYEutBv" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL1032409; Mon, 8 Apr 2024 09:46:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=gnoAedlYftAvk2qQw1KtAvPKxhOnRMJ/9uKbfEPGO4I=; b= nIYEutBvxRl7/hpjlWAuVmE6KqtqF59c/2HYKNiCa7/XPqTmdrW3xx+caa2sSdjx PIgFeYjpqBCeB5+G5pl4G5o6e7IvnLzyspBmE6JhF/tXNfgurlw9y7JiqblvzY2Q USHrB9KCLjDZUAkp8r2Lw3z+ESDGxiVN6nh4j/XR/rf/cFylPUD5xfDouYQ+88OX 5x0u0xyfMRGlgwhGtDQqN9h6I80C7lA2hhktOnJTfcf3vzYGoEKe0UHBc/uGdQPW 39LTvGCK9oBkWbqGeNLonxUheWqZtxn/Vj7i8jTbRgwKowmm+sIZOemKqONXBCmd 9TVoxWYTd9z7efhynOVh4A== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:03 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id B159F82024B; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 02/11] regmap: kunit: Create a struct device for the regmap Date: Mon, 8 Apr 2024 15:45:51 +0100 Message-ID: <20240408144600.230848-3-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: P5P6Otb-aFgfVs2yXq7ZN638xyo6jHdR X-Proofpoint-GUID: P5P6Otb-aFgfVs2yXq7ZN638xyo6jHdR X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Use kunit_device_register() to create a real struct device for the regmap instead of leaving it at NULL. The main reason for this is that it allows context data to be passed into the readable_reg/writable_reg/volatile_reg functions by attaching it to the struct device with dev_set_drvdata(). The gen_regmap() and gen_raw_regmap() functions are updated to take a struct kunit * argument. A new struct regmap_test_priv has been created to hold the struct device created by kunit_device_register(). This allows the struct to be extended in the future to hold more private data for the test suite. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/internal.h | 14 ++-- drivers/base/regmap/regmap-kunit.c | 105 +++++++++++++++++++-------- drivers/base/regmap/regmap-ram.c | 5 +- drivers/base/regmap/regmap-raw-ram.c | 5 +- 4 files changed, 87 insertions(+), 42 deletions(-) diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index bcdb25bec77c..83acccdc1008 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -326,20 +326,22 @@ struct regmap_ram_data { * Create a test register map with data stored in RAM, not intended * for practical use. */ -struct regmap *__regmap_init_ram(const struct regmap_config *config, +struct regmap *__regmap_init_ram(struct device *dev, + const struct regmap_config *config, struct regmap_ram_data *data, struct lock_class_key *lock_key, const char *lock_name); =20 -#define regmap_init_ram(config, data) \ - __regmap_lockdep_wrapper(__regmap_init_ram, #config, config, data) +#define regmap_init_ram(dev, config, data) \ + __regmap_lockdep_wrapper(__regmap_init_ram, #dev, dev, config, data) =20 -struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, +struct regmap *__regmap_init_raw_ram(struct device *dev, + const struct regmap_config *config, struct regmap_ram_data *data, struct lock_class_key *lock_key, const char *lock_name); =20 -#define regmap_init_raw_ram(config, data) \ - __regmap_lockdep_wrapper(__regmap_init_raw_ram, #config, config, data) +#define regmap_init_raw_ram(dev, config, data) \ + __regmap_lockdep_wrapper(__regmap_init_raw_ram, #dev, dev, config, data) =20 #endif diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index b46a4f28c1a1..3bc2028fbef7 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -4,11 +4,16 @@ // // Copyright 2023 Arm Ltd =20 +#include #include #include "internal.h" =20 #define BLOCK_TEST_SIZE 12 =20 +struct regmap_test_priv { + struct device *dev; +}; + static void get_changed_bytes(void *orig, void *new, size_t size) { char *o =3D orig; @@ -66,9 +71,11 @@ static const struct regcache_types sparse_cache_types_li= st[] =3D { =20 KUNIT_ARRAY_PARAM(sparse_cache_types, sparse_cache_types_list, case_to_des= c); =20 -static struct regmap *gen_regmap(struct regmap_config *config, +static struct regmap *gen_regmap(struct kunit *test, + struct regmap_config *config, struct regmap_ram_data **data) { + struct regmap_test_priv *priv =3D test->priv; unsigned int *buf; struct regmap *ret; size_t size =3D (config->max_register + 1) * sizeof(unsigned int); @@ -103,7 +110,7 @@ static struct regmap *gen_regmap(struct regmap_config *= config, } } =20 - ret =3D regmap_init_ram(config, *data); + ret =3D regmap_init_ram(priv->dev, config, *data); if (IS_ERR(ret)) { kfree(buf); kfree(*data); @@ -128,7 +135,7 @@ static void basic_read_write(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -158,7 +165,7 @@ static void bulk_write(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -195,7 +202,7 @@ static void bulk_read(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -230,7 +237,7 @@ static void write_readonly(struct kunit *test) config.num_reg_defaults =3D BLOCK_TEST_SIZE; config.writeable_reg =3D reg_5_false; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -264,7 +271,7 @@ static void read_writeonly(struct kunit *test) config.cache_type =3D t->type; config.readable_reg =3D reg_5_false; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -304,7 +311,7 @@ static void reg_defaults(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -332,7 +339,7 @@ static void reg_defaults_read_dev(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults_raw =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -368,7 +375,7 @@ static void register_patch(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -419,7 +426,7 @@ static void stride(struct kunit *test) config.reg_stride =3D 2; config.num_reg_defaults =3D BLOCK_TEST_SIZE / 2; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -495,7 +502,7 @@ static void basic_ranges(struct kunit *test) config.num_ranges =3D 1; config.max_register =3D test_range.range_max; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -565,7 +572,7 @@ static void stress_insert(struct kunit *test) config.cache_type =3D t->type; config.max_register =3D 300; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -616,7 +623,7 @@ static void cache_bypass(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -655,7 +662,7 @@ static void cache_sync(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -694,7 +701,7 @@ static void cache_sync_defaults(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -730,7 +737,7 @@ static void cache_sync_readonly(struct kunit *test) config.cache_type =3D t->type; config.writeable_reg =3D reg_5_false; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -773,7 +780,7 @@ static void cache_sync_patch(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -832,7 +839,7 @@ static void cache_drop(struct kunit *test) config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -873,7 +880,7 @@ static void cache_present(struct kunit *test) config =3D test_regmap_config; config.cache_type =3D t->type; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -917,7 +924,7 @@ static void cache_range_window_reg(struct kunit *test) config.num_ranges =3D 1; config.max_register =3D test_range.range_max; =20 - map =3D gen_regmap(&config, &data); + map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -997,10 +1004,12 @@ static const struct regmap_config raw_regmap_config = =3D { .val_bits =3D 16, }; =20 -static struct regmap *gen_raw_regmap(struct regmap_config *config, +static struct regmap *gen_raw_regmap(struct kunit *test, + struct regmap_config *config, struct raw_test_types *test_type, struct regmap_ram_data **data) { + struct regmap_test_priv *priv =3D test->priv; u16 *buf; struct regmap *ret; size_t size =3D (config->max_register + 1) * config->reg_bits / 8; @@ -1052,7 +1061,7 @@ static struct regmap *gen_raw_regmap(struct regmap_co= nfig *config, if (config->cache_type =3D=3D REGCACHE_NONE) config->num_reg_defaults =3D 0; =20 - ret =3D regmap_init_raw_ram(config, *data); + ret =3D regmap_init_raw_ram(priv->dev, config, *data); if (IS_ERR(ret)) { kfree(buf); kfree(*data); @@ -1072,7 +1081,7 @@ static void raw_read_defaults_single(struct kunit *te= st) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1099,7 +1108,7 @@ static void raw_read_defaults(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1109,7 +1118,7 @@ static void raw_read_defaults(struct kunit *test) 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++) { @@ -1136,7 +1145,7 @@ static void raw_write_read_single(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1164,7 +1173,7 @@ static void raw_write(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1228,7 +1237,7 @@ static void raw_noinc_write(struct kunit *test) config.writeable_noinc_reg =3D reg_zero; config.readable_noinc_reg =3D reg_zero; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1276,7 +1285,7 @@ static void raw_sync(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1323,7 +1332,7 @@ static void raw_sync(struct kunit *test) val[2] =3D cpu_to_be16(val[2]); else val[2] =3D cpu_to_le16(val[2]); -=09 + /* The values should not appear in the "hardware" */ KUNIT_EXPECT_MEMNEQ(test, &hw_buf[2], &val[0], sizeof(val)); =20 @@ -1356,7 +1365,7 @@ static void raw_ranges(struct kunit *test) config.num_ranges =3D 1; config.max_register =3D test_range.range_max; =20 - map =3D gen_raw_regmap(&config, t, &data); + map =3D gen_raw_regmap(test, &config, t, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1437,8 +1446,40 @@ static struct kunit_case regmap_test_cases[] =3D { {} }; =20 +static int regmap_test_init(struct kunit *test) +{ + struct regmap_test_priv *priv; + struct device *dev; + + priv =3D kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + test->priv =3D priv; + + dev =3D kunit_device_register(test, "regmap_test"); + priv->dev =3D get_device(dev); + if (!priv->dev) + return -ENODEV; + + dev_set_drvdata(dev, test); + + return 0; +} + +static void regmap_test_exit(struct kunit *test) +{ + struct regmap_test_priv *priv =3D test->priv; + + /* Destroy the dummy struct device */ + if (priv && priv->dev) + put_device(priv->dev); +} + static struct kunit_suite regmap_test_suite =3D { .name =3D "regmap", + .init =3D regmap_test_init, + .exit =3D regmap_test_exit, .test_cases =3D regmap_test_cases, }; kunit_test_suite(regmap_test_suite); diff --git a/drivers/base/regmap/regmap-ram.c b/drivers/base/regmap/regmap-= ram.c index 192d6b131dff..5b4cbf982a11 100644 --- a/drivers/base/regmap/regmap-ram.c +++ b/drivers/base/regmap/regmap-ram.c @@ -53,7 +53,8 @@ static const struct regmap_bus regmap_ram =3D { .free_context =3D regmap_ram_free_context, }; =20 -struct regmap *__regmap_init_ram(const struct regmap_config *config, +struct regmap *__regmap_init_ram(struct device *dev, + const struct regmap_config *config, struct regmap_ram_data *data, struct lock_class_key *lock_key, const char *lock_name) @@ -75,7 +76,7 @@ struct regmap *__regmap_init_ram(const struct regmap_conf= ig *config, if (!data->written) return ERR_PTR(-ENOMEM); =20 - map =3D __regmap_init(NULL, ®map_ram, data, config, + map =3D __regmap_init(dev, ®map_ram, data, config, lock_key, lock_name); =20 return map; diff --git a/drivers/base/regmap/regmap-raw-ram.c b/drivers/base/regmap/reg= map-raw-ram.c index 93ae07b503fd..69eabfb89eda 100644 --- a/drivers/base/regmap/regmap-raw-ram.c +++ b/drivers/base/regmap/regmap-raw-ram.c @@ -107,7 +107,8 @@ static const struct regmap_bus regmap_raw_ram =3D { .free_context =3D regmap_raw_ram_free_context, }; =20 -struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, +struct regmap *__regmap_init_raw_ram(struct device *dev, + const struct regmap_config *config, struct regmap_ram_data *data, struct lock_class_key *lock_key, const char *lock_name) @@ -134,7 +135,7 @@ struct regmap *__regmap_init_raw_ram(const struct regma= p_config *config, =20 data->reg_endian =3D config->reg_format_endian; =20 - map =3D __regmap_init(NULL, ®map_raw_ram, data, config, + map =3D __regmap_init(dev, ®map_raw_ram, data, config, lock_key, lock_name); =20 return map; --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CF9213F011 for ; Mon, 8 Apr 2024 14:46:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; cv=none; b=JgDQPEVUfXoJBjlpl/synasZknVHXUqeDvuQpT1PMXIkg7Nra85McRk4WMhWNzoGXqBY/Ud22jyr/JQpwVcM9ivVNj89DOGedDk+q0Hy3tvYrYXmHoecufDsqL3uHwP5TGSX4vPlfWKbMgabXDMm3LihODFMGqlVkiIueQhZozg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; c=relaxed/simple; bh=a/4rn5jp1lTaSk2oH7N9JuuOQl9kivHIfztegQlaYlk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tHOvtVOzlCytAI+tOB/XnnbvHkV71q1aUBz9Ln2AEhbWV8mjobEVp21vq1j4MgPypa23L5aIThHfn/yo7Q0ioiyQJUqVjXjOocBUHvTQW+AESQIuOBlntDpeDRxOQSSbdFHkSm4XJkHYiEHyUxxaWihN4JRF8Ath1pmAoS9JM0Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=GCV1EwsQ; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="GCV1EwsQ" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL3032409; Mon, 8 Apr 2024 09:46:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=VbIW8qyKsPALaQgVoa+RAMMxAtYXggZ0eRdcwQ4xLQo=; b= GCV1EwsQsQ3xRdOVkysN2+Geg1UCVqrzvc0jNYNP4K6hqNQ/Qij93UN6f95mRmXJ 52g/eoNK/G7/1105KtsizbCwG5BsDRapHgJt8qUwEJ+Vwk6/7irOsXsdSampULjm recvqhjXI7XaA224gpkxw7maoaJOnh+HAPHFjpVq9OHAGVZyw6z2q4G+2UkyQFwy YoQJSIcNajonkZ8QkrPo48AtkIJ6rYBRlcOhzLeZDXKd98vTkKOOXZRlbfM/Njse xrXW8ZUr6FagM0mXiibpE93A4836v/BbHvsRob4uJDDiL2BPjKAJ5bk5tBmsVt9r Uk9DrlU0X7t35LGhBrLjDg== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:05 -0500 (CDT) Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id B4CFA820258; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 03/11] regmap: kunit: Introduce struct for test case parameters Date: Mon, 8 Apr 2024 15:45:52 +0100 Message-ID: <20240408144600.230848-4-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: SQ8jyYcxzy7k9V6c87uDxaikxc41bDA6 X-Proofpoint-GUID: SQ8jyYcxzy7k9V6c87uDxaikxc41bDA6 X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Add a struct regmap_test_param and use it for all test cases instead of passing various different types of param object depending on the test case. This makes it much easier and cleaner to expand what can be parameterized. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 213 +++++++++++++---------------- 1 file changed, 96 insertions(+), 117 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 3bc2028fbef7..2029135f68fb 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -14,6 +14,11 @@ struct regmap_test_priv { struct device *dev; }; =20 +struct regmap_test_param { + enum regcache_type cache; + enum regmap_endian val_endian; +}; + static void get_changed_bytes(void *orig, void *new, size_t size) { char *o =3D orig; @@ -37,44 +42,74 @@ static const struct regmap_config test_regmap_config = =3D { .val_bits =3D sizeof(unsigned int) * 8, }; =20 -struct regcache_types { - enum regcache_type type; - const char *name; -}; - -static void case_to_desc(const struct regcache_types *t, char *desc) +static const char *regcache_type_name(enum regcache_type type) { - strcpy(desc, t->name); + switch (type) { + case REGCACHE_NONE: + return "none"; + case REGCACHE_FLAT: + return "flat"; + case REGCACHE_RBTREE: + return "rbtree"; + case REGCACHE_MAPLE: + return "maple"; + default: + return NULL; + } } =20 -static const struct regcache_types regcache_types_list[] =3D { - { REGCACHE_NONE, "none" }, - { REGCACHE_FLAT, "flat" }, - { REGCACHE_RBTREE, "rbtree" }, - { REGCACHE_MAPLE, "maple" }, +static const char *regmap_endian_name(enum regmap_endian endian) +{ + switch (endian) { + case REGMAP_ENDIAN_BIG: + return "big"; + case REGMAP_ENDIAN_LITTLE: + return "little"; + case REGMAP_ENDIAN_DEFAULT: + return "default"; + case REGMAP_ENDIAN_NATIVE: + return "native"; + default: + return NULL; + } +} + +static void param_to_desc(const struct regmap_test_param *param, char *des= c) +{ + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s-%s", + regcache_type_name(param->cache), + regmap_endian_name(param->val_endian)); +} + +static const struct regmap_test_param regcache_types_list[] =3D { + { .cache =3D REGCACHE_NONE }, + { .cache =3D REGCACHE_FLAT }, + { .cache =3D REGCACHE_RBTREE }, + { .cache =3D REGCACHE_MAPLE }, }; =20 -KUNIT_ARRAY_PARAM(regcache_types, regcache_types_list, case_to_desc); +KUNIT_ARRAY_PARAM(regcache_types, regcache_types_list, param_to_desc); =20 -static const struct regcache_types real_cache_types_list[] =3D { - { REGCACHE_FLAT, "flat" }, - { REGCACHE_RBTREE, "rbtree" }, - { REGCACHE_MAPLE, "maple" }, +static const struct regmap_test_param real_cache_types_list[] =3D { + { .cache =3D REGCACHE_FLAT }, + { .cache =3D REGCACHE_RBTREE }, + { .cache =3D REGCACHE_MAPLE }, }; =20 -KUNIT_ARRAY_PARAM(real_cache_types, real_cache_types_list, case_to_desc); +KUNIT_ARRAY_PARAM(real_cache_types, real_cache_types_list, param_to_desc); =20 -static const struct regcache_types sparse_cache_types_list[] =3D { - { REGCACHE_RBTREE, "rbtree" }, - { REGCACHE_MAPLE, "maple" }, +static const struct regmap_test_param sparse_cache_types_list[] =3D { + { .cache =3D REGCACHE_RBTREE }, + { .cache =3D REGCACHE_MAPLE }, }; =20 -KUNIT_ARRAY_PARAM(sparse_cache_types, sparse_cache_types_list, case_to_des= c); +KUNIT_ARRAY_PARAM(sparse_cache_types, sparse_cache_types_list, param_to_de= sc); =20 static struct regmap *gen_regmap(struct kunit *test, struct regmap_config *config, struct regmap_ram_data **data) { + const struct regmap_test_param *param =3D test->param_value; struct regmap_test_priv *priv =3D test->priv; unsigned int *buf; struct regmap *ret; @@ -82,6 +117,7 @@ static struct regmap *gen_regmap(struct kunit *test, int i; struct reg_default *defaults; =20 + config->cache_type =3D param->cache; config->disable_locking =3D config->cache_type =3D=3D REGCACHE_RBTREE || config->cache_type =3D=3D REGCACHE_MAPLE; =20 @@ -126,14 +162,12 @@ static bool reg_5_false(struct device *context, unsig= ned int reg) =20 static void basic_read_write(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; unsigned int val, rval; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -148,14 +182,13 @@ static void basic_read_write(struct kunit *test) KUNIT_EXPECT_EQ(test, val, rval); =20 /* If using a cache the cache satisfied the read */ - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[0]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read[= 0]); =20 regmap_exit(map); } =20 static void bulk_write(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -163,7 +196,6 @@ static void bulk_write(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -185,14 +217,13 @@ static void bulk_write(struct kunit *test) =20 /* If using a cache the cache satisfied the read */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); =20 regmap_exit(map); } =20 static void bulk_read(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -200,7 +231,6 @@ static void bulk_read(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -218,14 +248,13 @@ static void bulk_read(struct kunit *test) =20 /* If using a cache the cache satisfied the read */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); =20 regmap_exit(map); } =20 static void write_readonly(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -233,7 +262,6 @@ static void write_readonly(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; config.writeable_reg =3D reg_5_false; =20 @@ -260,7 +288,6 @@ static void write_readonly(struct kunit *test) =20 static void read_writeonly(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -268,7 +295,6 @@ static void read_writeonly(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.readable_reg =3D reg_5_false; =20 map =3D gen_regmap(test, &config, &data); @@ -284,7 +310,7 @@ static void read_writeonly(struct kunit *test) * fail if we aren't using the flat cache. */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) { - if (t->type !=3D REGCACHE_FLAT) { + if (config.cache_type !=3D REGCACHE_FLAT) { KUNIT_EXPECT_EQ(test, i !=3D 5, regmap_read(map, i, &val) =3D=3D 0); } else { @@ -300,7 +326,6 @@ static void read_writeonly(struct kunit *test) =20 static void reg_defaults(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -308,7 +333,6 @@ static void reg_defaults(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -323,12 +347,11 @@ static void reg_defaults(struct kunit *test) =20 /* The data should have been read from cache if there was one */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); } =20 static void reg_defaults_read_dev(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -336,7 +359,6 @@ static void reg_defaults_read_dev(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults_raw =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -346,7 +368,7 @@ static void reg_defaults_read_dev(struct kunit *test) =20 /* We should have read the cache defaults back from the map */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) { - KUNIT_EXPECT_EQ(test, t->type !=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type !=3D REGCACHE_NONE, data->read[i= ]); data->read[i] =3D false; } =20 @@ -357,12 +379,11 @@ static void reg_defaults_read_dev(struct kunit *test) =20 /* The data should have been read from cache if there was one */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); } =20 static void register_patch(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -372,7 +393,6 @@ static void register_patch(struct kunit *test) =20 /* We need defaults so readback works */ config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -414,7 +434,6 @@ static void register_patch(struct kunit *test) =20 static void stride(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -422,7 +441,6 @@ static void stride(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.reg_stride =3D 2; config.num_reg_defaults =3D BLOCK_TEST_SIZE / 2; =20 @@ -444,7 +462,7 @@ static void stride(struct kunit *test) } else { KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); KUNIT_EXPECT_EQ(test, data->vals[i], rval); - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read[i]); =20 KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, rval)); @@ -488,7 +506,6 @@ static bool test_range_all_volatile(struct device *dev,= unsigned int reg) =20 static void basic_ranges(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -496,7 +513,6 @@ static void basic_ranges(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.volatile_reg =3D test_range_all_volatile; config.ranges =3D &test_range; config.num_ranges =3D 1; @@ -560,7 +576,6 @@ static void basic_ranges(struct kunit *test) /* Try to stress dynamic creation of cache data structures */ static void stress_insert(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -569,7 +584,6 @@ static void stress_insert(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.max_register =3D 300; =20 map =3D gen_regmap(test, &config, &data); @@ -606,7 +620,7 @@ static void stress_insert(struct kunit *test) for (i =3D 0; i < config.max_register; i ++) { KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); KUNIT_EXPECT_EQ(test, rval, vals[i]); - KUNIT_EXPECT_EQ(test, t->type =3D=3D REGCACHE_NONE, data->read[i]); + KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); } =20 regmap_exit(map); @@ -614,14 +628,12 @@ static void stress_insert(struct kunit *test) =20 static void cache_bypass(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; unsigned int val, rval; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -652,7 +664,6 @@ static void cache_bypass(struct kunit *test) =20 static void cache_sync(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -660,7 +671,6 @@ static void cache_sync(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -690,7 +700,6 @@ static void cache_sync(struct kunit *test) =20 static void cache_sync_defaults(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -698,7 +707,6 @@ static void cache_sync_defaults(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -726,7 +734,6 @@ static void cache_sync_defaults(struct kunit *test) =20 static void cache_sync_readonly(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -734,7 +741,6 @@ static void cache_sync_readonly(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.writeable_reg =3D reg_5_false; =20 map =3D gen_regmap(test, &config, &data); @@ -767,7 +773,6 @@ static void cache_sync_readonly(struct kunit *test) =20 static void cache_sync_patch(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -777,7 +782,6 @@ static void cache_sync_patch(struct kunit *test) =20 /* We need defaults so readback works */ config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -828,7 +832,6 @@ static void cache_sync_patch(struct kunit *test) =20 static void cache_drop(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -836,7 +839,6 @@ static void cache_drop(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.num_reg_defaults =3D BLOCK_TEST_SIZE; =20 map =3D gen_regmap(test, &config, &data); @@ -870,7 +872,6 @@ static void cache_drop(struct kunit *test) =20 static void cache_present(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -878,7 +879,6 @@ static void cache_present(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; =20 map =3D gen_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); @@ -910,7 +910,6 @@ static void cache_present(struct kunit *test) /* Check that caching the window register works with sync */ static void cache_range_window_reg(struct kunit *test) { - struct regcache_types *t =3D (struct regcache_types *)test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -918,7 +917,6 @@ static void cache_range_window_reg(struct kunit *test) int i; =20 config =3D test_regmap_config; - config.cache_type =3D t->type; config.volatile_reg =3D test_range_window_volatile; config.ranges =3D &test_range; config.num_ranges =3D 1; @@ -960,41 +958,29 @@ static void cache_range_window_reg(struct kunit *test) KUNIT_ASSERT_EQ(test, val, 2); } =20 -struct raw_test_types { - const char *name; - - enum regcache_type cache_type; - enum regmap_endian val_endian; +static const struct regmap_test_param raw_types_list[] =3D { + { .cache =3D REGCACHE_NONE, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_NONE, .val_endian =3D REGMAP_ENDIAN_BIG }, + { .cache =3D REGCACHE_FLAT, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_FLAT, .val_endian =3D REGMAP_ENDIAN_BIG }, + { .cache =3D REGCACHE_RBTREE, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_RBTREE, .val_endian =3D REGMAP_ENDIAN_BIG }, + { .cache =3D REGCACHE_MAPLE, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_MAPLE, .val_endian =3D REGMAP_ENDIAN_BIG }, }; =20 -static void raw_to_desc(const struct raw_test_types *t, char *desc) -{ - strcpy(desc, t->name); -} +KUNIT_ARRAY_PARAM(raw_test_types, raw_types_list, param_to_desc); =20 -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 }, +static const struct regmap_test_param raw_cache_types_list[] =3D { + { .cache =3D REGCACHE_FLAT, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_FLAT, .val_endian =3D REGMAP_ENDIAN_BIG }, + { .cache =3D REGCACHE_RBTREE, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_RBTREE, .val_endian =3D REGMAP_ENDIAN_BIG }, + { .cache =3D REGCACHE_MAPLE, .val_endian =3D REGMAP_ENDIAN_LITTLE }, + { .cache =3D REGCACHE_MAPLE, .val_endian =3D REGMAP_ENDIAN_BIG }, }; =20 -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); +KUNIT_ARRAY_PARAM(raw_test_cache_types, raw_cache_types_list, param_to_des= c); =20 static const struct regmap_config raw_regmap_config =3D { .max_register =3D BLOCK_TEST_SIZE, @@ -1006,18 +992,18 @@ static const struct regmap_config raw_regmap_config = =3D { =20 static struct regmap *gen_raw_regmap(struct kunit *test, struct regmap_config *config, - struct raw_test_types *test_type, struct regmap_ram_data **data) { struct regmap_test_priv *priv =3D test->priv; + const struct regmap_test_param *param =3D test->param_value; u16 *buf; struct regmap *ret; size_t size =3D (config->max_register + 1) * config->reg_bits / 8; int i; struct reg_default *defaults; =20 - config->cache_type =3D test_type->cache_type; - config->val_format_endian =3D test_type->val_endian; + config->cache_type =3D param->cache; + config->val_format_endian =3D param->val_endian; config->disable_locking =3D config->cache_type =3D=3D REGCACHE_RBTREE || config->cache_type =3D=3D REGCACHE_MAPLE; =20 @@ -1042,7 +1028,7 @@ static struct regmap *gen_raw_regmap(struct kunit *te= st, =20 for (i =3D 0; i < config->num_reg_defaults; i++) { defaults[i].reg =3D i; - switch (test_type->val_endian) { + switch (param->val_endian) { case REGMAP_ENDIAN_LITTLE: defaults[i].def =3D le16_to_cpu(buf[i]); break; @@ -1072,7 +1058,6 @@ static struct regmap *gen_raw_regmap(struct kunit *te= st, =20 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; @@ -1081,7 +1066,7 @@ static void raw_read_defaults_single(struct kunit *te= st) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1097,7 +1082,6 @@ static void raw_read_defaults_single(struct kunit *te= st) =20 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; @@ -1108,7 +1092,7 @@ static void raw_read_defaults(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1136,7 +1120,6 @@ static void raw_read_defaults(struct kunit *test) =20 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; @@ -1145,7 +1128,7 @@ static void raw_write_read_single(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1162,7 +1145,6 @@ static void raw_write_read_single(struct kunit *test) =20 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; @@ -1173,7 +1155,7 @@ static void raw_write(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1224,7 +1206,6 @@ static bool ram_reg_zero(struct regmap_ram_data *data= , unsigned int reg) =20 static void raw_noinc_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; @@ -1237,7 +1218,7 @@ static void raw_noinc_write(struct kunit *test) config.writeable_noinc_reg =3D reg_zero; config.readable_noinc_reg =3D reg_zero; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1274,7 +1255,6 @@ static void raw_noinc_write(struct kunit *test) =20 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; @@ -1285,7 +1265,7 @@ static void raw_sync(struct kunit *test) =20 config =3D raw_regmap_config; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; @@ -1352,7 +1332,6 @@ static void raw_sync(struct kunit *test) =20 static void raw_ranges(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; @@ -1365,7 +1344,7 @@ static void raw_ranges(struct kunit *test) config.num_ranges =3D 1; config.max_register =3D test_range.range_max; =20 - map =3D gen_raw_regmap(test, &config, t, &data); + map =3D gen_raw_regmap(test, &config, &data); KUNIT_ASSERT_FALSE(test, IS_ERR(map)); if (IS_ERR(map)) return; --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8238C13F43E for ; Mon, 8 Apr 2024 14:46:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; cv=none; b=ZYu0cLLO5I1I93fx5uk/beYMEorh4k7qSf7itfWE4NBWT+gVLNktTKIQfTBSgVaTVPwDhIouhgkkRLA+DaBt546PjD3y4LYcQOwd2cmroyXcLJcfLH9T3TZLSui81dQVCFLbobOfvll9qvJ13Bh2bZ95fGyO7Rj4c8ch4KgrKVk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; c=relaxed/simple; bh=COZHVF2HGyQQYVJGe7MkMo7N1Abu2Fm088yJ84SwZhY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=d9K4D/INIg6ozXLH9p6u7HXaF8QjOkkFXxI/sZ7FjR69qC1p0i2cWdTAIK4MDFyH4m3yuB3m4qIFKTZX2tfwUd8WIHGdH3lEXZyz+PLFZqlJ4qVqs0Dc2LO6c4LVMjRgpFWy16mzDg1ron55TndB+f8DOFil3I/SkfKhxxmvjA0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=cKy1kiZf; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="cKy1kiZf" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQp026412; Mon, 8 Apr 2024 09:46:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=JUi1w4/+xFgNZjiUW1asMxbA8ooC2n7RN58GfWZQbG4=; b= cKy1kiZf3S8FpdyGYPRG11OexniJmowkIS3gkuBZodMP/Pzou5PHKDqFo+cfZcNy A1j82FTnxuNj1uXrjnANssRODx+4egfe7SEypfB/RZDBpTuXbmTOek4YAPi9hraE 3Mu72qwmWskNRCkWFladcuUNY/tLOis8cq6AHB9lNoC5VFTvIFSBkjw8mtYdKV1U XPPxsOqYu0/txtWWI5bBY4PnR14NuUeEN/Mn/QGlPBmWs+J6+/qOLYy7XIVGqs+e ofmxlOEJx7mrr/e3TLaXgWGLWXbpoFBXWstEd9BTEzLA7/CCnhWd3cFp6HyOHr1i ER7I+0q4l4yRm6arkkbjsA== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:06 -0500 (CDT) Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id B7D21820259; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 04/11] regmap: kunit: Run sparse cache tests at non-zero register addresses Date: Mon, 8 Apr 2024 15:45:53 +0100 Message-ID: <20240408144600.230848-5-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: SK9BTxTVQ8APNOKFdF3VLeqdJHh-4IWV X-Proofpoint-GUID: SK9BTxTVQ8APNOKFdF3VLeqdJHh-4IWV X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Run the cache_drop() and cache_present() tests at blocks of addresses that don't start at zero. This adds a from_reg parameter to struct regmap_test_param. This is used to set the base address of the register defaults created by gen_regmap(). Extra entries are added to sparse_cache_types_list[] to test at non-zero from_reg values. The cache_drop() and cache_present() tests are updated to test at the given offset. The aim here is to add test cases to cache_drop() for the bug fixed by commit 00bb549d7d63 ("regmap: maple: Fix cache corruption in regcache_maple_drop()") But the same parameter table is used by the cache_present() test so let's also update that to use from_reg. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 67 ++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 2029135f68fb..ae147fc8509b 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -17,6 +17,8 @@ struct regmap_test_priv { struct regmap_test_param { enum regcache_type cache; enum regmap_endian val_endian; + + unsigned int from_reg; }; =20 static void get_changed_bytes(void *orig, void *new, size_t size) @@ -37,7 +39,6 @@ static void get_changed_bytes(void *orig, void *new, size= _t size) } =20 static const struct regmap_config test_regmap_config =3D { - .max_register =3D BLOCK_TEST_SIZE, .reg_stride =3D 1, .val_bits =3D sizeof(unsigned int) * 8, }; @@ -76,9 +77,10 @@ static const char *regmap_endian_name(enum regmap_endian= endian) =20 static void param_to_desc(const struct regmap_test_param *param, char *des= c) { - snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s-%s", + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s-%s @%#x", regcache_type_name(param->cache), - regmap_endian_name(param->val_endian)); + regmap_endian_name(param->val_endian), + param->from_reg); } =20 static const struct regmap_test_param regcache_types_list[] =3D { @@ -99,8 +101,16 @@ static const struct regmap_test_param real_cache_types_= list[] =3D { KUNIT_ARRAY_PARAM(real_cache_types, real_cache_types_list, param_to_desc); =20 static const struct regmap_test_param sparse_cache_types_list[] =3D { - { .cache =3D REGCACHE_RBTREE }, - { .cache =3D REGCACHE_MAPLE }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2001 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2002 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2003 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2004 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2001 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2002 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2003 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2004 }, }; =20 KUNIT_ARRAY_PARAM(sparse_cache_types, sparse_cache_types_list, param_to_de= sc); @@ -113,7 +123,7 @@ static struct regmap *gen_regmap(struct kunit *test, struct regmap_test_priv *priv =3D test->priv; unsigned int *buf; struct regmap *ret; - size_t size =3D (config->max_register + 1) * sizeof(unsigned int); + size_t size; int i; struct reg_default *defaults; =20 @@ -121,6 +131,16 @@ static struct regmap *gen_regmap(struct kunit *test, config->disable_locking =3D config->cache_type =3D=3D REGCACHE_RBTREE || config->cache_type =3D=3D REGCACHE_MAPLE; =20 + if (config->max_register =3D=3D 0) { + config->max_register =3D param->from_reg; + if (config->num_reg_defaults) + config->max_register +=3D (config->num_reg_defaults - 1) * + config->reg_stride; + else + config->max_register +=3D (BLOCK_TEST_SIZE * config->reg_stride); + } + + size =3D (config->max_register + 1) * sizeof(unsigned int); buf =3D kmalloc(size, GFP_KERNEL); if (!buf) return ERR_PTR(-ENOMEM); @@ -141,8 +161,8 @@ static struct regmap *gen_regmap(struct kunit *test, config->reg_defaults =3D defaults; =20 for (i =3D 0; i < config->num_reg_defaults; i++) { - defaults[i].reg =3D i * config->reg_stride; - defaults[i].def =3D buf[i * config->reg_stride]; + defaults[i].reg =3D param->from_reg + (i * config->reg_stride); + defaults[i].def =3D buf[param->from_reg + (i * config->reg_stride)]; } } =20 @@ -832,6 +852,7 @@ static void cache_sync_patch(struct kunit *test) =20 static void cache_drop(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -848,30 +869,32 @@ static void cache_drop(struct kunit *test) =20 /* Ensure the data is read from the cache */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->read[i] =3D false; - KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval, + data->read[param->from_reg + i] =3D false; + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, BLOCK_TEST_SIZE)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) { - KUNIT_EXPECT_FALSE(test, data->read[i]); - data->read[i] =3D false; + KUNIT_EXPECT_FALSE(test, data->read[param->from_reg + i]); + data->read[param->from_reg + i] =3D false; } - KUNIT_EXPECT_MEMEQ(test, data->vals, rval, sizeof(rval)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); =20 /* Drop some registers */ - KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 3, 5)); + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, param->from_reg + 3, + param->from_reg + 5)); =20 /* Reread and check only the dropped registers hit the device. */ - KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval, + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, BLOCK_TEST_SIZE)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, data->read[i], i >=3D 3 && i <=3D 5); - KUNIT_EXPECT_MEMEQ(test, data->vals, rval, sizeof(rval)); + KUNIT_EXPECT_EQ(test, data->read[param->from_reg + i], i >=3D 3 && i <= =3D 5); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); =20 regmap_exit(map); } =20 static void cache_present(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -886,23 +909,23 @@ static void cache_present(struct kunit *test) return; =20 for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->read[i] =3D false; + data->read[param->from_reg + i] =3D false; =20 /* No defaults so no registers cached. */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_ASSERT_FALSE(test, regcache_reg_cached(map, i)); + KUNIT_ASSERT_FALSE(test, regcache_reg_cached(map, param->from_reg + i)); =20 /* We didn't trigger any reads */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_ASSERT_FALSE(test, data->read[i]); + KUNIT_ASSERT_FALSE(test, data->read[param->from_reg + i]); =20 /* Fill the cache */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &val)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val)); =20 /* Now everything should be cached */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_ASSERT_TRUE(test, regcache_reg_cached(map, i)); + KUNIT_ASSERT_TRUE(test, regcache_reg_cached(map, param->from_reg + i)); =20 regmap_exit(map); } --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AD8C13EFE8 for ; Mon, 8 Apr 2024 14:46:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; cv=none; b=uTXq/1A/RK5uuw6DKa1svrKMXlYgqjDcv4CwnyzVOIVFfl0yudsqRigh8zL6fjnkVk2vwpRBe+TGbqsid0R7OCLvG74b6oSCYxq+u8wdGYVSBrV1DaFUJQcohCW4g2/3sMr0+tQ2/vgGQ1VYKTjiD7/jYU4ua1BhuDM3Skr51xc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; c=relaxed/simple; bh=FM2gvVgm7RdhrzrYFYSBZ0ve0s4cFxkKJ15yIebtVMk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lZKn/sRdkjkwW4R397HWM1R5syycTKUyCyoLBKHy2nv/RyhFqre6mEgZOwtajjqdEKTeM0rABbKLdFnPyrhPbAIxSA1O6Gwd8FqOG9sSgzkVUTx+oCECAffcMInwJbYLYS+Odp0+9ltacvOuYDPB/QrsacZP0m64+XQToNwdUgM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=YtAtpVoQ; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="YtAtpVoQ" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL2032409; Mon, 8 Apr 2024 09:46:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=zJj6P9Rx4Hs4xzBtc9SKUtoj1zh3064v3eFHWXurk+8=; b= YtAtpVoQ/Kaz45TJMys57oIg7u81roRqOqivYv7lvQE9X1oAoSSTi7xMCOvjVAGV f5q1HWctE5PhENkq0/YdGyhyzjCxAmPWjKWMVwkMmoI03O/sz1oB23Sq5emfoOUK kyLVsRQxBhuyQBNcC80oEtNeS0xC7W4FsunvuL0iI4qmKM54zvl8nM+r5C40W5ST zkMQCjUQ1JK3DajDNOvl2VlLnrMH9n4RqBB4jvpjLfoQ38EE38R2OXHTfXXAAyqP WgYxZ084hpGD/0Eabe5f1aFpBoC6W6PO8ZBpSoUgC8OTKFenfxRWYZDwHqNzRLEC AwJmObxWUlgkM5PMIj2UIw== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:04 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id B9E0F82025A; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 05/11] regmap: kunit: Run non-sparse cache tests at non-zero register addresses Date: Mon, 8 Apr 2024 15:45:54 +0100 Message-ID: <20240408144600.230848-6-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: U9YWUhz0a7Q2Cf8aRX6I-aWCKUFk6Q6O X-Proofpoint-GUID: U9YWUhz0a7Q2Cf8aRX6I-aWCKUFk6Q6O X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Change the tests parameterized by real_cache_types_list[] to test at some register addresses that are not 0. The cache_range_window_reg() test has hardcoded address assumptions that are not present in any other tests using real_cache_types_list[] table. So it has been given a separate parameter table, real_cache_types_only_list[], that preserves the original parameterization. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 86 ++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index ae147fc8509b..873161b58de9 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -92,12 +92,32 @@ static const struct regmap_test_param regcache_types_li= st[] =3D { =20 KUNIT_ARRAY_PARAM(regcache_types, regcache_types_list, param_to_desc); =20 -static const struct regmap_test_param real_cache_types_list[] =3D { +static const struct regmap_test_param real_cache_types_only_list[] =3D { { .cache =3D REGCACHE_FLAT }, { .cache =3D REGCACHE_RBTREE }, { .cache =3D REGCACHE_MAPLE }, }; =20 +KUNIT_ARRAY_PARAM(real_cache_types_only, real_cache_types_only_list, param= _to_desc); + +static const struct regmap_test_param real_cache_types_list[] =3D { + { .cache =3D REGCACHE_FLAT, .from_reg =3D 0 }, + { .cache =3D REGCACHE_FLAT, .from_reg =3D 0x2001 }, + { .cache =3D REGCACHE_FLAT, .from_reg =3D 0x2002 }, + { .cache =3D REGCACHE_FLAT, .from_reg =3D 0x2003 }, + { .cache =3D REGCACHE_FLAT, .from_reg =3D 0x2004 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2001 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2002 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2003 }, + { .cache =3D REGCACHE_RBTREE, .from_reg =3D 0x2004 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2001 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2002 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2003 }, + { .cache =3D REGCACHE_MAPLE, .from_reg =3D 0x2004 }, +}; + KUNIT_ARRAY_PARAM(real_cache_types, real_cache_types_list, param_to_desc); =20 static const struct regmap_test_param sparse_cache_types_list[] =3D { @@ -175,9 +195,12 @@ static struct regmap *gen_regmap(struct kunit *test, return ret; } =20 -static bool reg_5_false(struct device *context, unsigned int reg) +static bool reg_5_false(struct device *dev, unsigned int reg) { - return reg !=3D 5; + struct kunit *test =3D dev_get_drvdata(dev); + const struct regmap_test_param *param =3D test->param_value; + + return reg !=3D (param->from_reg + 5); } =20 static void basic_read_write(struct kunit *test) @@ -648,6 +671,7 @@ static void stress_insert(struct kunit *test) =20 static void cache_bypass(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -663,20 +687,20 @@ static void cache_bypass(struct kunit *test) get_random_bytes(&val, sizeof(val)); =20 /* Ensure the cache has a value in it */ - KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 0, val)); + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg, val)); =20 /* Bypass then write a different value */ regcache_cache_bypass(map, true); - KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 0, val + 1)); + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg, val + 1)); =20 /* Read the bypassed value */ - KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &rval)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg, &rval)); KUNIT_EXPECT_EQ(test, val + 1, rval); - KUNIT_EXPECT_EQ(test, data->vals[0], rval); + KUNIT_EXPECT_EQ(test, data->vals[param->from_reg], rval); =20 /* Disable bypass, the cache should still return the original value */ regcache_cache_bypass(map, false); - KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &rval)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg, &rval)); KUNIT_EXPECT_EQ(test, val, rval); =20 regmap_exit(map); @@ -684,6 +708,7 @@ static void cache_bypass(struct kunit *test) =20 static void cache_sync(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -700,10 +725,10 @@ static void cache_sync(struct kunit *test) get_random_bytes(&val, sizeof(val)); =20 /* Put some data into the cache */ - KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, 0, val, + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, BLOCK_TEST_SIZE)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->written[i] =3D false; + data->written[param->from_reg + i] =3D false; =20 /* Trash the data on the device itself then resync */ regcache_mark_dirty(map); @@ -711,15 +736,16 @@ static void cache_sync(struct kunit *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); =20 /* Did we just write the correct data out? */ - KUNIT_EXPECT_MEMEQ(test, data->vals, val, sizeof(val)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, true, data->written[i]); + KUNIT_EXPECT_EQ(test, true, data->written[param->from_reg + i]); =20 regmap_exit(map); } =20 static void cache_sync_defaults(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -737,23 +763,24 @@ static void cache_sync_defaults(struct kunit *test) get_random_bytes(&val, sizeof(val)); =20 /* Change the value of one register */ - KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 2, val)); + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, val)); =20 /* Resync */ regcache_mark_dirty(map); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->written[i] =3D false; + data->written[param->from_reg + i] =3D false; KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); =20 /* Did we just sync the one register we touched? */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, i =3D=3D 2, data->written[i]); + KUNIT_EXPECT_EQ(test, i =3D=3D 2, data->written[param->from_reg + i]); =20 regmap_exit(map); } =20 static void cache_sync_readonly(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -770,29 +797,30 @@ static void cache_sync_readonly(struct kunit *test) =20 /* Read all registers to fill the cache */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &val)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val)); =20 /* Change the value of all registers, readonly should fail */ get_random_bytes(&val, sizeof(val)); regcache_cache_only(map, true); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, i !=3D 5, regmap_write(map, i, val) =3D=3D 0); + KUNIT_EXPECT_EQ(test, i !=3D 5, regmap_write(map, param->from_reg + i, v= al) =3D=3D 0); regcache_cache_only(map, false); =20 /* Resync */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->written[i] =3D false; + data->written[param->from_reg + i] =3D false; KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); =20 /* Did that match what we see on the device? */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - KUNIT_EXPECT_EQ(test, i !=3D 5, data->written[i]); + KUNIT_EXPECT_EQ(test, i !=3D 5, data->written[param->from_reg + i]); =20 regmap_exit(map); } =20 static void cache_sync_patch(struct kunit *test) { + const struct regmap_test_param *param =3D test->param_value; struct regmap *map; struct regmap_config config; struct regmap_ram_data *data; @@ -810,14 +838,14 @@ static void cache_sync_patch(struct kunit *test) return; =20 /* Stash the original values */ - KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval, + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, BLOCK_TEST_SIZE)); =20 /* Patch a couple of values */ - patch[0].reg =3D 2; + patch[0].reg =3D param->from_reg + 2; patch[0].def =3D rval[2] + 1; patch[0].delay_us =3D 0; - patch[1].reg =3D 5; + patch[1].reg =3D param->from_reg + 5; patch[1].def =3D rval[5] + 1; patch[1].delay_us =3D 0; KUNIT_EXPECT_EQ(test, 0, regmap_register_patch(map, patch, @@ -826,23 +854,23 @@ static void cache_sync_patch(struct kunit *test) /* Sync the cache */ regcache_mark_dirty(map); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) - data->written[i] =3D false; + data->written[param->from_reg + i] =3D false; KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); =20 /* The patch should be on the device but not in the cache */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) { - KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &val)); + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val)); KUNIT_EXPECT_EQ(test, val, rval[i]); =20 switch (i) { case 2: case 5: - KUNIT_EXPECT_EQ(test, true, data->written[i]); - KUNIT_EXPECT_EQ(test, data->vals[i], rval[i] + 1); + KUNIT_EXPECT_EQ(test, true, data->written[param->from_reg + i]); + KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + i], rval[i] + 1); break; default: - KUNIT_EXPECT_EQ(test, false, data->written[i]); - KUNIT_EXPECT_EQ(test, data->vals[i], rval[i]); + KUNIT_EXPECT_EQ(test, false, data->written[param->from_reg + i]); + KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + i], rval[i]); break; } } @@ -1436,7 +1464,7 @@ static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(cache_sync_patch, real_cache_types_gen_params), KUNIT_CASE_PARAM(cache_drop, sparse_cache_types_gen_params), KUNIT_CASE_PARAM(cache_present, sparse_cache_types_gen_params), - KUNIT_CASE_PARAM(cache_range_window_reg, real_cache_types_gen_params), + KUNIT_CASE_PARAM(cache_range_window_reg, real_cache_types_only_gen_params= ), =20 KUNIT_CASE_PARAM(raw_read_defaults_single, raw_test_types_gen_params), KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params), --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E7C013F420 for ; Mon, 8 Apr 2024 14:46:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; cv=none; b=JiwqlNcTBLpaRERptPAaZntvSlG7xpN5h9k6CIqLthlL69cqNR9p5os8MgJ+bpxqZelEMLqE2yecehPafu6xihLv2vzOMkirxA4w8xt4vsILgXcW2zsEr/bxRL9gPmecQeENKYUZBB6gw+axA1ztsrbTC0bTg0Gm89Iff7ZLV0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; c=relaxed/simple; bh=GO1OoZGWDRTEwcFH8XTLGDXGIOV1ef3rocNaVIpdxhY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=I8o0Gs+0b88/ZB3ZOw4JSCkAEa2hGxDJLB4bMPHyR/SHlVqer/w1gDy8BGVtSfFw1gFUEG7guN2QLqCbd9iQGg+fwDFxGpE9nRDi5No2YH2Ff5xddutkAT4kOq/+7C1jGUH5jJgmv6Wqdxgz9hdbDpe1y/o9PnpVrwSuvjmHL2E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=H74lTzvK; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="H74lTzvK" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQo026412; Mon, 8 Apr 2024 09:46:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=0LY4PRZr8+qXm6jOmCuGT0UJIVWVwZ1VbCI2U4t5SsY=; b= H74lTzvK3ahkmbObbRg8nOkVOAztQWtcw2XWDRJOb7VM/BZqUd5409EKEDGNrU7i rksQZhfRtCpGazRmY4hIbS8nvTbPskxMSKAqwHPNnxej+2uFRUIIDCcLbMIdK8xT DGUII39ydErl7wmGk8GI+HkbjrJZieXUBsDog4+G8JEP1eLRscDnJ+zMyC5tHyat Fx6RiCVZaQ+2NY4qJGTCoM6hG0le1Qm6POV0ctJVZE8jOJ24A9JVlIrkE56ZA00K hUDgeDBQMU7Nlw2R1vDrLFezNdd8LMHZDnncx3q3/u/kbdfobyB1QT9HvZSp0nFN 2/Q7O/uIBR765uHK74JYEg== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:05 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id BC0E082026B; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 06/11] regmap: kunit: Add more cache-drop tests Date: Mon, 8 Apr 2024 15:45:55 +0100 Message-ID: <20240408144600.230848-7-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: oNtyoB8tJDkEET3ddTO-w9VcB-TQxlDY X-Proofpoint-GUID: oNtyoB8tJDkEET3ddTO-w9VcB-TQxlDY X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Extend the testing of cache-drop. - Added cache_drop_all_and_sync_marked_dirty(). If all registers are dropped from the cache a regcache_mark_dirty() followed by regcache_sync() should not write anything because the cache is empty. - Added cache_drop_all_and_sync_no_defaults(). This is similar to cache_drop_all_and_sync_marked_dirty() except that regcache_mark_dirty() is NOT called. All registers were dropped so regcache_sync() should not write anything. - Added cache_drop_all_and_sync_has_defaults(). This is the same as cache_drop_all_and_sync_no_defaults() except that the regmap has a table of default values. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 135 +++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 873161b58de9..3201f5f6406b 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -920,6 +920,138 @@ static void cache_drop(struct kunit *test) regmap_exit(map); } =20 +static void cache_drop_all_and_sync_marked_dirty(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int rval[BLOCK_TEST_SIZE]; + int i; + + config =3D test_regmap_config; + config.num_reg_defaults =3D BLOCK_TEST_SIZE; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + /* Ensure the data is read from the cache */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->read[param->from_reg + i] =3D false; + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, + BLOCK_TEST_SIZE)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); + + /* Change all values in cache from defaults */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] = + 1)); + + /* Drop all registers */ + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register= )); + + /* Mark dirty and cache sync should not write anything. */ + regcache_mark_dirty(map); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + for (i =3D 0; i <=3D config.max_register; i++) + KUNIT_EXPECT_FALSE(test, data->written[i]); + + regmap_exit(map); +} + +static void cache_drop_all_and_sync_no_defaults(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int rval[BLOCK_TEST_SIZE]; + int i; + + config =3D test_regmap_config; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + /* Ensure the data is read from the cache */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->read[param->from_reg + i] =3D false; + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, + BLOCK_TEST_SIZE)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); + + /* Change all values in cache */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] = + 1)); + + /* Drop all registers */ + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register= )); + + /* + * Sync cache without marking it dirty. All registers were dropped + * so the cache should not have any entries to write out. + */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + for (i =3D 0; i <=3D config.max_register; i++) + KUNIT_EXPECT_FALSE(test, data->written[i]); + + regmap_exit(map); +} + +static void cache_drop_all_and_sync_has_defaults(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int rval[BLOCK_TEST_SIZE]; + int i; + + config =3D test_regmap_config; + config.num_reg_defaults =3D BLOCK_TEST_SIZE; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + /* Ensure the data is read from the cache */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->read[param->from_reg + i] =3D false; + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval, + BLOCK_TEST_SIZE)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); + + /* Change all values in cache from defaults */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] = + 1)); + + /* Drop all registers */ + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register= )); + + /* + * Sync cache without marking it dirty. All registers were dropped + * so the cache should not have any entries to write out. + */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + for (i =3D 0; i <=3D config.max_register; i++) + KUNIT_EXPECT_FALSE(test, data->written[i]); + + regmap_exit(map); +} + static void cache_present(struct kunit *test) { const struct regmap_test_param *param =3D test->param_value; @@ -1463,6 +1595,9 @@ static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(cache_sync_readonly, 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(cache_drop_all_and_sync_marked_dirty, sparse_cache_types= _gen_params), + KUNIT_CASE_PARAM(cache_drop_all_and_sync_no_defaults, sparse_cache_types_= gen_params), + KUNIT_CASE_PARAM(cache_drop_all_and_sync_has_defaults, sparse_cache_types= _gen_params), KUNIT_CASE_PARAM(cache_present, sparse_cache_types_gen_params), KUNIT_CASE_PARAM(cache_range_window_reg, real_cache_types_only_gen_params= ), =20 --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AD4613EFE3 for ; Mon, 8 Apr 2024 14:46:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; cv=none; b=VANd6xh0d0vnncSxHTf7v6xz8b9YqRfkC8XsIhi2NfkX5pm/I6qcRENr2ISBDBi77i5KFjbw8BfwCTsjs7h+pfbBe/DJI6spsrB8FANqySialur3wWl3EYidN5R0N5R2cjPPOAZnMtGhXDfj+0IPIdar2KrBLQuszl0Ixyxbi1k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587570; c=relaxed/simple; bh=KHlvJWsbeMu59kzQUhqgufoGLgCPogqNvZHlzzE3PHQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jHWd2XO44fMShDyfqmLa3Ylu9eeZ3KRUxuTc4rEDEA0pqRE5FgD3jCW1MH2jzyUHXqBxIgUq7EcbIfkvkalnjjhv+tjR8RajXDG5mU0mW8opp0kRqlXZQHavzqOncCicwbcu+rBTyR7nITDsS/HS9lIJF0t1ecss+7MliovaYXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=SJ/MbSbM; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="SJ/MbSbM" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQn026412; Mon, 8 Apr 2024 09:46:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=ztAgntGbfvSuq2sHS6V7+FZxdEZkOYXsd9acqSxg14g=; b= SJ/MbSbMKeDr8nYr66UzdEaO8Pz5WGtMb4qD9cZ4Eyd5LjHKFG4rJGyRSpAb3i71 h/b/EFUPJ7HzvgYZ2m2TbdohDDekuEj7N1b7PsHHO+J8OEVe6DVt5HPsPpDqEH5j cUQeoZ+B1QZ76tut4U71lCE5XU+ANHE1UBIE/EZeEBL95JIteDff4H/oXVsDIFuI Xath78EM0zH30T3bAt0h9FaodPx7JqHQ3ejcuiHi7rkcJgX6CnBEtPpLogPFRMii XGJbTkJI3bYZMghQQKouvKRajF+m5hCFLe7R1vR9i30qPDfJo6tgtZyzwAjjImEG tTuAvz/peJ84KqJul5rQ7Q== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:04 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id BE18582026C; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 07/11] regmap: kunit: Add more cache-sync tests Date: Mon, 8 Apr 2024 15:45:56 +0100 Message-ID: <20240408144600.230848-8-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: rSIIfgjYbeRV6_BpDjYx3wj2xOzdvTp7 X-Proofpoint-GUID: rSIIfgjYbeRV6_BpDjYx3wj2xOzdvTp7 X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Extend the testing of cache-sync. - cache_sync() renamed cache_sync_marked_dirty() for clarity of what conditions it is testing. - cache_sync_defaults() renamed cache_sync_defaults_marked_dirty() for clarity. Added code to write the register back to its default value to check that a dirty sync doesn't write out the default value. - Added cache_sync_after_cache_only(). Tests syncing the cache without calling regcache_mark_dirty(). A register written while in cache-only should be written out by regcache_sync(). - Added cache_sync_default_after_cache_only. This is similar to cache_sync_after_cache_only(), but the register is changed to its default value while in cache-only. Because regcache_mark_dirty() was NOT called, regacache_sync() should write out the register. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 126 ++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 4 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 3201f5f6406b..1b34f92b1aaf 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -706,7 +706,7 @@ static void cache_bypass(struct kunit *test) regmap_exit(map); } =20 -static void cache_sync(struct kunit *test) +static void cache_sync_marked_dirty(struct kunit *test) { const struct regmap_test_param *param =3D test->param_value; struct regmap *map; @@ -743,7 +743,58 @@ static void cache_sync(struct kunit *test) regmap_exit(map); } =20 -static void cache_sync_defaults(struct kunit *test) +static void cache_sync_after_cache_only(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[BLOCK_TEST_SIZE]; + unsigned int val_mask; + int i; + + config =3D test_regmap_config; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + val_mask =3D GENMASK(config.val_bits - 1, 0); + get_random_bytes(&val, sizeof(val)); + + /* Put some data into the cache */ + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, + BLOCK_TEST_SIZE)); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + + /* Set cache-only and change the values */ + regcache_cache_only(map, true); + for (i =3D 0; i < ARRAY_SIZE(val); ++i) + val[i] =3D ~val[i] & val_mask; + + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, + BLOCK_TEST_SIZE)); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_FALSE(test, data->written[param->from_reg + i]); + + KUNIT_EXPECT_MEMNEQ(test, &data->vals[param->from_reg], val, sizeof(val)); + + /* Exit cache-only and sync the cache without marking hardware registers = dirty */ + regcache_cache_only(map, false); + + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + + /* Did we just write the correct data out? */ + KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val)); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + i]); + + regmap_exit(map); +} + +static void cache_sync_defaults_marked_dirty(struct kunit *test) { const struct regmap_test_param *param =3D test->param_value; struct regmap *map; @@ -775,6 +826,71 @@ static void cache_sync_defaults(struct kunit *test) for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, i =3D=3D 2, data->written[param->from_reg + i]); =20 + /* Rewrite registers back to their defaults */ + for (i =3D 0; i < config.num_reg_defaults; ++i) + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, config.reg_defaults[i].reg, + config.reg_defaults[i].def)); + + /* + * Resync after regcache_mark_dirty() should not write out registers + * that are at default value + */ + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + regcache_mark_dirty(map); + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_FALSE(test, data->written[param->from_reg + i]); + + regmap_exit(map); +} + +static void cache_sync_default_after_cache_only(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int orig_val; + int i; + + config =3D test_regmap_config; + config.num_reg_defaults =3D BLOCK_TEST_SIZE; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + 2, &orig_val)= ); + + /* Enter cache-only and change the value of one register */ + regcache_cache_only(map, true); + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, orig_val = + 1)); + + /* Exit cache-only and resync, should write out the changed register */ + regcache_cache_only(map, false); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + + /* Was the register written out? */ + KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + 2]); + KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + 2], orig_val + 1); + + /* Enter cache-only and write register back to its default value */ + regcache_cache_only(map, true); + KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, orig_val)= ); + + /* Resync should write out the new value */ + regcache_cache_only(map, false); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + data->written[param->from_reg + i] =3D false; + + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + 2]); + KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + 2], orig_val); + regmap_exit(map); } =20 @@ -1590,8 +1706,10 @@ static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(basic_ranges, regcache_types_gen_params), KUNIT_CASE_PARAM(stress_insert, regcache_types_gen_params), KUNIT_CASE_PARAM(cache_bypass, real_cache_types_gen_params), - KUNIT_CASE_PARAM(cache_sync, real_cache_types_gen_params), - KUNIT_CASE_PARAM(cache_sync_defaults, real_cache_types_gen_params), + KUNIT_CASE_PARAM(cache_sync_marked_dirty, real_cache_types_gen_params), + KUNIT_CASE_PARAM(cache_sync_after_cache_only, real_cache_types_gen_params= ), + KUNIT_CASE_PARAM(cache_sync_defaults_marked_dirty, real_cache_types_gen_p= arams), + KUNIT_CASE_PARAM(cache_sync_default_after_cache_only, real_cache_types_ge= n_params), KUNIT_CASE_PARAM(cache_sync_readonly, 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), --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFDA213F421 for ; Mon, 8 Apr 2024 14:46:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; cv=none; b=PN8hr66Tk5AKGeCaxyS0ppwkeOC9PnVm/WohNWu+NsswhQmOYYuxGS23ZnoS4XQc+B2i8Tu96srbFUZtCIKyTJ2AIPKBoyKfV9VfcthgxhifK6HUMr6X6Nx54FjsxS39mk7cvnYhUD+D3hs0rslxuks3npLuaLepKmr8g3gbeXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; c=relaxed/simple; bh=tZ0ChOigTyFhTPj1fd2ZmPp9Kwbgmu3k0ib7CAj7Tp0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KXIqppREVCVUeGLzPFly3kpn+4KiatGLIBlezsEujumxRSIcEWwYqiHuOsEj3wX8J+9Wt3bShSKHJ+QJo933nOuNAaRC1D80tk5hwNyhTvfKrU5Z9SDAlBR2U2X5JbOxa48NcBxQfEDMaCbnbqdWJKN2t6DBaspL5jPCew0pBkQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=QxOxCU5m; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="QxOxCU5m" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL5032409; Mon, 8 Apr 2024 09:46:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=d7MUA8YSpTzS81JUQMKOMK4CDGrnk/tQ/v/lenBUBCk=; b= QxOxCU5mXQ/Sr4NSFx4rZK9ktRtixHbupWGVfGRlxje6WEXQDAYjtmLEzWdn3sXP Hiv2D8/b25Dw9wnvnLoYOWi3HvRDaYzQy5X1+4acT+Xc+ApwIQWv8gLSlY5ZGeEN Q4a85Z288jWGPdetZVGaKpNkPFwLZI0lEZWd4O09lUqWjdnEs/2abnFqH6gjgUPP C+4G3NKskVf92EtHB6J2bp1loVo8vH3vhl5zm1QbLTTYbxwovAiBcDfLqZASLkB+ jmXI/MAGu3Ku7XOpeoGarBHrLNUNb4KNTE4JKHHJRLgXIOVnTN6x0hYXU+Nm8ijm 3w0t8s6z/sK8ujRazr4YVg== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:07 -0500 (CDT) Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id C0575820270; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 08/11] regmap: kunit: Use a KUnit action to call regmap_exit() Date: Mon, 8 Apr 2024 15:45:57 +0100 Message-ID: <20240408144600.230848-9-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: 5taDHWMjp2rNNV40v52FNkFvVmpNCBat X-Proofpoint-GUID: 5taDHWMjp2rNNV40v52FNkFvVmpNCBat X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Registert a KUnit action handler to call regmap_exit() when a test terminates. This ensures that regmap_exit() will be called if a test function returns early or aborts. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 62 ++++-------------------------- 1 file changed, 7 insertions(+), 55 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 1b34f92b1aaf..e21028cbddc3 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -5,11 +5,14 @@ // Copyright 2023 Arm Ltd =20 #include +#include #include #include "internal.h" =20 #define BLOCK_TEST_SIZE 12 =20 +KUNIT_DEFINE_ACTION_WRAPPER(regmap_exit_action, regmap_exit, struct regmap= *); + struct regmap_test_priv { struct device *dev; }; @@ -190,6 +193,8 @@ static struct regmap *gen_regmap(struct kunit *test, if (IS_ERR(ret)) { kfree(buf); kfree(*data); + } else { + kunit_add_action(test, regmap_exit_action, ret); } =20 return ret; @@ -226,8 +231,6 @@ static void basic_read_write(struct kunit *test) =20 /* If using a cache the cache satisfied the read */ KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read[= 0]); - - regmap_exit(map); } =20 static void bulk_write(struct kunit *test) @@ -261,8 +264,6 @@ static void bulk_write(struct kunit *test) /* If using a cache the cache satisfied the read */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); - - regmap_exit(map); } =20 static void bulk_read(struct kunit *test) @@ -292,8 +293,6 @@ static void bulk_read(struct kunit *test) /* If using a cache the cache satisfied the read */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); - - regmap_exit(map); } =20 static void write_readonly(struct kunit *test) @@ -325,8 +324,6 @@ static void write_readonly(struct kunit *test) /* Did that match what we see on the device? */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, i !=3D 5, data->written[i]); - - regmap_exit(map); } =20 static void read_writeonly(struct kunit *test) @@ -363,8 +360,6 @@ static void read_writeonly(struct kunit *test) =20 /* Did we trigger a hardware access? */ KUNIT_EXPECT_FALSE(test, data->read[5]); - - regmap_exit(map); } =20 static void reg_defaults(struct kunit *test) @@ -471,8 +466,6 @@ static void register_patch(struct kunit *test) break; } } - - regmap_exit(map); } =20 static void stride(struct kunit *test) @@ -512,8 +505,6 @@ static void stride(struct kunit *test) KUNIT_EXPECT_TRUE(test, data->written[i]); } } - - regmap_exit(map); } =20 static struct regmap_range_cfg test_range =3D { @@ -612,8 +603,6 @@ static void basic_ranges(struct kunit *test) KUNIT_EXPECT_FALSE(test, data->read[i]); KUNIT_EXPECT_FALSE(test, data->written[i]); } - - regmap_exit(map); } =20 /* Try to stress dynamic creation of cache data structures */ @@ -665,8 +654,6 @@ static void stress_insert(struct kunit *test) KUNIT_EXPECT_EQ(test, rval, vals[i]); KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); } - - regmap_exit(map); } =20 static void cache_bypass(struct kunit *test) @@ -702,8 +689,6 @@ static void cache_bypass(struct kunit *test) regcache_cache_bypass(map, false); KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg, &rval)); KUNIT_EXPECT_EQ(test, val, rval); - - regmap_exit(map); } =20 static void cache_sync_marked_dirty(struct kunit *test) @@ -739,8 +724,6 @@ static void cache_sync_marked_dirty(struct kunit *test) KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, true, data->written[param->from_reg + i]); - - regmap_exit(map); } =20 static void cache_sync_after_cache_only(struct kunit *test) @@ -790,8 +773,6 @@ static void cache_sync_after_cache_only(struct kunit *t= est) KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + i]); - - regmap_exit(map); } =20 static void cache_sync_defaults_marked_dirty(struct kunit *test) @@ -841,8 +822,6 @@ static void cache_sync_defaults_marked_dirty(struct kun= it *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_FALSE(test, data->written[param->from_reg + i]); - - regmap_exit(map); } =20 static void cache_sync_default_after_cache_only(struct kunit *test) @@ -890,8 +869,6 @@ static void cache_sync_default_after_cache_only(struct = kunit *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + 2]); KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + 2], orig_val); - - regmap_exit(map); } =20 static void cache_sync_readonly(struct kunit *test) @@ -930,8 +907,6 @@ static void cache_sync_readonly(struct kunit *test) /* Did that match what we see on the device? */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, i !=3D 5, data->written[param->from_reg + i]); - - regmap_exit(map); } =20 static void cache_sync_patch(struct kunit *test) @@ -990,8 +965,6 @@ static void cache_sync_patch(struct kunit *test) break; } } - - regmap_exit(map); } =20 static void cache_drop(struct kunit *test) @@ -1032,8 +1005,6 @@ static void cache_drop(struct kunit *test) for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_EXPECT_EQ(test, data->read[param->from_reg + i], i >=3D 3 && i <= =3D 5); KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); - - regmap_exit(map); } =20 static void cache_drop_all_and_sync_marked_dirty(struct kunit *test) @@ -1075,8 +1046,6 @@ static void cache_drop_all_and_sync_marked_dirty(stru= ct kunit *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); for (i =3D 0; i <=3D config.max_register; i++) KUNIT_EXPECT_FALSE(test, data->written[i]); - - regmap_exit(map); } =20 static void cache_drop_all_and_sync_no_defaults(struct kunit *test) @@ -1119,8 +1088,6 @@ static void cache_drop_all_and_sync_no_defaults(struc= t kunit *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); for (i =3D 0; i <=3D config.max_register; i++) KUNIT_EXPECT_FALSE(test, data->written[i]); - - regmap_exit(map); } =20 static void cache_drop_all_and_sync_has_defaults(struct kunit *test) @@ -1164,8 +1131,6 @@ static void cache_drop_all_and_sync_has_defaults(stru= ct kunit *test) KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); for (i =3D 0; i <=3D config.max_register; i++) KUNIT_EXPECT_FALSE(test, data->written[i]); - - regmap_exit(map); } =20 static void cache_present(struct kunit *test) @@ -1202,8 +1167,6 @@ static void cache_present(struct kunit *test) /* Now everything should be cached */ for (i =3D 0; i < BLOCK_TEST_SIZE; i++) KUNIT_ASSERT_TRUE(test, regcache_reg_cached(map, param->from_reg + i)); - - regmap_exit(map); } =20 /* Check that caching the window register works with sync */ @@ -1350,6 +1313,8 @@ static struct regmap *gen_raw_regmap(struct kunit *te= st, if (IS_ERR(ret)) { kfree(buf); kfree(*data); + } else { + kunit_add_action(test, regmap_exit_action, ret); } =20 return ret; @@ -1375,8 +1340,6 @@ static void raw_read_defaults_single(struct kunit *te= st) KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval)); KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval); } - - regmap_exit(map); } =20 static void raw_read_defaults(struct kunit *test) @@ -1414,7 +1377,6 @@ static void raw_read_defaults(struct kunit *test) } =20 kfree(rval); - regmap_exit(map); } =20 static void raw_write_read_single(struct kunit *test) @@ -1438,8 +1400,6 @@ static void raw_write_read_single(struct kunit *test) 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); } =20 static void raw_write(struct kunit *test) @@ -1489,8 +1449,6 @@ static void raw_write(struct kunit *test) =20 /* The values should appear in the "hardware" */ KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], val, sizeof(val)); - - regmap_exit(map); } =20 static bool reg_zero(struct device *dev, unsigned int reg) @@ -1548,8 +1506,6 @@ static void raw_noinc_write(struct kunit *test) /* Make sure we didn't touch the register after the noinc register */ KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 1, &val)); KUNIT_ASSERT_EQ(test, val_test, val); - - regmap_exit(map); } =20 static void raw_sync(struct kunit *test) @@ -1625,8 +1581,6 @@ static void raw_sync(struct kunit *test) =20 /* The values should now appear in the "hardware" */ KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], &val[0], sizeof(val)); - - regmap_exit(map); } =20 static void raw_ranges(struct kunit *test) @@ -1689,8 +1643,6 @@ static void raw_ranges(struct kunit *test) KUNIT_EXPECT_FALSE(test, data->read[i]); KUNIT_EXPECT_FALSE(test, data->written[i]); } - - regmap_exit(map); } =20 static struct kunit_case regmap_test_cases[] =3D { --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CF4C13F00F for ; Mon, 8 Apr 2024 14:46:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587571; cv=none; b=eLE2G8fRFS3LTR+FAncQSTfetr9oQQtofcNoZ/ixyC7trcA3swi+zyWAXzqw+tBj1iVhX+cXmlwMt+Yy9wm8AXu9Xn2WJ1Y22+hUpgzsQMkoo8nKJu8ucdRT5b2yHhgBrNVcj8wpj0Hf1NNb4Gy/BQCxzX0LqySj22UYlvyRXGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587571; c=relaxed/simple; bh=sTfmfVPhpMGuDAHbqYsRP7cnCg3e51KBYNhc//xaRAo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Hq/HI5U9dS/jn2vWvpIHzQe+nZ6hJOvq3Qy7lx0NRqosuVAsYJsMNQ/u97oEAWkAfyl7Bh0EnvY3zdSJwbwXQLhOmhmY5x0m2lfEBhTzjAycmFRAVLH6ASfwx9L1YqvixmvBeasB/SCWiV4/fd1J7dsryepFqv0EomACfwoOUAg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=pYzDZLZk; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="pYzDZLZk" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL4032409; Mon, 8 Apr 2024 09:46:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=QPpgOfGYK0iVtyw0IHD3gINHQz41xmuzbxAEiOBp3XY=; b= pYzDZLZk4vLj1y5YGg3wyvboG7NYRupMmFFTNPYplrh/qp1cBOOh6CfVrMTcH3gu FPZz9OT3leKJyzCzeyUCoUopdOPIzxftIdvM/J1QYLoZHMB/EhTI/ED7rqefqTzB 9INbHIm5+zv3gkwSj2DsCfgMRajyS8D81wH1wHzOKavlTzi6bAgBVGe03ur8MoXf v6t6MRISrqdtczo1MntsZ2gDpSc3+wQBjizQ0gEkuZcGKhNXBWOSpp0Z+PPg+EjI gDb0nWB75nYqTkJHXMCl4oE305YIM8gkyMZqbdtevhYdxpIwThLV4GW9eLSrWkEj U4JJ4gPlTh8zmodSpsPtvQ== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:06 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id C2E3B820271; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 09/11] regmap: kunit: Replace a kmalloc/kfree() pair with KUnit-managed alloc Date: Mon, 8 Apr 2024 15:45:58 +0100 Message-ID: <20240408144600.230848-10-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: c5yPfZbTj3D8-9jqQ7an6X-z9_piVggn X-Proofpoint-GUID: c5yPfZbTj3D8-9jqQ7an6X-z9_piVggn X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Replace the kmalloc() and kfree() in raw_read_defaults() with a kunit_kmalloc() so that KUnit will free it automatically. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index e21028cbddc3..4c29d2db4d20 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -1360,7 +1360,7 @@ static void raw_read_defaults(struct kunit *test) return; =20 val_len =3D sizeof(*rval) * (config.max_register + 1); - rval =3D kmalloc(val_len, GFP_KERNEL); + rval =3D kunit_kmalloc(test, val_len, GFP_KERNEL); KUNIT_ASSERT_TRUE(test, rval !=3D NULL); if (!rval) return; @@ -1375,8 +1375,6 @@ static void raw_read_defaults(struct kunit *test) KUNIT_EXPECT_EQ(test, def, le16_to_cpu((__force __le16)rval[i])); } } - - kfree(rval); } =20 static void raw_write_read_single(struct kunit *test) --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0F0713F422 for ; Mon, 8 Apr 2024 14:46:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; cv=none; b=R0ZpIh0DnTK9I6yZ7VdDxDnWkwhTE3mvYBeiPGuW/ummw2xuD6S5Ojv70qwqssE3lh9j28DzMEC/OxLLKGuxY9elutuWrW00YbyL3gxv6ulZN5DbtBfoTfSYZapDH02xlaCDMb+7giVmFSECIyaOjOsTg/R6I2mhOeEMu2vqacw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587572; c=relaxed/simple; bh=eDvp6K11cMH7ZeRo86qAQ4f/YoRCcezmFzs6qkUyKl0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Uyk8inFwR19l1gB0Gc3hKCc6OnJKn4/L8EmnNLIszzz5q+z58AmtHTs3XHYvwso/VfWnBHvhRKP4D0Awkul7l2FnRhZ1lQBbvsf5hYB1bmLcChJXqMb85XNsdqDLa8EiQ8EYU/D0MVdw/U+Hto+cxfHQAXkrqGpefkXEk/VGLjg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=mUiUIxyA; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="mUiUIxyA" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385mlL6032409; Mon, 8 Apr 2024 09:46:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=IX8CS77Gqrx9rfQ9aGTQRO7O3rl9XIcbraG56WMDCrM=; b= mUiUIxyAY+hUkOPw8eozYg+3d2xpV86/pGhE+pD6tV8/9HIqa8e0HjG8yP0qLc14 /KMgaYfnjH8gYsoxXdgNA4soQJr3U0zmgUr2GGibhI1djf9TbEsv9DAXk5RYK2iw WOljqNXVCrNx58idjJJumwlW0V7952Eo1/3GtJB3//QhbshYfwjyIo8HdDM4eJc1 cs8t2FBpZlXhXjns+eLymNePNHNUFew7RsJxFupiXmbsB7uEDrmB/36xo0fLMRAW o8Aq99a3Kd/aoxJshTXtCZeU+HTdrrXKDciCZ4wlORZdk0RLtrYUgwzzERaZViwL CG3zWnikNGYSJZZkniOPpA== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp7-6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:08 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id CF389820272; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 10/11] regmap: kunit: Add cache-drop test with multiple cache blocks Date: Mon, 8 Apr 2024 15:45:59 +0100 Message-ID: <20240408144600.230848-11-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: 2OyrwQY9FVWEi1ck1gLJsdCFIygW8_GX X-Proofpoint-GUID: 2OyrwQY9FVWEi1ck1gLJsdCFIygW8_GX X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" Add a test case for dropping only some cache blocks and leaving others unchanged. The regmap is divided into 8 register ranges, and only 4 of these are written with values. This creates 4 non-contiguous ranges of registers with cached values. One whole range is then dropped, and part of another range. A cache sync is then performed to check that the correct registers were written, and the correct values were written to these registers. Signed-off-by: Richard Fitzgerald --- drivers/base/regmap/regmap-kunit.c | 103 +++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 4c29d2db4d20..6e469609c82c 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -1007,6 +1007,108 @@ static void cache_drop(struct kunit *test) KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval)= ); } =20 +static void cache_drop_with_non_contiguous_ranges(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[4][BLOCK_TEST_SIZE]; + unsigned int reg; + const int num_ranges =3D ARRAY_SIZE(val) * 2; + int rangeidx, i; + + static_assert(ARRAY_SIZE(val) =3D=3D 4); + + config =3D test_regmap_config; + config.max_register =3D param->from_reg + (num_ranges * BLOCK_TEST_SIZE); + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + for (i =3D 0; i < config.max_register + 1; i++) + data->written[i] =3D false; + + /* Create non-contiguous cache blocks by writing every other range */ + get_random_bytes(&val, sizeof(val)); + for (rangeidx =3D 0; rangeidx < num_ranges; rangeidx +=3D 2) { + reg =3D param->from_reg + (rangeidx * BLOCK_TEST_SIZE); + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, reg, + &val[rangeidx / 2], + BLOCK_TEST_SIZE)); + KUNIT_EXPECT_MEMEQ(test, &data->vals[reg], + &val[rangeidx / 2], sizeof(val[rangeidx / 2])); + } + + /* Check that odd ranges weren't written */ + for (rangeidx =3D 1; rangeidx < num_ranges; rangeidx +=3D 2) { + reg =3D param->from_reg + (rangeidx * BLOCK_TEST_SIZE); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_FALSE(test, data->written[reg + i]); + } + + /* Drop range 2 */ + reg =3D param->from_reg + (2 * BLOCK_TEST_SIZE); + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, reg, reg + BLOCK_TEST_= SIZE - 1)); + + /* Drop part of range 4 */ + reg =3D param->from_reg + (4 * BLOCK_TEST_SIZE); + KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, reg + 3, reg + 5)); + + /* Mark dirty and reset mock registers to 0 */ + regcache_mark_dirty(map); + for (i =3D 0; i < config.max_register + 1; i++) { + data->vals[i] =3D 0; + data->written[i] =3D false; + } + + /* The registers that were dropped from range 4 should now remain at 0 */ + val[4 / 2][3] =3D 0; + val[4 / 2][4] =3D 0; + val[4 / 2][5] =3D 0; + + /* Sync and check that the expected register ranges were written */ + KUNIT_EXPECT_EQ(test, 0, regcache_sync(map)); + + /* Check that odd ranges weren't written */ + for (rangeidx =3D 1; rangeidx < num_ranges; rangeidx +=3D 2) { + reg =3D param->from_reg + (rangeidx * BLOCK_TEST_SIZE); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_FALSE(test, data->written[reg + i]); + } + + /* Check that even ranges (except 2 and 4) were written */ + for (rangeidx =3D 0; rangeidx < num_ranges; rangeidx +=3D 2) { + if ((rangeidx =3D=3D 2) || (rangeidx =3D=3D 4)) + continue; + + reg =3D param->from_reg + (rangeidx * BLOCK_TEST_SIZE); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_TRUE(test, data->written[reg + i]); + + KUNIT_EXPECT_MEMEQ(test, &data->vals[reg], + &val[rangeidx / 2], sizeof(val[rangeidx / 2])); + } + + /* Check that range 2 wasn't written */ + reg =3D param->from_reg + (2 * BLOCK_TEST_SIZE); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_FALSE(test, data->written[reg + i]); + + /* Check that range 4 was partially written */ + reg =3D param->from_reg + (4 * BLOCK_TEST_SIZE); + for (i =3D 0; i < BLOCK_TEST_SIZE; i++) + KUNIT_EXPECT_EQ(test, data->written[reg + i], i < 3 || i > 5); + + KUNIT_EXPECT_MEMEQ(test, &data->vals[reg], &val[4 / 2], sizeof(val[4 / 2]= )); + + /* Nothing before param->from_reg should have been written */ + for (i =3D 0; i < param->from_reg; i++) + KUNIT_EXPECT_FALSE(test, data->written[i]); +} + static void cache_drop_all_and_sync_marked_dirty(struct kunit *test) { const struct regmap_test_param *param =3D test->param_value; @@ -1663,6 +1765,7 @@ static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(cache_sync_readonly, 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(cache_drop_with_non_contiguous_ranges, sparse_cache_type= s_gen_params), KUNIT_CASE_PARAM(cache_drop_all_and_sync_marked_dirty, sparse_cache_types= _gen_params), KUNIT_CASE_PARAM(cache_drop_all_and_sync_no_defaults, sparse_cache_types_= gen_params), KUNIT_CASE_PARAM(cache_drop_all_and_sync_has_defaults, sparse_cache_types= _gen_params), --=20 2.39.2 From nobody Sat Feb 7 16:26:22 2026 Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C58DC13F443 for ; Mon, 8 Apr 2024 14:46:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; cv=none; b=htesQEUyilAuAhDk2KYaWOH0sBmzP/3RU2APsxCX0vCEt7xPm0/l2RDq66iT1ctZcoYvqye3C9H8stdNPE5QGq94f0k0c5ZMBkp6P/kW1Ysc2+3sM4kwnlxqwi8kBrvOkCvKmqkL/bU457enznOzs0CC7nIfkzhnxMhPgbVBxPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; c=relaxed/simple; bh=1tZf6ntL+ZBT5VbnOA4amHONxR7tyFNpQjcDjtHoN3Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GRaGYDN7GHDoJXEn+hStYhOIENUuR5GAkZIjMVFPfSz7MVEortIrYEb/NddUjWSRvUHRDvU+iTugkxqw0rBxFvdu9YCckAH058WC5HQabKg7S078BjxXAkZLhjVrRWYYre4MTsnplLCjn9ScJLbTJHEEszscJM+1hiqrcha5WZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=YdAtm19b; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="YdAtm19b" Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQq026412; Mon, 8 Apr 2024 09:46:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=O5fCzEJa1jx4fBDOGZmOfideFG5tZrN1thyOmxVVxFs=; b= YdAtm19biTeZDVywcJqveGuJXhv7tTGys2ByKOCiT/vBpYM92yXnQz2de2qTJHj1 ry/8pMOX4hImFLhtSFH6t5KX9ZgdzX3BreGtvXOEyFBJcic60HcdByFw5GZ/kiCD mSlOwUDmVu6QwJmxeoyWt9vys/RDasBcrBHRjJQFUD35EQXtFH028EVHFEk5rdEC C/V+rQBP8NbCWoZvV+MsImWB3GF6dFbHbsTBJkUCH81B4qU/nx8N29QvujlqMlHa OoWuxNRQeYnrSawRMGS1wh09jCclbSs6eHgNexiU4LncQj23vZthFoC684MZ7B0D XMFe02DYq/bJnkcauRUbbg== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:07 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id DC2DC820273; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 11/11] regmap: kunit: Add test cases for regmap_read_bypassed() Date: Mon, 8 Apr 2024 15:46:00 +0100 Message-ID: <20240408144600.230848-12-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: sDJSNYLX5NYFZ7OwIQWJN-ot2LaQAd2l X-Proofpoint-GUID: sDJSNYLX5NYFZ7OwIQWJN-ot2LaQAd2l X-Proofpoint-Spam-Reason: safe Content-Type: text/plain; charset="utf-8" This adds test cases to prove that regmap_read_bypassed() reads the hardware value while the regmap is in cache-only. Signed-off-by: Richard Fitzgerald --- This depends on pending commit ("regmap: Add regmap_read_bypassed()") https://lore.kernel.org/linux-sound/20240408101803.43183-1-rf@opensource.ci= rrus.com/T/#m2b99b1e01872bfc3597e89dee57dcdd5dbaf1b55 --- drivers/base/regmap/regmap-kunit.c | 131 +++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regma= p-kunit.c index 6e469609c82c..44265dc2313d 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -295,6 +295,135 @@ static void bulk_read(struct kunit *test) KUNIT_EXPECT_EQ(test, config.cache_type =3D=3D REGCACHE_NONE, data->read= [i]); } =20 +static void read_bypassed(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[BLOCK_TEST_SIZE], rval; + int i; + + config =3D test_regmap_config; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + + get_random_bytes(&val, sizeof(val)); + + /* Write some test values */ + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARR= AY_SIZE(val))); + + regcache_cache_only(map, true); + + /* + * While in cache-only regmap_read_bypassed() should return the register + * value and leave the map in cache-only. + */ + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + /* Put inverted bits in rval to prove we really read the value */ + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, = &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } + + /* + * Change the underlying register values to prove it is returning + * real values not cached values. + */ + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + val[i] =3D ~val[i]; + data->vals[param->from_reg + i] =3D val[i]; + } + + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_NE(test, val[i], rval); + + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, = &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } +} + +static void read_bypassed_volatile(struct kunit *test) +{ + const struct regmap_test_param *param =3D test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[BLOCK_TEST_SIZE], rval; + int i; + + config =3D test_regmap_config; + /* All registers except #5 volatile */ + config.volatile_reg =3D reg_5_false; + + map =3D gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + + get_random_bytes(&val, sizeof(val)); + + /* Write some test values */ + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARR= AY_SIZE(val))); + + regcache_cache_only(map, true); + + /* + * While in cache-only regmap_read_bypassed() should return the register + * value and leave the map in cache-only. + */ + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + /* Register #5 is non-volatile so should read from cache */ + KUNIT_EXPECT_EQ(test, (i =3D=3D 5) ? 0 : -EBUSY, + regmap_read(map, param->from_reg + i, &rval)); + + /* Put inverted bits in rval to prove we really read the value */ + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, = &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } + + /* + * Change the underlying register values to prove it is returning + * real values not cached values. + */ + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + val[i] =3D ~val[i]; + data->vals[param->from_reg + i] =3D val[i]; + } + + for (i =3D 0; i < ARRAY_SIZE(val); i++) { + if (i =3D=3D 5) + continue; + + rval =3D ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, = &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } +} + static void write_readonly(struct kunit *test) { struct regmap *map; @@ -1747,6 +1876,8 @@ static void raw_ranges(struct kunit *test) =20 static struct kunit_case regmap_test_cases[] =3D { KUNIT_CASE_PARAM(basic_read_write, regcache_types_gen_params), + KUNIT_CASE_PARAM(read_bypassed, real_cache_types_gen_params), + KUNIT_CASE_PARAM(read_bypassed_volatile, real_cache_types_gen_params), KUNIT_CASE_PARAM(bulk_write, regcache_types_gen_params), KUNIT_CASE_PARAM(bulk_read, regcache_types_gen_params), KUNIT_CASE_PARAM(write_readonly, regcache_types_gen_params), --=20 2.39.2