regmap-kunit.c 65 KB

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