@@ -1318,6 +1318,71 @@ static void raw_sync(struct kunit *test)
13181318 regmap_exit (map );
13191319}
13201320
1321+ static void raw_ranges (struct kunit * test )
1322+ {
1323+ struct raw_test_types * t = (struct raw_test_types * )test -> param_value ;
1324+ struct regmap * map ;
1325+ struct regmap_config config ;
1326+ struct regmap_ram_data * data ;
1327+ unsigned int val ;
1328+ int i ;
1329+
1330+ config = raw_regmap_config ;
1331+ config .volatile_reg = test_range_all_volatile ;
1332+ config .ranges = & test_range ;
1333+ config .num_ranges = 1 ;
1334+ config .max_register = test_range .range_max ;
1335+
1336+ map = gen_raw_regmap (& config , t , & data );
1337+ KUNIT_ASSERT_FALSE (test , IS_ERR (map ));
1338+ if (IS_ERR (map ))
1339+ return ;
1340+
1341+ /* Reset the page to a non-zero value to trigger a change */
1342+ KUNIT_EXPECT_EQ (test , 0 , regmap_write (map , test_range .selector_reg ,
1343+ test_range .range_max ));
1344+
1345+ /* Check we set the page and use the window for writes */
1346+ data -> written [test_range .selector_reg ] = false;
1347+ data -> written [test_range .window_start ] = false;
1348+ KUNIT_EXPECT_EQ (test , 0 , regmap_write (map , test_range .range_min , 0 ));
1349+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .selector_reg ]);
1350+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .window_start ]);
1351+
1352+ data -> written [test_range .selector_reg ] = false;
1353+ data -> written [test_range .window_start ] = false;
1354+ KUNIT_EXPECT_EQ (test , 0 , regmap_write (map ,
1355+ test_range .range_min +
1356+ test_range .window_len ,
1357+ 0 ));
1358+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .selector_reg ]);
1359+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .window_start ]);
1360+
1361+ /* Same for reads */
1362+ data -> written [test_range .selector_reg ] = false;
1363+ data -> read [test_range .window_start ] = false;
1364+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map , test_range .range_min , & val ));
1365+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .selector_reg ]);
1366+ KUNIT_EXPECT_TRUE (test , data -> read [test_range .window_start ]);
1367+
1368+ data -> written [test_range .selector_reg ] = false;
1369+ data -> read [test_range .window_start ] = false;
1370+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map ,
1371+ test_range .range_min +
1372+ test_range .window_len ,
1373+ & val ));
1374+ KUNIT_EXPECT_TRUE (test , data -> written [test_range .selector_reg ]);
1375+ KUNIT_EXPECT_TRUE (test , data -> read [test_range .window_start ]);
1376+
1377+ /* No physical access triggered in the virtual range */
1378+ for (i = test_range .range_min ; i < test_range .range_max ; i ++ ) {
1379+ KUNIT_EXPECT_FALSE (test , data -> read [i ]);
1380+ KUNIT_EXPECT_FALSE (test , data -> written [i ]);
1381+ }
1382+
1383+ regmap_exit (map );
1384+ }
1385+
13211386static struct kunit_case regmap_test_cases [] = {
13221387 KUNIT_CASE_PARAM (basic_read_write , regcache_types_gen_params ),
13231388 KUNIT_CASE_PARAM (bulk_write , regcache_types_gen_params ),
@@ -1345,6 +1410,7 @@ static struct kunit_case regmap_test_cases[] = {
13451410 KUNIT_CASE_PARAM (raw_write , raw_test_types_gen_params ),
13461411 KUNIT_CASE_PARAM (raw_noinc_write , raw_test_types_gen_params ),
13471412 KUNIT_CASE_PARAM (raw_sync , raw_test_cache_types_gen_params ),
1413+ KUNIT_CASE_PARAM (raw_ranges , raw_test_cache_types_gen_params ),
13481414 {}
13491415};
13501416
0 commit comments