regmap: kunit: Add a test for ranges in combination with windows
authorMark Brown <broonie@kernel.org>
Sun, 25 Feb 2024 19:49:25 +0000 (19:49 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 26 Feb 2024 13:46:24 +0000 (13:46 +0000)
In preparation for taking advantage of the SPI support for pre-coooked
messages add a test case covering the use of windows on a raw regmap,
unfortunately the parameterisation prevents direct reuse and we will
want to add some raw specific coverage anyway.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://msgid.link/r/20240225-regmap-test-format-v1-1-41e4fdfb1c1f@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/regmap-kunit.c

index 026bdcb..4ef401a 100644 (file)
@@ -1318,6 +1318,71 @@ static void raw_sync(struct kunit *test)
        regmap_exit(map);
 }
 
+static void raw_ranges(struct kunit *test)
+{
+       struct raw_test_types *t = (struct raw_test_types *)test->param_value;
+       struct regmap *map;
+       struct regmap_config config;
+       struct regmap_ram_data *data;
+       unsigned int val;
+       int i;
+
+       config = raw_regmap_config;
+       config.volatile_reg = test_range_all_volatile;
+       config.ranges = &test_range;
+       config.num_ranges = 1;
+       config.max_register = test_range.range_max;
+
+       map = gen_raw_regmap(&config, t, &data);
+       KUNIT_ASSERT_FALSE(test, IS_ERR(map));
+       if (IS_ERR(map))
+               return;
+
+       /* Reset the page to a non-zero value to trigger a change */
+       KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.selector_reg,
+                                             test_range.range_max));
+
+       /* Check we set the page and use the window for writes */
+       data->written[test_range.selector_reg] = false;
+       data->written[test_range.window_start] = false;
+       KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.range_min, 0));
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
+
+       data->written[test_range.selector_reg] = false;
+       data->written[test_range.window_start] = false;
+       KUNIT_EXPECT_EQ(test, 0, regmap_write(map,
+                                             test_range.range_min +
+                                             test_range.window_len,
+                                             0));
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
+
+       /* Same for reads */
+       data->written[test_range.selector_reg] = false;
+       data->read[test_range.window_start] = false;
+       KUNIT_EXPECT_EQ(test, 0, regmap_read(map, test_range.range_min, &val));
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
+       KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
+
+       data->written[test_range.selector_reg] = false;
+       data->read[test_range.window_start] = false;
+       KUNIT_EXPECT_EQ(test, 0, regmap_read(map,
+                                            test_range.range_min +
+                                            test_range.window_len,
+                                            &val));
+       KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
+       KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
+
+       /* No physical access triggered in the virtual range */
+       for (i = test_range.range_min; i < test_range.range_max; i++) {
+               KUNIT_EXPECT_FALSE(test, data->read[i]);
+               KUNIT_EXPECT_FALSE(test, data->written[i]);
+       }
+
+       regmap_exit(map);
+}
+
 static struct kunit_case regmap_test_cases[] = {
        KUNIT_CASE_PARAM(basic_read_write, regcache_types_gen_params),
        KUNIT_CASE_PARAM(bulk_write, regcache_types_gen_params),
@@ -1345,6 +1410,7 @@ static struct kunit_case regmap_test_cases[] = {
        KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params),
        KUNIT_CASE_PARAM(raw_noinc_write, raw_test_types_gen_params),
        KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params),
+       KUNIT_CASE_PARAM(raw_ranges, raw_test_cache_types_gen_params),
        {}
 };