@@ -295,6 +295,135 @@ static void bulk_read(struct kunit *test)
295
295
KUNIT_EXPECT_EQ (test , config .cache_type == REGCACHE_NONE , data -> read [i ]);
296
296
}
297
297
298
+ static void read_bypassed (struct kunit * test )
299
+ {
300
+ const struct regmap_test_param * param = test -> param_value ;
301
+ struct regmap * map ;
302
+ struct regmap_config config ;
303
+ struct regmap_ram_data * data ;
304
+ unsigned int val [BLOCK_TEST_SIZE ], rval ;
305
+ int i ;
306
+
307
+ config = test_regmap_config ;
308
+
309
+ map = gen_regmap (test , & config , & data );
310
+ KUNIT_ASSERT_FALSE (test , IS_ERR (map ));
311
+ if (IS_ERR (map ))
312
+ return ;
313
+
314
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
315
+
316
+ get_random_bytes (& val , sizeof (val ));
317
+
318
+ /* Write some test values */
319
+ KUNIT_EXPECT_EQ (test , 0 , regmap_bulk_write (map , param -> from_reg , val , ARRAY_SIZE (val )));
320
+
321
+ regcache_cache_only (map , true);
322
+
323
+ /*
324
+ * While in cache-only regmap_read_bypassed() should return the register
325
+ * value and leave the map in cache-only.
326
+ */
327
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
328
+ /* Put inverted bits in rval to prove we really read the value */
329
+ rval = ~val [i ];
330
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map , param -> from_reg + i , & rval ));
331
+ KUNIT_EXPECT_EQ (test , val [i ], rval );
332
+
333
+ rval = ~val [i ];
334
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read_bypassed (map , param -> from_reg + i , & rval ));
335
+ KUNIT_EXPECT_EQ (test , val [i ], rval );
336
+ KUNIT_EXPECT_TRUE (test , map -> cache_only );
337
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
338
+ }
339
+
340
+ /*
341
+ * Change the underlying register values to prove it is returning
342
+ * real values not cached values.
343
+ */
344
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
345
+ val [i ] = ~val [i ];
346
+ data -> vals [param -> from_reg + i ] = val [i ];
347
+ }
348
+
349
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
350
+ rval = ~val [i ];
351
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map , param -> from_reg + i , & rval ));
352
+ KUNIT_EXPECT_NE (test , val [i ], rval );
353
+
354
+ rval = ~val [i ];
355
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read_bypassed (map , param -> from_reg + i , & rval ));
356
+ KUNIT_EXPECT_EQ (test , val [i ], rval );
357
+ KUNIT_EXPECT_TRUE (test , map -> cache_only );
358
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
359
+ }
360
+ }
361
+
362
+ static void read_bypassed_volatile (struct kunit * test )
363
+ {
364
+ const struct regmap_test_param * param = test -> param_value ;
365
+ struct regmap * map ;
366
+ struct regmap_config config ;
367
+ struct regmap_ram_data * data ;
368
+ unsigned int val [BLOCK_TEST_SIZE ], rval ;
369
+ int i ;
370
+
371
+ config = test_regmap_config ;
372
+ /* All registers except #5 volatile */
373
+ config .volatile_reg = reg_5_false ;
374
+
375
+ map = gen_regmap (test , & config , & data );
376
+ KUNIT_ASSERT_FALSE (test , IS_ERR (map ));
377
+ if (IS_ERR (map ))
378
+ return ;
379
+
380
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
381
+
382
+ get_random_bytes (& val , sizeof (val ));
383
+
384
+ /* Write some test values */
385
+ KUNIT_EXPECT_EQ (test , 0 , regmap_bulk_write (map , param -> from_reg , val , ARRAY_SIZE (val )));
386
+
387
+ regcache_cache_only (map , true);
388
+
389
+ /*
390
+ * While in cache-only regmap_read_bypassed() should return the register
391
+ * value and leave the map in cache-only.
392
+ */
393
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
394
+ /* Register #5 is non-volatile so should read from cache */
395
+ KUNIT_EXPECT_EQ (test , (i == 5 ) ? 0 : - EBUSY ,
396
+ regmap_read (map , param -> from_reg + i , & rval ));
397
+
398
+ /* Put inverted bits in rval to prove we really read the value */
399
+ rval = ~val [i ];
400
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read_bypassed (map , param -> from_reg + i , & rval ));
401
+ KUNIT_EXPECT_EQ (test , val [i ], rval );
402
+ KUNIT_EXPECT_TRUE (test , map -> cache_only );
403
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
404
+ }
405
+
406
+ /*
407
+ * Change the underlying register values to prove it is returning
408
+ * real values not cached values.
409
+ */
410
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
411
+ val [i ] = ~val [i ];
412
+ data -> vals [param -> from_reg + i ] = val [i ];
413
+ }
414
+
415
+ for (i = 0 ; i < ARRAY_SIZE (val ); i ++ ) {
416
+ if (i == 5 )
417
+ continue ;
418
+
419
+ rval = ~val [i ];
420
+ KUNIT_EXPECT_EQ (test , 0 , regmap_read_bypassed (map , param -> from_reg + i , & rval ));
421
+ KUNIT_EXPECT_EQ (test , val [i ], rval );
422
+ KUNIT_EXPECT_TRUE (test , map -> cache_only );
423
+ KUNIT_EXPECT_FALSE (test , map -> cache_bypass );
424
+ }
425
+ }
426
+
298
427
static void write_readonly (struct kunit * test )
299
428
{
300
429
struct regmap * map ;
@@ -1747,6 +1876,8 @@ static void raw_ranges(struct kunit *test)
1747
1876
1748
1877
static struct kunit_case regmap_test_cases [] = {
1749
1878
KUNIT_CASE_PARAM (basic_read_write , regcache_types_gen_params ),
1879
+ KUNIT_CASE_PARAM (read_bypassed , real_cache_types_gen_params ),
1880
+ KUNIT_CASE_PARAM (read_bypassed_volatile , real_cache_types_gen_params ),
1750
1881
KUNIT_CASE_PARAM (bulk_write , regcache_types_gen_params ),
1751
1882
KUNIT_CASE_PARAM (bulk_read , regcache_types_gen_params ),
1752
1883
KUNIT_CASE_PARAM (write_readonly , regcache_types_gen_params ),
0 commit comments