From nobody Sat Feb 7 17:41:04 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