Skip to content

Commit d958d97

Browse files
lopsided98broonie
authored andcommitted
regmap: kunit: add noinc write test
Add a test for writing to a noinc register, which verifies that the write does not touch adjacent registers. This test succeeds with [1] applied and fails without it. [1] 984a4af ("regmap: prevent noinc writes from clobbering cache") Signed-off-by: Ben Wolsieffer <ben.wolsieffer@hefring.com> Link: https://lore.kernel.org/r/20231102203039.3069305-2-ben.wolsieffer@hefring.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 02e3564 commit d958d97

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

drivers/base/regmap/regmap-kunit.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,65 @@ static void raw_write(struct kunit *test)
11861186
regmap_exit(map);
11871187
}
11881188

1189+
static bool reg_zero(struct device *dev, unsigned int reg)
1190+
{
1191+
return reg == 0;
1192+
}
1193+
1194+
static bool ram_reg_zero(struct regmap_ram_data *data, unsigned int reg)
1195+
{
1196+
return reg == 0;
1197+
}
1198+
1199+
static void raw_noinc_write(struct kunit *test)
1200+
{
1201+
struct raw_test_types *t = (struct raw_test_types *)test->param_value;
1202+
struct regmap *map;
1203+
struct regmap_config config;
1204+
struct regmap_ram_data *data;
1205+
unsigned int val, val_test, val_last;
1206+
u16 val_array[BLOCK_TEST_SIZE];
1207+
1208+
config = raw_regmap_config;
1209+
config.volatile_reg = reg_zero;
1210+
config.writeable_noinc_reg = reg_zero;
1211+
config.readable_noinc_reg = reg_zero;
1212+
1213+
map = gen_raw_regmap(&config, t, &data);
1214+
KUNIT_ASSERT_FALSE(test, IS_ERR(map));
1215+
if (IS_ERR(map))
1216+
return;
1217+
1218+
data->noinc_reg = ram_reg_zero;
1219+
1220+
get_random_bytes(&val_array, sizeof(val_array));
1221+
1222+
if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
1223+
val_test = be16_to_cpu(val_array[1]) + 100;
1224+
val_last = be16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
1225+
} else {
1226+
val_test = le16_to_cpu(val_array[1]) + 100;
1227+
val_last = le16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
1228+
}
1229+
1230+
/* Put some data into the register following the noinc register */
1231+
KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 1, val_test));
1232+
1233+
/* Write some data to the noinc register */
1234+
KUNIT_EXPECT_EQ(test, 0, regmap_noinc_write(map, 0, val_array,
1235+
sizeof(val_array)));
1236+
1237+
/* We should read back the last value written */
1238+
KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &val));
1239+
KUNIT_ASSERT_EQ(test, val_last, val);
1240+
1241+
/* Make sure we didn't touch the register after the noinc register */
1242+
KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 1, &val));
1243+
KUNIT_ASSERT_EQ(test, val_test, val);
1244+
1245+
regmap_exit(map);
1246+
}
1247+
11891248
static void raw_sync(struct kunit *test)
11901249
{
11911250
struct raw_test_types *t = (struct raw_test_types *)test->param_value;
@@ -1284,6 +1343,7 @@ static struct kunit_case regmap_test_cases[] = {
12841343
KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params),
12851344
KUNIT_CASE_PARAM(raw_write_read_single, raw_test_types_gen_params),
12861345
KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params),
1346+
KUNIT_CASE_PARAM(raw_noinc_write, raw_test_types_gen_params),
12871347
KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params),
12881348
{}
12891349
};

0 commit comments

Comments
 (0)