regmap-kunit.c 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // regmap KUnit tests
  4. //
  5. // Copyright 2023 Arm Ltd
  6. #include <kunit/device.h>
  7. #include <kunit/resource.h>
  8. #include <kunit/test.h>
  9. #include "internal.h"
  10. #define BLOCK_TEST_SIZE 12
  11. KUNIT_DEFINE_ACTION_WRAPPER(regmap_exit_action, regmap_exit, struct regmap *);
  12. struct regmap_test_priv {
  13. struct device *dev;
  14. };
  15. struct regmap_test_param {
  16. enum regcache_type cache;
  17. enum regmap_endian val_endian;
  18. unsigned int from_reg;
  19. bool fast_io;
  20. };
  21. static void get_changed_bytes(void *orig, void *new, size_t size)
  22. {
  23. char *o = orig;
  24. char *n = new;
  25. int i;
  26. get_random_bytes(new, size);
  27. /*
  28. * This could be nicer and more efficient but we shouldn't
  29. * super care.
  30. */
  31. for (i = 0; i < size; i++)
  32. while (n[i] == o[i])
  33. get_random_bytes(&n[i], 1);
  34. }
  35. static const struct regmap_config test_regmap_config = {
  36. .reg_stride = 1,
  37. .val_bits = sizeof(unsigned int) * 8,
  38. };
  39. static const char *regcache_type_name(enum regcache_type type)
  40. {
  41. switch (type) {
  42. case REGCACHE_NONE:
  43. return "none";
  44. case REGCACHE_FLAT:
  45. return "flat";
  46. case REGCACHE_RBTREE:
  47. return "rbtree";
  48. case REGCACHE_MAPLE:
  49. return "maple";
  50. default:
  51. return NULL;
  52. }
  53. }
  54. static const char *regmap_endian_name(enum regmap_endian endian)
  55. {
  56. switch (endian) {
  57. case REGMAP_ENDIAN_BIG:
  58. return "big";
  59. case REGMAP_ENDIAN_LITTLE:
  60. return "little";
  61. case REGMAP_ENDIAN_DEFAULT:
  62. return "default";
  63. case REGMAP_ENDIAN_NATIVE:
  64. return "native";
  65. default:
  66. return NULL;
  67. }
  68. }
  69. static void param_to_desc(const struct regmap_test_param *param, char *desc)
  70. {
  71. snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s-%s%s @%#x",
  72. regcache_type_name(param->cache),
  73. regmap_endian_name(param->val_endian),
  74. param->fast_io ? " fast I/O" : "",
  75. param->from_reg);
  76. }
  77. static const struct regmap_test_param regcache_types_list[] = {
  78. { .cache = REGCACHE_NONE },
  79. { .cache = REGCACHE_NONE, .fast_io = true },
  80. { .cache = REGCACHE_FLAT },
  81. { .cache = REGCACHE_FLAT, .fast_io = true },
  82. { .cache = REGCACHE_RBTREE },
  83. { .cache = REGCACHE_RBTREE, .fast_io = true },
  84. { .cache = REGCACHE_MAPLE },
  85. { .cache = REGCACHE_MAPLE, .fast_io = true },
  86. };
  87. KUNIT_ARRAY_PARAM(regcache_types, regcache_types_list, param_to_desc);
  88. static const struct regmap_test_param real_cache_types_only_list[] = {
  89. { .cache = REGCACHE_FLAT },
  90. { .cache = REGCACHE_FLAT, .fast_io = true },
  91. { .cache = REGCACHE_RBTREE },
  92. { .cache = REGCACHE_RBTREE, .fast_io = true },
  93. { .cache = REGCACHE_MAPLE },
  94. { .cache = REGCACHE_MAPLE, .fast_io = true },
  95. };
  96. KUNIT_ARRAY_PARAM(real_cache_types_only, real_cache_types_only_list, param_to_desc);
  97. static const struct regmap_test_param real_cache_types_list[] = {
  98. { .cache = REGCACHE_FLAT, .from_reg = 0 },
  99. { .cache = REGCACHE_FLAT, .from_reg = 0, .fast_io = true },
  100. { .cache = REGCACHE_FLAT, .from_reg = 0x2001 },
  101. { .cache = REGCACHE_FLAT, .from_reg = 0x2002 },
  102. { .cache = REGCACHE_FLAT, .from_reg = 0x2003 },
  103. { .cache = REGCACHE_FLAT, .from_reg = 0x2004 },
  104. { .cache = REGCACHE_RBTREE, .from_reg = 0 },
  105. { .cache = REGCACHE_RBTREE, .from_reg = 0, .fast_io = true },
  106. { .cache = REGCACHE_RBTREE, .from_reg = 0x2001 },
  107. { .cache = REGCACHE_RBTREE, .from_reg = 0x2002 },
  108. { .cache = REGCACHE_RBTREE, .from_reg = 0x2003 },
  109. { .cache = REGCACHE_RBTREE, .from_reg = 0x2004 },
  110. { .cache = REGCACHE_MAPLE, .from_reg = 0 },
  111. { .cache = REGCACHE_RBTREE, .from_reg = 0, .fast_io = true },
  112. { .cache = REGCACHE_MAPLE, .from_reg = 0x2001 },
  113. { .cache = REGCACHE_MAPLE, .from_reg = 0x2002 },
  114. { .cache = REGCACHE_MAPLE, .from_reg = 0x2003 },
  115. { .cache = REGCACHE_MAPLE, .from_reg = 0x2004 },
  116. };
  117. KUNIT_ARRAY_PARAM(real_cache_types, real_cache_types_list, param_to_desc);
  118. static const struct regmap_test_param sparse_cache_types_list[] = {
  119. { .cache = REGCACHE_RBTREE, .from_reg = 0 },
  120. { .cache = REGCACHE_RBTREE, .from_reg = 0, .fast_io = true },
  121. { .cache = REGCACHE_RBTREE, .from_reg = 0x2001 },
  122. { .cache = REGCACHE_RBTREE, .from_reg = 0x2002 },
  123. { .cache = REGCACHE_RBTREE, .from_reg = 0x2003 },
  124. { .cache = REGCACHE_RBTREE, .from_reg = 0x2004 },
  125. { .cache = REGCACHE_MAPLE, .from_reg = 0 },
  126. { .cache = REGCACHE_MAPLE, .from_reg = 0, .fast_io = true },
  127. { .cache = REGCACHE_MAPLE, .from_reg = 0x2001 },
  128. { .cache = REGCACHE_MAPLE, .from_reg = 0x2002 },
  129. { .cache = REGCACHE_MAPLE, .from_reg = 0x2003 },
  130. { .cache = REGCACHE_MAPLE, .from_reg = 0x2004 },
  131. };
  132. KUNIT_ARRAY_PARAM(sparse_cache_types, sparse_cache_types_list, param_to_desc);
  133. static struct regmap *gen_regmap(struct kunit *test,
  134. struct regmap_config *config,
  135. struct regmap_ram_data **data)
  136. {
  137. const struct regmap_test_param *param = test->param_value;
  138. struct regmap_test_priv *priv = test->priv;
  139. unsigned int *buf;
  140. struct regmap *ret = ERR_PTR(-ENOMEM);
  141. size_t size;
  142. int i, error;
  143. struct reg_default *defaults;
  144. config->cache_type = param->cache;
  145. config->fast_io = param->fast_io;
  146. if (config->max_register == 0) {
  147. config->max_register = param->from_reg;
  148. if (config->num_reg_defaults)
  149. config->max_register += (config->num_reg_defaults - 1) *
  150. config->reg_stride;
  151. else
  152. config->max_register += (BLOCK_TEST_SIZE * config->reg_stride);
  153. }
  154. size = array_size(config->max_register + 1, sizeof(*buf));
  155. buf = kmalloc(size, GFP_KERNEL);
  156. if (!buf)
  157. return ERR_PTR(-ENOMEM);
  158. get_random_bytes(buf, size);
  159. *data = kzalloc(sizeof(**data), GFP_KERNEL);
  160. if (!(*data))
  161. goto out_free;
  162. (*data)->vals = buf;
  163. if (config->num_reg_defaults) {
  164. defaults = kunit_kcalloc(test,
  165. config->num_reg_defaults,
  166. sizeof(struct reg_default),
  167. GFP_KERNEL);
  168. if (!defaults)
  169. goto out_free;
  170. config->reg_defaults = defaults;
  171. for (i = 0; i < config->num_reg_defaults; i++) {
  172. defaults[i].reg = param->from_reg + (i * config->reg_stride);
  173. defaults[i].def = buf[param->from_reg + (i * config->reg_stride)];
  174. }
  175. }
  176. ret = regmap_init_ram(priv->dev, config, *data);
  177. if (IS_ERR(ret))
  178. goto out_free;
  179. /* This calls regmap_exit() on failure, which frees buf and *data */
  180. error = kunit_add_action_or_reset(test, regmap_exit_action, ret);
  181. if (error)
  182. ret = ERR_PTR(error);
  183. return ret;
  184. out_free:
  185. kfree(buf);
  186. kfree(*data);
  187. return ret;
  188. }
  189. static bool reg_5_false(struct device *dev, unsigned int reg)
  190. {
  191. struct kunit *test = dev_get_drvdata(dev);
  192. const struct regmap_test_param *param = test->param_value;
  193. return reg != (param->from_reg + 5);
  194. }
  195. static void basic_read_write(struct kunit *test)
  196. {
  197. struct regmap *map;
  198. struct regmap_config config;
  199. struct regmap_ram_data *data;
  200. unsigned int val, rval;
  201. config = test_regmap_config;
  202. map = gen_regmap(test, &config, &data);
  203. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  204. if (IS_ERR(map))
  205. return;
  206. get_random_bytes(&val, sizeof(val));
  207. /* If we write a value to a register we can read it back */
  208. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 0, val));
  209. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &rval));
  210. KUNIT_EXPECT_EQ(test, val, rval);
  211. /* If using a cache the cache satisfied the read */
  212. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[0]);
  213. }
  214. static void bulk_write(struct kunit *test)
  215. {
  216. struct regmap *map;
  217. struct regmap_config config;
  218. struct regmap_ram_data *data;
  219. unsigned int val[BLOCK_TEST_SIZE], rval[BLOCK_TEST_SIZE];
  220. int i;
  221. config = test_regmap_config;
  222. map = gen_regmap(test, &config, &data);
  223. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  224. if (IS_ERR(map))
  225. return;
  226. get_random_bytes(&val, sizeof(val));
  227. /*
  228. * Data written via the bulk API can be read back with single
  229. * reads.
  230. */
  231. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, 0, val,
  232. BLOCK_TEST_SIZE));
  233. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  234. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval[i]));
  235. KUNIT_EXPECT_MEMEQ(test, val, rval, sizeof(val));
  236. /* If using a cache the cache satisfied the read */
  237. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  238. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  239. }
  240. static void bulk_read(struct kunit *test)
  241. {
  242. struct regmap *map;
  243. struct regmap_config config;
  244. struct regmap_ram_data *data;
  245. unsigned int val[BLOCK_TEST_SIZE], rval[BLOCK_TEST_SIZE];
  246. int i;
  247. config = test_regmap_config;
  248. map = gen_regmap(test, &config, &data);
  249. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  250. if (IS_ERR(map))
  251. return;
  252. get_random_bytes(&val, sizeof(val));
  253. /* Data written as single writes can be read via the bulk API */
  254. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  255. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, val[i]));
  256. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval,
  257. BLOCK_TEST_SIZE));
  258. KUNIT_EXPECT_MEMEQ(test, val, rval, sizeof(val));
  259. /* If using a cache the cache satisfied the read */
  260. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  261. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  262. }
  263. static void multi_write(struct kunit *test)
  264. {
  265. struct regmap *map;
  266. struct regmap_config config;
  267. struct regmap_ram_data *data;
  268. struct reg_sequence sequence[BLOCK_TEST_SIZE];
  269. unsigned int val[BLOCK_TEST_SIZE], rval[BLOCK_TEST_SIZE];
  270. int i;
  271. config = test_regmap_config;
  272. map = gen_regmap(test, &config, &data);
  273. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  274. if (IS_ERR(map))
  275. return;
  276. get_random_bytes(&val, sizeof(val));
  277. /*
  278. * Data written via the multi API can be read back with single
  279. * reads.
  280. */
  281. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  282. sequence[i].reg = i;
  283. sequence[i].def = val[i];
  284. sequence[i].delay_us = 0;
  285. }
  286. KUNIT_EXPECT_EQ(test, 0,
  287. regmap_multi_reg_write(map, sequence, BLOCK_TEST_SIZE));
  288. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  289. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval[i]));
  290. KUNIT_EXPECT_MEMEQ(test, val, rval, sizeof(val));
  291. /* If using a cache the cache satisfied the read */
  292. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  293. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  294. }
  295. static void multi_read(struct kunit *test)
  296. {
  297. struct regmap *map;
  298. struct regmap_config config;
  299. struct regmap_ram_data *data;
  300. unsigned int regs[BLOCK_TEST_SIZE];
  301. unsigned int val[BLOCK_TEST_SIZE], rval[BLOCK_TEST_SIZE];
  302. int i;
  303. config = test_regmap_config;
  304. map = gen_regmap(test, &config, &data);
  305. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  306. if (IS_ERR(map))
  307. return;
  308. get_random_bytes(&val, sizeof(val));
  309. /* Data written as single writes can be read via the multi API */
  310. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  311. regs[i] = i;
  312. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, val[i]));
  313. }
  314. KUNIT_EXPECT_EQ(test, 0,
  315. regmap_multi_reg_read(map, regs, rval, BLOCK_TEST_SIZE));
  316. KUNIT_EXPECT_MEMEQ(test, val, rval, sizeof(val));
  317. /* If using a cache the cache satisfied the read */
  318. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  319. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  320. }
  321. static void read_bypassed(struct kunit *test)
  322. {
  323. const struct regmap_test_param *param = test->param_value;
  324. struct regmap *map;
  325. struct regmap_config config;
  326. struct regmap_ram_data *data;
  327. unsigned int val[BLOCK_TEST_SIZE], rval;
  328. int i;
  329. config = test_regmap_config;
  330. map = gen_regmap(test, &config, &data);
  331. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  332. if (IS_ERR(map))
  333. return;
  334. KUNIT_EXPECT_FALSE(test, map->cache_bypass);
  335. get_random_bytes(&val, sizeof(val));
  336. /* Write some test values */
  337. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARRAY_SIZE(val)));
  338. regcache_cache_only(map, true);
  339. /*
  340. * While in cache-only regmap_read_bypassed() should return the register
  341. * value and leave the map in cache-only.
  342. */
  343. for (i = 0; i < ARRAY_SIZE(val); i++) {
  344. /* Put inverted bits in rval to prove we really read the value */
  345. rval = ~val[i];
  346. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval));
  347. KUNIT_EXPECT_EQ(test, val[i], rval);
  348. rval = ~val[i];
  349. KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval));
  350. KUNIT_EXPECT_EQ(test, val[i], rval);
  351. KUNIT_EXPECT_TRUE(test, map->cache_only);
  352. KUNIT_EXPECT_FALSE(test, map->cache_bypass);
  353. }
  354. /*
  355. * Change the underlying register values to prove it is returning
  356. * real values not cached values.
  357. */
  358. for (i = 0; i < ARRAY_SIZE(val); i++) {
  359. val[i] = ~val[i];
  360. data->vals[param->from_reg + i] = val[i];
  361. }
  362. for (i = 0; i < ARRAY_SIZE(val); i++) {
  363. rval = ~val[i];
  364. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval));
  365. KUNIT_EXPECT_NE(test, val[i], rval);
  366. rval = ~val[i];
  367. KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval));
  368. KUNIT_EXPECT_EQ(test, val[i], rval);
  369. KUNIT_EXPECT_TRUE(test, map->cache_only);
  370. KUNIT_EXPECT_FALSE(test, map->cache_bypass);
  371. }
  372. }
  373. static void read_bypassed_volatile(struct kunit *test)
  374. {
  375. const struct regmap_test_param *param = test->param_value;
  376. struct regmap *map;
  377. struct regmap_config config;
  378. struct regmap_ram_data *data;
  379. unsigned int val[BLOCK_TEST_SIZE], rval;
  380. int i;
  381. config = test_regmap_config;
  382. /* All registers except #5 volatile */
  383. config.volatile_reg = reg_5_false;
  384. map = gen_regmap(test, &config, &data);
  385. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  386. if (IS_ERR(map))
  387. return;
  388. KUNIT_EXPECT_FALSE(test, map->cache_bypass);
  389. get_random_bytes(&val, sizeof(val));
  390. /* Write some test values */
  391. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARRAY_SIZE(val)));
  392. regcache_cache_only(map, true);
  393. /*
  394. * While in cache-only regmap_read_bypassed() should return the register
  395. * value and leave the map in cache-only.
  396. */
  397. for (i = 0; i < ARRAY_SIZE(val); i++) {
  398. /* Register #5 is non-volatile so should read from cache */
  399. KUNIT_EXPECT_EQ(test, (i == 5) ? 0 : -EBUSY,
  400. regmap_read(map, param->from_reg + i, &rval));
  401. /* Put inverted bits in rval to prove we really read the value */
  402. rval = ~val[i];
  403. KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval));
  404. KUNIT_EXPECT_EQ(test, val[i], rval);
  405. KUNIT_EXPECT_TRUE(test, map->cache_only);
  406. KUNIT_EXPECT_FALSE(test, map->cache_bypass);
  407. }
  408. /*
  409. * Change the underlying register values to prove it is returning
  410. * real values not cached values.
  411. */
  412. for (i = 0; i < ARRAY_SIZE(val); i++) {
  413. val[i] = ~val[i];
  414. data->vals[param->from_reg + i] = val[i];
  415. }
  416. for (i = 0; i < ARRAY_SIZE(val); i++) {
  417. if (i == 5)
  418. continue;
  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. static void write_readonly(struct kunit *test)
  427. {
  428. struct regmap *map;
  429. struct regmap_config config;
  430. struct regmap_ram_data *data;
  431. unsigned int val;
  432. int i;
  433. config = test_regmap_config;
  434. config.num_reg_defaults = BLOCK_TEST_SIZE;
  435. config.writeable_reg = reg_5_false;
  436. map = gen_regmap(test, &config, &data);
  437. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  438. if (IS_ERR(map))
  439. return;
  440. get_random_bytes(&val, sizeof(val));
  441. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  442. data->written[i] = false;
  443. /* Change the value of all registers, readonly should fail */
  444. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  445. KUNIT_EXPECT_EQ(test, i != 5, regmap_write(map, i, val) == 0);
  446. /* Did that match what we see on the device? */
  447. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  448. KUNIT_EXPECT_EQ(test, i != 5, data->written[i]);
  449. }
  450. static void read_writeonly(struct kunit *test)
  451. {
  452. struct regmap *map;
  453. struct regmap_config config;
  454. struct regmap_ram_data *data;
  455. unsigned int val;
  456. int i;
  457. config = test_regmap_config;
  458. config.readable_reg = reg_5_false;
  459. map = gen_regmap(test, &config, &data);
  460. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  461. if (IS_ERR(map))
  462. return;
  463. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  464. data->read[i] = false;
  465. /*
  466. * Try to read all the registers, the writeonly one should
  467. * fail if we aren't using the flat cache.
  468. */
  469. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  470. if (config.cache_type != REGCACHE_FLAT) {
  471. KUNIT_EXPECT_EQ(test, i != 5,
  472. regmap_read(map, i, &val) == 0);
  473. } else {
  474. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &val));
  475. }
  476. }
  477. /* Did we trigger a hardware access? */
  478. KUNIT_EXPECT_FALSE(test, data->read[5]);
  479. }
  480. static void reg_defaults(struct kunit *test)
  481. {
  482. struct regmap *map;
  483. struct regmap_config config;
  484. struct regmap_ram_data *data;
  485. unsigned int rval[BLOCK_TEST_SIZE];
  486. int i;
  487. config = test_regmap_config;
  488. config.num_reg_defaults = BLOCK_TEST_SIZE;
  489. map = gen_regmap(test, &config, &data);
  490. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  491. if (IS_ERR(map))
  492. return;
  493. /* Read back the expected default data */
  494. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval,
  495. BLOCK_TEST_SIZE));
  496. KUNIT_EXPECT_MEMEQ(test, data->vals, rval, sizeof(rval));
  497. /* The data should have been read from cache if there was one */
  498. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  499. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  500. }
  501. static void reg_defaults_read_dev(struct kunit *test)
  502. {
  503. struct regmap *map;
  504. struct regmap_config config;
  505. struct regmap_ram_data *data;
  506. unsigned int rval[BLOCK_TEST_SIZE];
  507. int i;
  508. config = test_regmap_config;
  509. config.num_reg_defaults_raw = BLOCK_TEST_SIZE;
  510. map = gen_regmap(test, &config, &data);
  511. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  512. if (IS_ERR(map))
  513. return;
  514. /* We should have read the cache defaults back from the map */
  515. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  516. KUNIT_EXPECT_EQ(test, config.cache_type != REGCACHE_NONE, data->read[i]);
  517. data->read[i] = false;
  518. }
  519. /* Read back the expected default data */
  520. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval,
  521. BLOCK_TEST_SIZE));
  522. KUNIT_EXPECT_MEMEQ(test, data->vals, rval, sizeof(rval));
  523. /* The data should have been read from cache if there was one */
  524. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  525. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  526. }
  527. static void register_patch(struct kunit *test)
  528. {
  529. struct regmap *map;
  530. struct regmap_config config;
  531. struct regmap_ram_data *data;
  532. struct reg_sequence patch[2];
  533. unsigned int rval[BLOCK_TEST_SIZE];
  534. int i;
  535. /* We need defaults so readback works */
  536. config = test_regmap_config;
  537. config.num_reg_defaults = BLOCK_TEST_SIZE;
  538. map = gen_regmap(test, &config, &data);
  539. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  540. if (IS_ERR(map))
  541. return;
  542. /* Stash the original values */
  543. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, 0, rval,
  544. BLOCK_TEST_SIZE));
  545. /* Patch a couple of values */
  546. patch[0].reg = 2;
  547. patch[0].def = rval[2] + 1;
  548. patch[0].delay_us = 0;
  549. patch[1].reg = 5;
  550. patch[1].def = rval[5] + 1;
  551. patch[1].delay_us = 0;
  552. KUNIT_EXPECT_EQ(test, 0, regmap_register_patch(map, patch,
  553. ARRAY_SIZE(patch)));
  554. /* Only the patched registers are written */
  555. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  556. switch (i) {
  557. case 2:
  558. case 5:
  559. KUNIT_EXPECT_TRUE(test, data->written[i]);
  560. KUNIT_EXPECT_EQ(test, data->vals[i], rval[i] + 1);
  561. break;
  562. default:
  563. KUNIT_EXPECT_FALSE(test, data->written[i]);
  564. KUNIT_EXPECT_EQ(test, data->vals[i], rval[i]);
  565. break;
  566. }
  567. }
  568. }
  569. static void stride(struct kunit *test)
  570. {
  571. struct regmap *map;
  572. struct regmap_config config;
  573. struct regmap_ram_data *data;
  574. unsigned int rval;
  575. int i;
  576. config = test_regmap_config;
  577. config.reg_stride = 2;
  578. config.num_reg_defaults = BLOCK_TEST_SIZE / 2;
  579. /*
  580. * Allow one extra register so that the read/written arrays
  581. * are sized big enough to include an entry for the odd
  582. * address past the final reg_default register.
  583. */
  584. config.max_register = BLOCK_TEST_SIZE;
  585. map = gen_regmap(test, &config, &data);
  586. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  587. if (IS_ERR(map))
  588. return;
  589. /* Only even addresses can be accessed, try both read and write */
  590. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  591. data->read[i] = false;
  592. data->written[i] = false;
  593. if (i % 2) {
  594. KUNIT_EXPECT_NE(test, 0, regmap_read(map, i, &rval));
  595. KUNIT_EXPECT_NE(test, 0, regmap_write(map, i, rval));
  596. KUNIT_EXPECT_FALSE(test, data->read[i]);
  597. KUNIT_EXPECT_FALSE(test, data->written[i]);
  598. } else {
  599. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval));
  600. KUNIT_EXPECT_EQ(test, data->vals[i], rval);
  601. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE,
  602. data->read[i]);
  603. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, rval));
  604. KUNIT_EXPECT_TRUE(test, data->written[i]);
  605. }
  606. }
  607. }
  608. static struct regmap_range_cfg test_range = {
  609. .selector_reg = 1,
  610. .selector_mask = 0xff,
  611. .window_start = 4,
  612. .window_len = 10,
  613. .range_min = 20,
  614. .range_max = 40,
  615. };
  616. static bool test_range_window_volatile(struct device *dev, unsigned int reg)
  617. {
  618. if (reg >= test_range.window_start &&
  619. reg <= test_range.window_start + test_range.window_len)
  620. return true;
  621. return false;
  622. }
  623. static bool test_range_all_volatile(struct device *dev, unsigned int reg)
  624. {
  625. if (test_range_window_volatile(dev, reg))
  626. return true;
  627. if (reg >= test_range.range_min && reg <= test_range.range_max)
  628. return true;
  629. return false;
  630. }
  631. static void basic_ranges(struct kunit *test)
  632. {
  633. struct regmap *map;
  634. struct regmap_config config;
  635. struct regmap_ram_data *data;
  636. unsigned int val;
  637. int i;
  638. config = test_regmap_config;
  639. config.volatile_reg = test_range_all_volatile;
  640. config.ranges = &test_range;
  641. config.num_ranges = 1;
  642. config.max_register = test_range.range_max;
  643. map = gen_regmap(test, &config, &data);
  644. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  645. if (IS_ERR(map))
  646. return;
  647. for (i = test_range.range_min; i < test_range.range_max; i++) {
  648. data->read[i] = false;
  649. data->written[i] = false;
  650. }
  651. /* Reset the page to a non-zero value to trigger a change */
  652. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.selector_reg,
  653. test_range.range_max));
  654. /* Check we set the page and use the window for writes */
  655. data->written[test_range.selector_reg] = false;
  656. data->written[test_range.window_start] = false;
  657. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.range_min, 0));
  658. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  659. KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
  660. data->written[test_range.selector_reg] = false;
  661. data->written[test_range.window_start] = false;
  662. KUNIT_EXPECT_EQ(test, 0, regmap_write(map,
  663. test_range.range_min +
  664. test_range.window_len,
  665. 0));
  666. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  667. KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
  668. /* Same for reads */
  669. data->written[test_range.selector_reg] = false;
  670. data->read[test_range.window_start] = false;
  671. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, test_range.range_min, &val));
  672. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  673. KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
  674. data->written[test_range.selector_reg] = false;
  675. data->read[test_range.window_start] = false;
  676. KUNIT_EXPECT_EQ(test, 0, regmap_read(map,
  677. test_range.range_min +
  678. test_range.window_len,
  679. &val));
  680. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  681. KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
  682. /* No physical access triggered in the virtual range */
  683. for (i = test_range.range_min; i < test_range.range_max; i++) {
  684. KUNIT_EXPECT_FALSE(test, data->read[i]);
  685. KUNIT_EXPECT_FALSE(test, data->written[i]);
  686. }
  687. }
  688. /* Try to stress dynamic creation of cache data structures */
  689. static void stress_insert(struct kunit *test)
  690. {
  691. struct regmap *map;
  692. struct regmap_config config;
  693. struct regmap_ram_data *data;
  694. unsigned int rval, *vals;
  695. size_t buf_sz;
  696. int i;
  697. config = test_regmap_config;
  698. config.max_register = 300;
  699. map = gen_regmap(test, &config, &data);
  700. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  701. if (IS_ERR(map))
  702. return;
  703. buf_sz = array_size(sizeof(*vals), config.max_register);
  704. vals = kunit_kmalloc(test, buf_sz, GFP_KERNEL);
  705. KUNIT_ASSERT_FALSE(test, vals == NULL);
  706. get_random_bytes(vals, buf_sz);
  707. /* Write data into the map/cache in ever decreasing strides */
  708. for (i = 0; i < config.max_register; i += 100)
  709. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  710. for (i = 0; i < config.max_register; i += 50)
  711. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  712. for (i = 0; i < config.max_register; i += 25)
  713. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  714. for (i = 0; i < config.max_register; i += 10)
  715. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  716. for (i = 0; i < config.max_register; i += 5)
  717. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  718. for (i = 0; i < config.max_register; i += 3)
  719. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  720. for (i = 0; i < config.max_register; i += 2)
  721. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  722. for (i = 0; i < config.max_register; i++)
  723. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, i, vals[i]));
  724. /* Do reads from the cache (if there is one) match? */
  725. for (i = 0; i < config.max_register; i ++) {
  726. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval));
  727. KUNIT_EXPECT_EQ(test, rval, vals[i]);
  728. KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
  729. }
  730. }
  731. static void cache_bypass(struct kunit *test)
  732. {
  733. const struct regmap_test_param *param = test->param_value;
  734. struct regmap *map;
  735. struct regmap_config config;
  736. struct regmap_ram_data *data;
  737. unsigned int val, rval;
  738. config = test_regmap_config;
  739. map = gen_regmap(test, &config, &data);
  740. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  741. if (IS_ERR(map))
  742. return;
  743. get_random_bytes(&val, sizeof(val));
  744. /* Ensure the cache has a value in it */
  745. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg, val));
  746. /* Bypass then write a different value */
  747. regcache_cache_bypass(map, true);
  748. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg, val + 1));
  749. /* Read the bypassed value */
  750. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg, &rval));
  751. KUNIT_EXPECT_EQ(test, val + 1, rval);
  752. KUNIT_EXPECT_EQ(test, data->vals[param->from_reg], rval);
  753. /* Disable bypass, the cache should still return the original value */
  754. regcache_cache_bypass(map, false);
  755. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg, &rval));
  756. KUNIT_EXPECT_EQ(test, val, rval);
  757. }
  758. static void cache_sync_marked_dirty(struct kunit *test)
  759. {
  760. const struct regmap_test_param *param = test->param_value;
  761. struct regmap *map;
  762. struct regmap_config config;
  763. struct regmap_ram_data *data;
  764. unsigned int val[BLOCK_TEST_SIZE];
  765. int i;
  766. config = test_regmap_config;
  767. map = gen_regmap(test, &config, &data);
  768. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  769. if (IS_ERR(map))
  770. return;
  771. get_random_bytes(&val, sizeof(val));
  772. /* Put some data into the cache */
  773. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val,
  774. BLOCK_TEST_SIZE));
  775. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  776. data->written[param->from_reg + i] = false;
  777. /* Trash the data on the device itself then resync */
  778. regcache_mark_dirty(map);
  779. memset(data->vals, 0, sizeof(val));
  780. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  781. /* Did we just write the correct data out? */
  782. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val));
  783. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  784. KUNIT_EXPECT_EQ(test, true, data->written[param->from_reg + i]);
  785. }
  786. static void cache_sync_after_cache_only(struct kunit *test)
  787. {
  788. const struct regmap_test_param *param = test->param_value;
  789. struct regmap *map;
  790. struct regmap_config config;
  791. struct regmap_ram_data *data;
  792. unsigned int val[BLOCK_TEST_SIZE];
  793. unsigned int val_mask;
  794. int i;
  795. config = test_regmap_config;
  796. map = gen_regmap(test, &config, &data);
  797. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  798. if (IS_ERR(map))
  799. return;
  800. val_mask = GENMASK(config.val_bits - 1, 0);
  801. get_random_bytes(&val, sizeof(val));
  802. /* Put some data into the cache */
  803. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val,
  804. BLOCK_TEST_SIZE));
  805. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  806. data->written[param->from_reg + i] = false;
  807. /* Set cache-only and change the values */
  808. regcache_cache_only(map, true);
  809. for (i = 0; i < ARRAY_SIZE(val); ++i)
  810. val[i] = ~val[i] & val_mask;
  811. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val,
  812. BLOCK_TEST_SIZE));
  813. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  814. KUNIT_EXPECT_FALSE(test, data->written[param->from_reg + i]);
  815. KUNIT_EXPECT_MEMNEQ(test, &data->vals[param->from_reg], val, sizeof(val));
  816. /* Exit cache-only and sync the cache without marking hardware registers dirty */
  817. regcache_cache_only(map, false);
  818. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  819. /* Did we just write the correct data out? */
  820. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], val, sizeof(val));
  821. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  822. KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + i]);
  823. }
  824. static void cache_sync_defaults_marked_dirty(struct kunit *test)
  825. {
  826. const struct regmap_test_param *param = test->param_value;
  827. struct regmap *map;
  828. struct regmap_config config;
  829. struct regmap_ram_data *data;
  830. unsigned int val;
  831. int i;
  832. config = test_regmap_config;
  833. config.num_reg_defaults = BLOCK_TEST_SIZE;
  834. map = gen_regmap(test, &config, &data);
  835. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  836. if (IS_ERR(map))
  837. return;
  838. get_random_bytes(&val, sizeof(val));
  839. /* Change the value of one register */
  840. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, val));
  841. /* Resync */
  842. regcache_mark_dirty(map);
  843. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  844. data->written[param->from_reg + i] = false;
  845. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  846. /* Did we just sync the one register we touched? */
  847. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  848. KUNIT_EXPECT_EQ(test, i == 2, data->written[param->from_reg + i]);
  849. /* Rewrite registers back to their defaults */
  850. for (i = 0; i < config.num_reg_defaults; ++i)
  851. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, config.reg_defaults[i].reg,
  852. config.reg_defaults[i].def));
  853. /*
  854. * Resync after regcache_mark_dirty() should not write out registers
  855. * that are at default value
  856. */
  857. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  858. data->written[param->from_reg + i] = false;
  859. regcache_mark_dirty(map);
  860. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  861. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  862. KUNIT_EXPECT_FALSE(test, data->written[param->from_reg + i]);
  863. }
  864. static void cache_sync_default_after_cache_only(struct kunit *test)
  865. {
  866. const struct regmap_test_param *param = test->param_value;
  867. struct regmap *map;
  868. struct regmap_config config;
  869. struct regmap_ram_data *data;
  870. unsigned int orig_val;
  871. int i;
  872. config = test_regmap_config;
  873. config.num_reg_defaults = BLOCK_TEST_SIZE;
  874. map = gen_regmap(test, &config, &data);
  875. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  876. if (IS_ERR(map))
  877. return;
  878. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + 2, &orig_val));
  879. /* Enter cache-only and change the value of one register */
  880. regcache_cache_only(map, true);
  881. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, orig_val + 1));
  882. /* Exit cache-only and resync, should write out the changed register */
  883. regcache_cache_only(map, false);
  884. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  885. data->written[param->from_reg + i] = false;
  886. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  887. /* Was the register written out? */
  888. KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + 2]);
  889. KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + 2], orig_val + 1);
  890. /* Enter cache-only and write register back to its default value */
  891. regcache_cache_only(map, true);
  892. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + 2, orig_val));
  893. /* Resync should write out the new value */
  894. regcache_cache_only(map, false);
  895. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  896. data->written[param->from_reg + i] = false;
  897. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  898. KUNIT_EXPECT_TRUE(test, data->written[param->from_reg + 2]);
  899. KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + 2], orig_val);
  900. }
  901. static void cache_sync_readonly(struct kunit *test)
  902. {
  903. const struct regmap_test_param *param = test->param_value;
  904. struct regmap *map;
  905. struct regmap_config config;
  906. struct regmap_ram_data *data;
  907. unsigned int val;
  908. int i;
  909. config = test_regmap_config;
  910. config.writeable_reg = reg_5_false;
  911. map = gen_regmap(test, &config, &data);
  912. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  913. if (IS_ERR(map))
  914. return;
  915. /* Read all registers to fill the cache */
  916. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  917. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val));
  918. /* Change the value of all registers, readonly should fail */
  919. get_random_bytes(&val, sizeof(val));
  920. regcache_cache_only(map, true);
  921. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  922. KUNIT_EXPECT_EQ(test, i != 5, regmap_write(map, param->from_reg + i, val) == 0);
  923. regcache_cache_only(map, false);
  924. /* Resync */
  925. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  926. data->written[param->from_reg + i] = false;
  927. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  928. /* Did that match what we see on the device? */
  929. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  930. KUNIT_EXPECT_EQ(test, i != 5, data->written[param->from_reg + i]);
  931. }
  932. static void cache_sync_patch(struct kunit *test)
  933. {
  934. const struct regmap_test_param *param = test->param_value;
  935. struct regmap *map;
  936. struct regmap_config config;
  937. struct regmap_ram_data *data;
  938. struct reg_sequence patch[2];
  939. unsigned int rval[BLOCK_TEST_SIZE], val;
  940. int i;
  941. /* We need defaults so readback works */
  942. config = test_regmap_config;
  943. config.num_reg_defaults = BLOCK_TEST_SIZE;
  944. map = gen_regmap(test, &config, &data);
  945. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  946. if (IS_ERR(map))
  947. return;
  948. /* Stash the original values */
  949. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  950. BLOCK_TEST_SIZE));
  951. /* Patch a couple of values */
  952. patch[0].reg = param->from_reg + 2;
  953. patch[0].def = rval[2] + 1;
  954. patch[0].delay_us = 0;
  955. patch[1].reg = param->from_reg + 5;
  956. patch[1].def = rval[5] + 1;
  957. patch[1].delay_us = 0;
  958. KUNIT_EXPECT_EQ(test, 0, regmap_register_patch(map, patch,
  959. ARRAY_SIZE(patch)));
  960. /* Sync the cache */
  961. regcache_mark_dirty(map);
  962. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  963. data->written[param->from_reg + i] = false;
  964. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  965. /* The patch should be on the device but not in the cache */
  966. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  967. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val));
  968. KUNIT_EXPECT_EQ(test, val, rval[i]);
  969. switch (i) {
  970. case 2:
  971. case 5:
  972. KUNIT_EXPECT_EQ(test, true, data->written[param->from_reg + i]);
  973. KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + i], rval[i] + 1);
  974. break;
  975. default:
  976. KUNIT_EXPECT_EQ(test, false, data->written[param->from_reg + i]);
  977. KUNIT_EXPECT_EQ(test, data->vals[param->from_reg + i], rval[i]);
  978. break;
  979. }
  980. }
  981. }
  982. static void cache_drop(struct kunit *test)
  983. {
  984. const struct regmap_test_param *param = test->param_value;
  985. struct regmap *map;
  986. struct regmap_config config;
  987. struct regmap_ram_data *data;
  988. unsigned int rval[BLOCK_TEST_SIZE];
  989. int i;
  990. config = test_regmap_config;
  991. config.num_reg_defaults = BLOCK_TEST_SIZE;
  992. map = gen_regmap(test, &config, &data);
  993. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  994. if (IS_ERR(map))
  995. return;
  996. /* Ensure the data is read from the cache */
  997. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  998. data->read[param->from_reg + i] = false;
  999. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  1000. BLOCK_TEST_SIZE));
  1001. for (i = 0; i < BLOCK_TEST_SIZE; i++) {
  1002. KUNIT_EXPECT_FALSE(test, data->read[param->from_reg + i]);
  1003. data->read[param->from_reg + i] = false;
  1004. }
  1005. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval));
  1006. /* Drop some registers */
  1007. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, param->from_reg + 3,
  1008. param->from_reg + 5));
  1009. /* Reread and check only the dropped registers hit the device. */
  1010. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  1011. BLOCK_TEST_SIZE));
  1012. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1013. KUNIT_EXPECT_EQ(test, data->read[param->from_reg + i], i >= 3 && i <= 5);
  1014. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval));
  1015. }
  1016. static void cache_drop_with_non_contiguous_ranges(struct kunit *test)
  1017. {
  1018. const struct regmap_test_param *param = test->param_value;
  1019. struct regmap *map;
  1020. struct regmap_config config;
  1021. struct regmap_ram_data *data;
  1022. unsigned int val[4][BLOCK_TEST_SIZE];
  1023. unsigned int reg;
  1024. const int num_ranges = ARRAY_SIZE(val) * 2;
  1025. int rangeidx, i;
  1026. static_assert(ARRAY_SIZE(val) == 4);
  1027. config = test_regmap_config;
  1028. config.max_register = param->from_reg + (num_ranges * BLOCK_TEST_SIZE);
  1029. map = gen_regmap(test, &config, &data);
  1030. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1031. if (IS_ERR(map))
  1032. return;
  1033. for (i = 0; i < config.max_register + 1; i++)
  1034. data->written[i] = false;
  1035. /* Create non-contiguous cache blocks by writing every other range */
  1036. get_random_bytes(&val, sizeof(val));
  1037. for (rangeidx = 0; rangeidx < num_ranges; rangeidx += 2) {
  1038. reg = param->from_reg + (rangeidx * BLOCK_TEST_SIZE);
  1039. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, reg,
  1040. &val[rangeidx / 2],
  1041. BLOCK_TEST_SIZE));
  1042. KUNIT_EXPECT_MEMEQ(test, &data->vals[reg],
  1043. &val[rangeidx / 2], sizeof(val[rangeidx / 2]));
  1044. }
  1045. /* Check that odd ranges weren't written */
  1046. for (rangeidx = 1; rangeidx < num_ranges; rangeidx += 2) {
  1047. reg = param->from_reg + (rangeidx * BLOCK_TEST_SIZE);
  1048. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1049. KUNIT_EXPECT_FALSE(test, data->written[reg + i]);
  1050. }
  1051. /* Drop range 2 */
  1052. reg = param->from_reg + (2 * BLOCK_TEST_SIZE);
  1053. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, reg, reg + BLOCK_TEST_SIZE - 1));
  1054. /* Drop part of range 4 */
  1055. reg = param->from_reg + (4 * BLOCK_TEST_SIZE);
  1056. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, reg + 3, reg + 5));
  1057. /* Mark dirty and reset mock registers to 0 */
  1058. regcache_mark_dirty(map);
  1059. for (i = 0; i < config.max_register + 1; i++) {
  1060. data->vals[i] = 0;
  1061. data->written[i] = false;
  1062. }
  1063. /* The registers that were dropped from range 4 should now remain at 0 */
  1064. val[4 / 2][3] = 0;
  1065. val[4 / 2][4] = 0;
  1066. val[4 / 2][5] = 0;
  1067. /* Sync and check that the expected register ranges were written */
  1068. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  1069. /* Check that odd ranges weren't written */
  1070. for (rangeidx = 1; rangeidx < num_ranges; rangeidx += 2) {
  1071. reg = param->from_reg + (rangeidx * BLOCK_TEST_SIZE);
  1072. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1073. KUNIT_EXPECT_FALSE(test, data->written[reg + i]);
  1074. }
  1075. /* Check that even ranges (except 2 and 4) were written */
  1076. for (rangeidx = 0; rangeidx < num_ranges; rangeidx += 2) {
  1077. if ((rangeidx == 2) || (rangeidx == 4))
  1078. continue;
  1079. reg = param->from_reg + (rangeidx * BLOCK_TEST_SIZE);
  1080. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1081. KUNIT_EXPECT_TRUE(test, data->written[reg + i]);
  1082. KUNIT_EXPECT_MEMEQ(test, &data->vals[reg],
  1083. &val[rangeidx / 2], sizeof(val[rangeidx / 2]));
  1084. }
  1085. /* Check that range 2 wasn't written */
  1086. reg = param->from_reg + (2 * BLOCK_TEST_SIZE);
  1087. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1088. KUNIT_EXPECT_FALSE(test, data->written[reg + i]);
  1089. /* Check that range 4 was partially written */
  1090. reg = param->from_reg + (4 * BLOCK_TEST_SIZE);
  1091. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1092. KUNIT_EXPECT_EQ(test, data->written[reg + i], i < 3 || i > 5);
  1093. KUNIT_EXPECT_MEMEQ(test, &data->vals[reg], &val[4 / 2], sizeof(val[4 / 2]));
  1094. /* Nothing before param->from_reg should have been written */
  1095. for (i = 0; i < param->from_reg; i++)
  1096. KUNIT_EXPECT_FALSE(test, data->written[i]);
  1097. }
  1098. static void cache_drop_all_and_sync_marked_dirty(struct kunit *test)
  1099. {
  1100. const struct regmap_test_param *param = test->param_value;
  1101. struct regmap *map;
  1102. struct regmap_config config;
  1103. struct regmap_ram_data *data;
  1104. unsigned int rval[BLOCK_TEST_SIZE];
  1105. int i;
  1106. config = test_regmap_config;
  1107. config.num_reg_defaults = BLOCK_TEST_SIZE;
  1108. map = gen_regmap(test, &config, &data);
  1109. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1110. if (IS_ERR(map))
  1111. return;
  1112. /* Ensure the data is read from the cache */
  1113. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1114. data->read[param->from_reg + i] = false;
  1115. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  1116. BLOCK_TEST_SIZE));
  1117. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval));
  1118. /* Change all values in cache from defaults */
  1119. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1120. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] + 1));
  1121. /* Drop all registers */
  1122. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register));
  1123. /* Mark dirty and cache sync should not write anything. */
  1124. regcache_mark_dirty(map);
  1125. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1126. data->written[param->from_reg + i] = false;
  1127. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  1128. for (i = 0; i <= config.max_register; i++)
  1129. KUNIT_EXPECT_FALSE(test, data->written[i]);
  1130. }
  1131. static void cache_drop_all_and_sync_no_defaults(struct kunit *test)
  1132. {
  1133. const struct regmap_test_param *param = test->param_value;
  1134. struct regmap *map;
  1135. struct regmap_config config;
  1136. struct regmap_ram_data *data;
  1137. unsigned int rval[BLOCK_TEST_SIZE];
  1138. int i;
  1139. config = test_regmap_config;
  1140. map = gen_regmap(test, &config, &data);
  1141. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1142. if (IS_ERR(map))
  1143. return;
  1144. /* Ensure the data is read from the cache */
  1145. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1146. data->read[param->from_reg + i] = false;
  1147. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  1148. BLOCK_TEST_SIZE));
  1149. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval));
  1150. /* Change all values in cache */
  1151. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1152. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] + 1));
  1153. /* Drop all registers */
  1154. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register));
  1155. /*
  1156. * Sync cache without marking it dirty. All registers were dropped
  1157. * so the cache should not have any entries to write out.
  1158. */
  1159. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1160. data->written[param->from_reg + i] = false;
  1161. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  1162. for (i = 0; i <= config.max_register; i++)
  1163. KUNIT_EXPECT_FALSE(test, data->written[i]);
  1164. }
  1165. static void cache_drop_all_and_sync_has_defaults(struct kunit *test)
  1166. {
  1167. const struct regmap_test_param *param = test->param_value;
  1168. struct regmap *map;
  1169. struct regmap_config config;
  1170. struct regmap_ram_data *data;
  1171. unsigned int rval[BLOCK_TEST_SIZE];
  1172. int i;
  1173. config = test_regmap_config;
  1174. config.num_reg_defaults = BLOCK_TEST_SIZE;
  1175. map = gen_regmap(test, &config, &data);
  1176. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1177. if (IS_ERR(map))
  1178. return;
  1179. /* Ensure the data is read from the cache */
  1180. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1181. data->read[param->from_reg + i] = false;
  1182. KUNIT_EXPECT_EQ(test, 0, regmap_bulk_read(map, param->from_reg, rval,
  1183. BLOCK_TEST_SIZE));
  1184. KUNIT_EXPECT_MEMEQ(test, &data->vals[param->from_reg], rval, sizeof(rval));
  1185. /* Change all values in cache from defaults */
  1186. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1187. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, param->from_reg + i, rval[i] + 1));
  1188. /* Drop all registers */
  1189. KUNIT_EXPECT_EQ(test, 0, regcache_drop_region(map, 0, config.max_register));
  1190. /*
  1191. * Sync cache without marking it dirty. All registers were dropped
  1192. * so the cache should not have any entries to write out.
  1193. */
  1194. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1195. data->written[param->from_reg + i] = false;
  1196. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  1197. for (i = 0; i <= config.max_register; i++)
  1198. KUNIT_EXPECT_FALSE(test, data->written[i]);
  1199. }
  1200. static void cache_present(struct kunit *test)
  1201. {
  1202. const struct regmap_test_param *param = test->param_value;
  1203. struct regmap *map;
  1204. struct regmap_config config;
  1205. struct regmap_ram_data *data;
  1206. unsigned int val;
  1207. int i;
  1208. config = test_regmap_config;
  1209. map = gen_regmap(test, &config, &data);
  1210. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1211. if (IS_ERR(map))
  1212. return;
  1213. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1214. data->read[param->from_reg + i] = false;
  1215. /* No defaults so no registers cached. */
  1216. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1217. KUNIT_ASSERT_FALSE(test, regcache_reg_cached(map, param->from_reg + i));
  1218. /* We didn't trigger any reads */
  1219. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1220. KUNIT_ASSERT_FALSE(test, data->read[param->from_reg + i]);
  1221. /* Fill the cache */
  1222. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1223. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &val));
  1224. /* Now everything should be cached */
  1225. for (i = 0; i < BLOCK_TEST_SIZE; i++)
  1226. KUNIT_ASSERT_TRUE(test, regcache_reg_cached(map, param->from_reg + i));
  1227. }
  1228. /* Check that caching the window register works with sync */
  1229. static void cache_range_window_reg(struct kunit *test)
  1230. {
  1231. struct regmap *map;
  1232. struct regmap_config config;
  1233. struct regmap_ram_data *data;
  1234. unsigned int val;
  1235. int i;
  1236. config = test_regmap_config;
  1237. config.volatile_reg = test_range_window_volatile;
  1238. config.ranges = &test_range;
  1239. config.num_ranges = 1;
  1240. config.max_register = test_range.range_max;
  1241. map = gen_regmap(test, &config, &data);
  1242. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1243. if (IS_ERR(map))
  1244. return;
  1245. /* Write new values to the entire range */
  1246. for (i = test_range.range_min; i <= test_range.range_max; i++)
  1247. KUNIT_ASSERT_EQ(test, 0, regmap_write(map, i, 0));
  1248. val = data->vals[test_range.selector_reg] & test_range.selector_mask;
  1249. KUNIT_ASSERT_EQ(test, val, 2);
  1250. /* Write to the first register in the range to reset the page */
  1251. KUNIT_ASSERT_EQ(test, 0, regmap_write(map, test_range.range_min, 0));
  1252. val = data->vals[test_range.selector_reg] & test_range.selector_mask;
  1253. KUNIT_ASSERT_EQ(test, val, 0);
  1254. /* Trigger a cache sync */
  1255. regcache_mark_dirty(map);
  1256. KUNIT_ASSERT_EQ(test, 0, regcache_sync(map));
  1257. /* Write to the first register again, the page should be reset */
  1258. KUNIT_ASSERT_EQ(test, 0, regmap_write(map, test_range.range_min, 0));
  1259. val = data->vals[test_range.selector_reg] & test_range.selector_mask;
  1260. KUNIT_ASSERT_EQ(test, val, 0);
  1261. /* Trigger another cache sync */
  1262. regcache_mark_dirty(map);
  1263. KUNIT_ASSERT_EQ(test, 0, regcache_sync(map));
  1264. /* Write to the last register again, the page should be reset */
  1265. KUNIT_ASSERT_EQ(test, 0, regmap_write(map, test_range.range_max, 0));
  1266. val = data->vals[test_range.selector_reg] & test_range.selector_mask;
  1267. KUNIT_ASSERT_EQ(test, val, 2);
  1268. }
  1269. static const struct regmap_test_param raw_types_list[] = {
  1270. { .cache = REGCACHE_NONE, .val_endian = REGMAP_ENDIAN_LITTLE },
  1271. { .cache = REGCACHE_NONE, .val_endian = REGMAP_ENDIAN_BIG },
  1272. { .cache = REGCACHE_FLAT, .val_endian = REGMAP_ENDIAN_LITTLE },
  1273. { .cache = REGCACHE_FLAT, .val_endian = REGMAP_ENDIAN_BIG },
  1274. { .cache = REGCACHE_RBTREE, .val_endian = REGMAP_ENDIAN_LITTLE },
  1275. { .cache = REGCACHE_RBTREE, .val_endian = REGMAP_ENDIAN_BIG },
  1276. { .cache = REGCACHE_MAPLE, .val_endian = REGMAP_ENDIAN_LITTLE },
  1277. { .cache = REGCACHE_MAPLE, .val_endian = REGMAP_ENDIAN_BIG },
  1278. };
  1279. KUNIT_ARRAY_PARAM(raw_test_types, raw_types_list, param_to_desc);
  1280. static const struct regmap_test_param raw_cache_types_list[] = {
  1281. { .cache = REGCACHE_FLAT, .val_endian = REGMAP_ENDIAN_LITTLE },
  1282. { .cache = REGCACHE_FLAT, .val_endian = REGMAP_ENDIAN_BIG },
  1283. { .cache = REGCACHE_RBTREE, .val_endian = REGMAP_ENDIAN_LITTLE },
  1284. { .cache = REGCACHE_RBTREE, .val_endian = REGMAP_ENDIAN_BIG },
  1285. { .cache = REGCACHE_MAPLE, .val_endian = REGMAP_ENDIAN_LITTLE },
  1286. { .cache = REGCACHE_MAPLE, .val_endian = REGMAP_ENDIAN_BIG },
  1287. };
  1288. KUNIT_ARRAY_PARAM(raw_test_cache_types, raw_cache_types_list, param_to_desc);
  1289. static const struct regmap_config raw_regmap_config = {
  1290. .max_register = BLOCK_TEST_SIZE,
  1291. .reg_format_endian = REGMAP_ENDIAN_LITTLE,
  1292. .reg_bits = 16,
  1293. .val_bits = 16,
  1294. };
  1295. static struct regmap *gen_raw_regmap(struct kunit *test,
  1296. struct regmap_config *config,
  1297. struct regmap_ram_data **data)
  1298. {
  1299. struct regmap_test_priv *priv = test->priv;
  1300. const struct regmap_test_param *param = test->param_value;
  1301. u16 *buf;
  1302. struct regmap *ret = ERR_PTR(-ENOMEM);
  1303. int i, error;
  1304. struct reg_default *defaults;
  1305. size_t size;
  1306. config->cache_type = param->cache;
  1307. config->val_format_endian = param->val_endian;
  1308. config->disable_locking = config->cache_type == REGCACHE_RBTREE ||
  1309. config->cache_type == REGCACHE_MAPLE;
  1310. size = array_size(config->max_register + 1, BITS_TO_BYTES(config->reg_bits));
  1311. buf = kmalloc(size, GFP_KERNEL);
  1312. if (!buf)
  1313. return ERR_PTR(-ENOMEM);
  1314. get_random_bytes(buf, size);
  1315. *data = kzalloc(sizeof(**data), GFP_KERNEL);
  1316. if (!(*data))
  1317. goto out_free;
  1318. (*data)->vals = (void *)buf;
  1319. config->num_reg_defaults = config->max_register + 1;
  1320. defaults = kunit_kcalloc(test,
  1321. config->num_reg_defaults,
  1322. sizeof(struct reg_default),
  1323. GFP_KERNEL);
  1324. if (!defaults)
  1325. goto out_free;
  1326. config->reg_defaults = defaults;
  1327. for (i = 0; i < config->num_reg_defaults; i++) {
  1328. defaults[i].reg = i;
  1329. switch (param->val_endian) {
  1330. case REGMAP_ENDIAN_LITTLE:
  1331. defaults[i].def = le16_to_cpu(buf[i]);
  1332. break;
  1333. case REGMAP_ENDIAN_BIG:
  1334. defaults[i].def = be16_to_cpu(buf[i]);
  1335. break;
  1336. default:
  1337. ret = ERR_PTR(-EINVAL);
  1338. goto out_free;
  1339. }
  1340. }
  1341. /*
  1342. * We use the defaults in the tests but they don't make sense
  1343. * to the core if there's no cache.
  1344. */
  1345. if (config->cache_type == REGCACHE_NONE)
  1346. config->num_reg_defaults = 0;
  1347. ret = regmap_init_raw_ram(priv->dev, config, *data);
  1348. if (IS_ERR(ret))
  1349. goto out_free;
  1350. /* This calls regmap_exit() on failure, which frees buf and *data */
  1351. error = kunit_add_action_or_reset(test, regmap_exit_action, ret);
  1352. if (error)
  1353. ret = ERR_PTR(error);
  1354. return ret;
  1355. out_free:
  1356. kfree(buf);
  1357. kfree(*data);
  1358. return ret;
  1359. }
  1360. static void raw_read_defaults_single(struct kunit *test)
  1361. {
  1362. struct regmap *map;
  1363. struct regmap_config config;
  1364. struct regmap_ram_data *data;
  1365. unsigned int rval;
  1366. int i;
  1367. config = raw_regmap_config;
  1368. map = gen_raw_regmap(test, &config, &data);
  1369. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1370. if (IS_ERR(map))
  1371. return;
  1372. /* Check that we can read the defaults via the API */
  1373. for (i = 0; i < config.max_register + 1; i++) {
  1374. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval));
  1375. KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval);
  1376. }
  1377. }
  1378. static void raw_read_defaults(struct kunit *test)
  1379. {
  1380. struct regmap *map;
  1381. struct regmap_config config;
  1382. struct regmap_ram_data *data;
  1383. u16 *rval;
  1384. u16 def;
  1385. size_t val_len;
  1386. int i;
  1387. config = raw_regmap_config;
  1388. map = gen_raw_regmap(test, &config, &data);
  1389. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1390. if (IS_ERR(map))
  1391. return;
  1392. val_len = array_size(sizeof(*rval), config.max_register + 1);
  1393. rval = kunit_kmalloc(test, val_len, GFP_KERNEL);
  1394. KUNIT_ASSERT_TRUE(test, rval != NULL);
  1395. if (!rval)
  1396. return;
  1397. /* Check that we can read the defaults via the API */
  1398. KUNIT_EXPECT_EQ(test, 0, regmap_raw_read(map, 0, rval, val_len));
  1399. for (i = 0; i < config.max_register + 1; i++) {
  1400. def = config.reg_defaults[i].def;
  1401. if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
  1402. KUNIT_EXPECT_EQ(test, def, be16_to_cpu((__force __be16)rval[i]));
  1403. } else {
  1404. KUNIT_EXPECT_EQ(test, def, le16_to_cpu((__force __le16)rval[i]));
  1405. }
  1406. }
  1407. }
  1408. static void raw_write_read_single(struct kunit *test)
  1409. {
  1410. struct regmap *map;
  1411. struct regmap_config config;
  1412. struct regmap_ram_data *data;
  1413. u16 val;
  1414. unsigned int rval;
  1415. config = raw_regmap_config;
  1416. map = gen_raw_regmap(test, &config, &data);
  1417. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1418. if (IS_ERR(map))
  1419. return;
  1420. get_random_bytes(&val, sizeof(val));
  1421. /* If we write a value to a register we can read it back */
  1422. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 0, val));
  1423. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &rval));
  1424. KUNIT_EXPECT_EQ(test, val, rval);
  1425. }
  1426. static void raw_write(struct kunit *test)
  1427. {
  1428. struct regmap *map;
  1429. struct regmap_config config;
  1430. struct regmap_ram_data *data;
  1431. u16 *hw_buf;
  1432. u16 val[2];
  1433. unsigned int rval;
  1434. int i;
  1435. config = raw_regmap_config;
  1436. map = gen_raw_regmap(test, &config, &data);
  1437. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1438. if (IS_ERR(map))
  1439. return;
  1440. hw_buf = (u16 *)data->vals;
  1441. get_random_bytes(&val, sizeof(val));
  1442. /* Do a raw write */
  1443. KUNIT_EXPECT_EQ(test, 0, regmap_raw_write(map, 2, val, sizeof(val)));
  1444. /* We should read back the new values, and defaults for the rest */
  1445. for (i = 0; i < config.max_register + 1; i++) {
  1446. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval));
  1447. switch (i) {
  1448. case 2:
  1449. case 3:
  1450. if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
  1451. KUNIT_EXPECT_EQ(test, rval,
  1452. be16_to_cpu((__force __be16)val[i % 2]));
  1453. } else {
  1454. KUNIT_EXPECT_EQ(test, rval,
  1455. le16_to_cpu((__force __le16)val[i % 2]));
  1456. }
  1457. break;
  1458. default:
  1459. KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval);
  1460. break;
  1461. }
  1462. }
  1463. /* The values should appear in the "hardware" */
  1464. KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], val, sizeof(val));
  1465. }
  1466. static bool reg_zero(struct device *dev, unsigned int reg)
  1467. {
  1468. return reg == 0;
  1469. }
  1470. static bool ram_reg_zero(struct regmap_ram_data *data, unsigned int reg)
  1471. {
  1472. return reg == 0;
  1473. }
  1474. static void raw_noinc_write(struct kunit *test)
  1475. {
  1476. struct regmap *map;
  1477. struct regmap_config config;
  1478. struct regmap_ram_data *data;
  1479. unsigned int val;
  1480. u16 val_test, val_last;
  1481. u16 val_array[BLOCK_TEST_SIZE];
  1482. config = raw_regmap_config;
  1483. config.volatile_reg = reg_zero;
  1484. config.writeable_noinc_reg = reg_zero;
  1485. config.readable_noinc_reg = reg_zero;
  1486. map = gen_raw_regmap(test, &config, &data);
  1487. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1488. if (IS_ERR(map))
  1489. return;
  1490. data->noinc_reg = ram_reg_zero;
  1491. get_random_bytes(&val_array, sizeof(val_array));
  1492. if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
  1493. val_test = be16_to_cpu(val_array[1]) + 100;
  1494. val_last = be16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
  1495. } else {
  1496. val_test = le16_to_cpu(val_array[1]) + 100;
  1497. val_last = le16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
  1498. }
  1499. /* Put some data into the register following the noinc register */
  1500. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 1, val_test));
  1501. /* Write some data to the noinc register */
  1502. KUNIT_EXPECT_EQ(test, 0, regmap_noinc_write(map, 0, val_array,
  1503. sizeof(val_array)));
  1504. /* We should read back the last value written */
  1505. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &val));
  1506. KUNIT_ASSERT_EQ(test, val_last, val);
  1507. /* Make sure we didn't touch the register after the noinc register */
  1508. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 1, &val));
  1509. KUNIT_ASSERT_EQ(test, val_test, val);
  1510. }
  1511. static void raw_sync(struct kunit *test)
  1512. {
  1513. struct regmap *map;
  1514. struct regmap_config config;
  1515. struct regmap_ram_data *data;
  1516. u16 val[3];
  1517. u16 *hw_buf;
  1518. unsigned int rval;
  1519. int i;
  1520. config = raw_regmap_config;
  1521. map = gen_raw_regmap(test, &config, &data);
  1522. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1523. if (IS_ERR(map))
  1524. return;
  1525. hw_buf = (u16 *)data->vals;
  1526. get_changed_bytes(&hw_buf[2], &val[0], sizeof(val));
  1527. /* Do a regular write and a raw write in cache only mode */
  1528. regcache_cache_only(map, true);
  1529. KUNIT_EXPECT_EQ(test, 0, regmap_raw_write(map, 2, val,
  1530. sizeof(u16) * 2));
  1531. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 4, val[2]));
  1532. /* We should read back the new values, and defaults for the rest */
  1533. for (i = 0; i < config.max_register + 1; i++) {
  1534. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, i, &rval));
  1535. switch (i) {
  1536. case 2:
  1537. case 3:
  1538. if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
  1539. KUNIT_EXPECT_EQ(test, rval,
  1540. be16_to_cpu((__force __be16)val[i - 2]));
  1541. } else {
  1542. KUNIT_EXPECT_EQ(test, rval,
  1543. le16_to_cpu((__force __le16)val[i - 2]));
  1544. }
  1545. break;
  1546. case 4:
  1547. KUNIT_EXPECT_EQ(test, rval, val[i - 2]);
  1548. break;
  1549. default:
  1550. KUNIT_EXPECT_EQ(test, config.reg_defaults[i].def, rval);
  1551. break;
  1552. }
  1553. }
  1554. /*
  1555. * The value written via _write() was translated by the core,
  1556. * translate the original copy for comparison purposes.
  1557. */
  1558. if (config.val_format_endian == REGMAP_ENDIAN_BIG)
  1559. val[2] = cpu_to_be16(val[2]);
  1560. else
  1561. val[2] = cpu_to_le16(val[2]);
  1562. /* The values should not appear in the "hardware" */
  1563. KUNIT_EXPECT_MEMNEQ(test, &hw_buf[2], &val[0], sizeof(val));
  1564. for (i = 0; i < config.max_register + 1; i++)
  1565. data->written[i] = false;
  1566. /* Do the sync */
  1567. regcache_cache_only(map, false);
  1568. regcache_mark_dirty(map);
  1569. KUNIT_EXPECT_EQ(test, 0, regcache_sync(map));
  1570. /* The values should now appear in the "hardware" */
  1571. KUNIT_EXPECT_MEMEQ(test, &hw_buf[2], &val[0], sizeof(val));
  1572. }
  1573. static void raw_ranges(struct kunit *test)
  1574. {
  1575. struct regmap *map;
  1576. struct regmap_config config;
  1577. struct regmap_ram_data *data;
  1578. unsigned int val;
  1579. int i;
  1580. config = raw_regmap_config;
  1581. config.volatile_reg = test_range_all_volatile;
  1582. config.ranges = &test_range;
  1583. config.num_ranges = 1;
  1584. config.max_register = test_range.range_max;
  1585. map = gen_raw_regmap(test, &config, &data);
  1586. KUNIT_ASSERT_FALSE(test, IS_ERR(map));
  1587. if (IS_ERR(map))
  1588. return;
  1589. /* Reset the page to a non-zero value to trigger a change */
  1590. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.selector_reg,
  1591. test_range.range_max));
  1592. /* Check we set the page and use the window for writes */
  1593. data->written[test_range.selector_reg] = false;
  1594. data->written[test_range.window_start] = false;
  1595. KUNIT_EXPECT_EQ(test, 0, regmap_write(map, test_range.range_min, 0));
  1596. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  1597. KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
  1598. data->written[test_range.selector_reg] = false;
  1599. data->written[test_range.window_start] = false;
  1600. KUNIT_EXPECT_EQ(test, 0, regmap_write(map,
  1601. test_range.range_min +
  1602. test_range.window_len,
  1603. 0));
  1604. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  1605. KUNIT_EXPECT_TRUE(test, data->written[test_range.window_start]);
  1606. /* Same for reads */
  1607. data->written[test_range.selector_reg] = false;
  1608. data->read[test_range.window_start] = false;
  1609. KUNIT_EXPECT_EQ(test, 0, regmap_read(map, test_range.range_min, &val));
  1610. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  1611. KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
  1612. data->written[test_range.selector_reg] = false;
  1613. data->read[test_range.window_start] = false;
  1614. KUNIT_EXPECT_EQ(test, 0, regmap_read(map,
  1615. test_range.range_min +
  1616. test_range.window_len,
  1617. &val));
  1618. KUNIT_EXPECT_TRUE(test, data->written[test_range.selector_reg]);
  1619. KUNIT_EXPECT_TRUE(test, data->read[test_range.window_start]);
  1620. /* No physical access triggered in the virtual range */
  1621. for (i = test_range.range_min; i < test_range.range_max; i++) {
  1622. KUNIT_EXPECT_FALSE(test, data->read[i]);
  1623. KUNIT_EXPECT_FALSE(test, data->written[i]);
  1624. }
  1625. }
  1626. static struct kunit_case regmap_test_cases[] = {
  1627. KUNIT_CASE_PARAM(basic_read_write, regcache_types_gen_params),
  1628. KUNIT_CASE_PARAM(read_bypassed, real_cache_types_gen_params),
  1629. KUNIT_CASE_PARAM(read_bypassed_volatile, real_cache_types_gen_params),
  1630. KUNIT_CASE_PARAM(bulk_write, regcache_types_gen_params),
  1631. KUNIT_CASE_PARAM(bulk_read, regcache_types_gen_params),
  1632. KUNIT_CASE_PARAM(multi_write, regcache_types_gen_params),
  1633. KUNIT_CASE_PARAM(multi_read, regcache_types_gen_params),
  1634. KUNIT_CASE_PARAM(write_readonly, regcache_types_gen_params),
  1635. KUNIT_CASE_PARAM(read_writeonly, regcache_types_gen_params),
  1636. KUNIT_CASE_PARAM(reg_defaults, regcache_types_gen_params),
  1637. KUNIT_CASE_PARAM(reg_defaults_read_dev, regcache_types_gen_params),
  1638. KUNIT_CASE_PARAM(register_patch, regcache_types_gen_params),
  1639. KUNIT_CASE_PARAM(stride, regcache_types_gen_params),
  1640. KUNIT_CASE_PARAM(basic_ranges, regcache_types_gen_params),
  1641. KUNIT_CASE_PARAM(stress_insert, regcache_types_gen_params),
  1642. KUNIT_CASE_PARAM(cache_bypass, real_cache_types_gen_params),
  1643. KUNIT_CASE_PARAM(cache_sync_marked_dirty, real_cache_types_gen_params),
  1644. KUNIT_CASE_PARAM(cache_sync_after_cache_only, real_cache_types_gen_params),
  1645. KUNIT_CASE_PARAM(cache_sync_defaults_marked_dirty, real_cache_types_gen_params),
  1646. KUNIT_CASE_PARAM(cache_sync_default_after_cache_only, real_cache_types_gen_params),
  1647. KUNIT_CASE_PARAM(cache_sync_readonly, real_cache_types_gen_params),
  1648. KUNIT_CASE_PARAM(cache_sync_patch, real_cache_types_gen_params),
  1649. KUNIT_CASE_PARAM(cache_drop, sparse_cache_types_gen_params),
  1650. KUNIT_CASE_PARAM(cache_drop_with_non_contiguous_ranges, sparse_cache_types_gen_params),
  1651. KUNIT_CASE_PARAM(cache_drop_all_and_sync_marked_dirty, sparse_cache_types_gen_params),
  1652. KUNIT_CASE_PARAM(cache_drop_all_and_sync_no_defaults, sparse_cache_types_gen_params),
  1653. KUNIT_CASE_PARAM(cache_drop_all_and_sync_has_defaults, sparse_cache_types_gen_params),
  1654. KUNIT_CASE_PARAM(cache_present, sparse_cache_types_gen_params),
  1655. KUNIT_CASE_PARAM(cache_range_window_reg, real_cache_types_only_gen_params),
  1656. KUNIT_CASE_PARAM(raw_read_defaults_single, raw_test_types_gen_params),
  1657. KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params),
  1658. KUNIT_CASE_PARAM(raw_write_read_single, raw_test_types_gen_params),
  1659. KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params),
  1660. KUNIT_CASE_PARAM(raw_noinc_write, raw_test_types_gen_params),
  1661. KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params),
  1662. KUNIT_CASE_PARAM(raw_ranges, raw_test_cache_types_gen_params),
  1663. {}
  1664. };
  1665. static int regmap_test_init(struct kunit *test)
  1666. {
  1667. struct regmap_test_priv *priv;
  1668. struct device *dev;
  1669. priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
  1670. if (!priv)
  1671. return -ENOMEM;
  1672. test->priv = priv;
  1673. dev = kunit_device_register(test, "regmap_test");
  1674. if (IS_ERR(dev))
  1675. return PTR_ERR(dev);
  1676. priv->dev = get_device(dev);
  1677. dev_set_drvdata(dev, test);
  1678. return 0;
  1679. }
  1680. static void regmap_test_exit(struct kunit *test)
  1681. {
  1682. struct regmap_test_priv *priv = test->priv;
  1683. /* Destroy the dummy struct device */
  1684. if (priv && priv->dev)
  1685. put_device(priv->dev);
  1686. }
  1687. static struct kunit_suite regmap_test_suite = {
  1688. .name = "regmap",
  1689. .init = regmap_test_init,
  1690. .exit = regmap_test_exit,
  1691. .test_cases = regmap_test_cases,
  1692. };
  1693. kunit_test_suite(regmap_test_suite);
  1694. MODULE_DESCRIPTION("Regmap KUnit tests");
  1695. MODULE_LICENSE("GPL v2");