cros_ec_proto_test.c 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Kunit tests for ChromeOS Embedded Controller protocol.
  4. */
  5. #include <kunit/test.h>
  6. #include <linux/unaligned.h>
  7. #include <linux/platform_data/cros_ec_commands.h>
  8. #include <linux/platform_data/cros_ec_proto.h>
  9. #include "cros_ec.h"
  10. #include "cros_ec_proto_test_util.h"
  11. #define BUFSIZE 512
  12. struct cros_ec_proto_test_priv {
  13. struct cros_ec_device ec_dev;
  14. u8 dout[BUFSIZE];
  15. u8 din[BUFSIZE];
  16. struct cros_ec_command *msg;
  17. u8 _msg[BUFSIZE];
  18. };
  19. static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test)
  20. {
  21. struct cros_ec_proto_test_priv *priv = test->priv;
  22. struct cros_ec_device *ec_dev = &priv->ec_dev;
  23. struct cros_ec_command *msg = priv->msg;
  24. int ret, i;
  25. u8 csum;
  26. ec_dev->proto_version = 2;
  27. msg->command = EC_CMD_HELLO;
  28. msg->outsize = EC_PROTO2_MAX_PARAM_SIZE;
  29. msg->data[0] = 0xde;
  30. msg->data[1] = 0xad;
  31. msg->data[2] = 0xbe;
  32. msg->data[3] = 0xef;
  33. ret = cros_ec_prepare_tx(ec_dev, msg);
  34. KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE);
  35. KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0);
  36. KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO);
  37. KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE);
  38. KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3);
  39. KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde);
  40. KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad);
  41. KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe);
  42. KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef);
  43. for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i)
  44. KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0);
  45. csum = EC_CMD_VERSION0;
  46. csum += EC_CMD_HELLO;
  47. csum += EC_PROTO2_MAX_PARAM_SIZE;
  48. csum += 0xde;
  49. csum += 0xad;
  50. csum += 0xbe;
  51. csum += 0xef;
  52. KUNIT_EXPECT_EQ(test,
  53. ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE],
  54. csum);
  55. }
  56. static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test)
  57. {
  58. struct cros_ec_proto_test_priv *priv = test->priv;
  59. struct cros_ec_device *ec_dev = &priv->ec_dev;
  60. struct cros_ec_command *msg = priv->msg;
  61. int ret;
  62. ec_dev->proto_version = 2;
  63. msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1;
  64. ret = cros_ec_prepare_tx(ec_dev, msg);
  65. KUNIT_EXPECT_EQ(test, ret, -EINVAL);
  66. }
  67. static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test)
  68. {
  69. struct cros_ec_proto_test_priv *priv = test->priv;
  70. struct cros_ec_device *ec_dev = &priv->ec_dev;
  71. struct cros_ec_command *msg = priv->msg;
  72. struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout;
  73. int ret, i;
  74. u8 csum;
  75. msg->command = EC_CMD_HELLO;
  76. msg->outsize = 0x88;
  77. msg->data[0] = 0xde;
  78. msg->data[1] = 0xad;
  79. msg->data[2] = 0xbe;
  80. msg->data[3] = 0xef;
  81. ret = cros_ec_prepare_tx(ec_dev, msg);
  82. KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88);
  83. KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION);
  84. KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO);
  85. KUNIT_EXPECT_EQ(test, request->command_version, 0);
  86. KUNIT_EXPECT_EQ(test, request->data_len, 0x88);
  87. KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde);
  88. KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad);
  89. KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe);
  90. KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef);
  91. for (i = 4; i < 0x88; ++i)
  92. KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0);
  93. csum = EC_HOST_REQUEST_VERSION;
  94. csum += EC_CMD_HELLO;
  95. csum += 0x88;
  96. csum += 0xde;
  97. csum += 0xad;
  98. csum += 0xbe;
  99. csum += 0xef;
  100. KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum);
  101. }
  102. static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test)
  103. {
  104. struct cros_ec_proto_test_priv *priv = test->priv;
  105. struct cros_ec_device *ec_dev = &priv->ec_dev;
  106. struct cros_ec_command *msg = priv->msg;
  107. int ret;
  108. msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1;
  109. ret = cros_ec_prepare_tx(ec_dev, msg);
  110. KUNIT_EXPECT_EQ(test, ret, -EINVAL);
  111. }
  112. static void cros_ec_proto_test_check_result(struct kunit *test)
  113. {
  114. struct cros_ec_proto_test_priv *priv = test->priv;
  115. struct cros_ec_device *ec_dev = &priv->ec_dev;
  116. struct cros_ec_command *msg = priv->msg;
  117. int ret, i;
  118. static enum ec_status status[] = {
  119. EC_RES_SUCCESS,
  120. EC_RES_INVALID_COMMAND,
  121. EC_RES_ERROR,
  122. EC_RES_INVALID_PARAM,
  123. EC_RES_ACCESS_DENIED,
  124. EC_RES_INVALID_RESPONSE,
  125. EC_RES_INVALID_VERSION,
  126. EC_RES_INVALID_CHECKSUM,
  127. EC_RES_UNAVAILABLE,
  128. EC_RES_TIMEOUT,
  129. EC_RES_OVERFLOW,
  130. EC_RES_INVALID_HEADER,
  131. EC_RES_REQUEST_TRUNCATED,
  132. EC_RES_RESPONSE_TOO_BIG,
  133. EC_RES_BUS_ERROR,
  134. EC_RES_BUSY,
  135. EC_RES_INVALID_HEADER_VERSION,
  136. EC_RES_INVALID_HEADER_CRC,
  137. EC_RES_INVALID_DATA_CRC,
  138. EC_RES_DUP_UNAVAILABLE,
  139. };
  140. for (i = 0; i < ARRAY_SIZE(status); ++i) {
  141. msg->result = status[i];
  142. ret = cros_ec_check_result(ec_dev, msg);
  143. KUNIT_EXPECT_EQ(test, ret, 0);
  144. }
  145. msg->result = EC_RES_IN_PROGRESS;
  146. ret = cros_ec_check_result(ec_dev, msg);
  147. KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
  148. }
  149. static void cros_ec_proto_test_query_all_pretest(struct kunit *test)
  150. {
  151. struct cros_ec_proto_test_priv *priv = test->priv;
  152. struct cros_ec_device *ec_dev = &priv->ec_dev;
  153. /*
  154. * cros_ec_query_all() will free din and dout and allocate them again to fit the usage by
  155. * calling devm_kfree() and devm_kzalloc(). Set them to NULL as they aren't managed by
  156. * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv
  157. * (see cros_ec_proto_test_init()).
  158. */
  159. ec_dev->din = NULL;
  160. ec_dev->dout = NULL;
  161. }
  162. static void cros_ec_proto_test_query_all_normal(struct kunit *test)
  163. {
  164. struct cros_ec_proto_test_priv *priv = test->priv;
  165. struct cros_ec_device *ec_dev = &priv->ec_dev;
  166. struct ec_xfer_mock *mock;
  167. int ret;
  168. /* For cros_ec_get_proto_info() without passthru. */
  169. {
  170. struct ec_response_get_protocol_info *data;
  171. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  172. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  173. data = (struct ec_response_get_protocol_info *)mock->o_data;
  174. data->protocol_versions = BIT(3) | BIT(2);
  175. data->max_request_packet_size = 0xbe;
  176. data->max_response_packet_size = 0xef;
  177. }
  178. /* For cros_ec_get_proto_info() with passthru. */
  179. {
  180. struct ec_response_get_protocol_info *data;
  181. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  182. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  183. data = (struct ec_response_get_protocol_info *)mock->o_data;
  184. data->max_request_packet_size = 0xbf;
  185. }
  186. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  187. {
  188. struct ec_response_get_cmd_versions *data;
  189. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  190. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  191. data = (struct ec_response_get_cmd_versions *)mock->o_data;
  192. data->version_mask = BIT(6) | BIT(5);
  193. }
  194. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  195. {
  196. struct ec_response_get_cmd_versions *data;
  197. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  198. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  199. data = (struct ec_response_get_cmd_versions *)mock->o_data;
  200. data->version_mask = BIT(1);
  201. }
  202. /* For cros_ec_get_host_event_wake_mask(). */
  203. {
  204. struct ec_response_host_event_mask *data;
  205. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  206. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  207. data = (struct ec_response_host_event_mask *)mock->o_data;
  208. data->mask = 0xbeef;
  209. }
  210. cros_ec_proto_test_query_all_pretest(test);
  211. ret = cros_ec_query_all(ec_dev);
  212. KUNIT_EXPECT_EQ(test, ret, 0);
  213. /* For cros_ec_get_proto_info() without passthru. */
  214. {
  215. mock = cros_kunit_ec_xfer_mock_next();
  216. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  217. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  218. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  219. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  220. sizeof(struct ec_response_get_protocol_info));
  221. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  222. KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_request));
  223. KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host_response));
  224. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3);
  225. KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD);
  226. KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD);
  227. }
  228. /* For cros_ec_get_proto_info() with passthru. */
  229. {
  230. mock = cros_kunit_ec_xfer_mock_next();
  231. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  232. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  233. KUNIT_EXPECT_EQ(test, mock->msg.command,
  234. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  235. EC_CMD_GET_PROTOCOL_INFO);
  236. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  237. sizeof(struct ec_response_get_protocol_info));
  238. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  239. KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request));
  240. }
  241. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  242. {
  243. struct ec_params_get_cmd_versions *data;
  244. mock = cros_kunit_ec_xfer_mock_next();
  245. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  246. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  247. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  248. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  249. sizeof(struct ec_response_get_cmd_versions));
  250. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  251. data = (struct ec_params_get_cmd_versions *)mock->i_data;
  252. KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
  253. KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7);
  254. }
  255. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  256. {
  257. struct ec_params_get_cmd_versions *data;
  258. mock = cros_kunit_ec_xfer_mock_next();
  259. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  260. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  261. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  262. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  263. sizeof(struct ec_response_get_cmd_versions));
  264. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  265. data = (struct ec_params_get_cmd_versions *)mock->i_data;
  266. KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT);
  267. KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1);
  268. }
  269. /* For cros_ec_get_host_event_wake_mask(). */
  270. {
  271. mock = cros_kunit_ec_xfer_mock_next();
  272. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  273. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  274. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
  275. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
  276. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  277. KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef);
  278. }
  279. }
  280. static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test)
  281. {
  282. struct cros_ec_proto_test_priv *priv = test->priv;
  283. struct cros_ec_device *ec_dev = &priv->ec_dev;
  284. struct ec_xfer_mock *mock;
  285. int ret;
  286. /* Set some garbage bytes. */
  287. ec_dev->max_passthru = 0xbf;
  288. /* For cros_ec_get_proto_info() without passthru. */
  289. {
  290. struct ec_response_get_protocol_info *data;
  291. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  292. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  293. /*
  294. * Although it doesn't check the value, provides valid sizes so that
  295. * cros_ec_query_all() allocates din and dout correctly.
  296. */
  297. data = (struct ec_response_get_protocol_info *)mock->o_data;
  298. data->max_request_packet_size = 0xbe;
  299. data->max_response_packet_size = 0xef;
  300. }
  301. /* For cros_ec_get_proto_info() with passthru. */
  302. {
  303. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  304. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  305. }
  306. cros_ec_proto_test_query_all_pretest(test);
  307. ret = cros_ec_query_all(ec_dev);
  308. KUNIT_EXPECT_EQ(test, ret, 0);
  309. /* For cros_ec_get_proto_info() without passthru. */
  310. {
  311. mock = cros_kunit_ec_xfer_mock_next();
  312. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  313. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  314. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  315. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  316. sizeof(struct ec_response_get_protocol_info));
  317. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  318. }
  319. /* For cros_ec_get_proto_info() with passthru. */
  320. {
  321. mock = cros_kunit_ec_xfer_mock_next();
  322. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  323. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  324. KUNIT_EXPECT_EQ(test, mock->msg.command,
  325. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  326. EC_CMD_GET_PROTOCOL_INFO);
  327. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  328. sizeof(struct ec_response_get_protocol_info));
  329. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  330. KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
  331. }
  332. }
  333. static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test)
  334. {
  335. struct cros_ec_proto_test_priv *priv = test->priv;
  336. struct cros_ec_device *ec_dev = &priv->ec_dev;
  337. struct ec_xfer_mock *mock;
  338. int ret;
  339. /* Set some garbage bytes. */
  340. ec_dev->max_passthru = 0xbf;
  341. /* For cros_ec_get_proto_info() without passthru. */
  342. {
  343. struct ec_response_get_protocol_info *data;
  344. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  345. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  346. /*
  347. * Although it doesn't check the value, provides valid sizes so that
  348. * cros_ec_query_all() allocates din and dout correctly.
  349. */
  350. data = (struct ec_response_get_protocol_info *)mock->o_data;
  351. data->max_request_packet_size = 0xbe;
  352. data->max_response_packet_size = 0xef;
  353. }
  354. /* For cros_ec_get_proto_info() with passthru. */
  355. {
  356. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  357. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  358. }
  359. cros_ec_proto_test_query_all_pretest(test);
  360. ret = cros_ec_query_all(ec_dev);
  361. KUNIT_EXPECT_EQ(test, ret, 0);
  362. /* For cros_ec_get_proto_info() without passthru. */
  363. {
  364. mock = cros_kunit_ec_xfer_mock_next();
  365. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  366. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  367. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  368. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  369. sizeof(struct ec_response_get_protocol_info));
  370. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  371. }
  372. /* For cros_ec_get_proto_info() with passthru. */
  373. {
  374. mock = cros_kunit_ec_xfer_mock_next();
  375. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  376. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  377. KUNIT_EXPECT_EQ(test, mock->msg.command,
  378. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  379. EC_CMD_GET_PROTOCOL_INFO);
  380. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  381. sizeof(struct ec_response_get_protocol_info));
  382. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  383. KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
  384. }
  385. }
  386. static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test)
  387. {
  388. struct cros_ec_proto_test_priv *priv = test->priv;
  389. struct cros_ec_device *ec_dev = &priv->ec_dev;
  390. struct ec_xfer_mock *mock;
  391. int ret;
  392. /* For cros_ec_get_proto_info() without passthru. */
  393. {
  394. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  395. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  396. }
  397. /* For cros_ec_get_proto_info_legacy(). */
  398. {
  399. struct ec_response_hello *data;
  400. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  401. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  402. data = (struct ec_response_hello *)mock->o_data;
  403. data->out_data = 0xa1b2c3d4;
  404. }
  405. cros_ec_proto_test_query_all_pretest(test);
  406. ret = cros_ec_query_all(ec_dev);
  407. KUNIT_EXPECT_EQ(test, ret, 0);
  408. /* For cros_ec_get_proto_info() without passthru. */
  409. {
  410. mock = cros_kunit_ec_xfer_mock_next();
  411. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  412. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  413. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  414. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  415. sizeof(struct ec_response_get_protocol_info));
  416. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  417. }
  418. /* For cros_ec_get_proto_info_legacy(). */
  419. {
  420. struct ec_params_hello *data;
  421. mock = cros_kunit_ec_xfer_mock_next();
  422. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  423. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  424. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  425. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  426. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  427. data = (struct ec_params_hello *)mock->i_data;
  428. KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
  429. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
  430. KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
  431. KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
  432. KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
  433. KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
  434. KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
  435. KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
  436. }
  437. }
  438. static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test)
  439. {
  440. struct cros_ec_proto_test_priv *priv = test->priv;
  441. struct cros_ec_device *ec_dev = &priv->ec_dev;
  442. struct ec_xfer_mock *mock;
  443. int ret;
  444. /* For cros_ec_get_proto_info() without passthru. */
  445. {
  446. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  447. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  448. }
  449. /* For cros_ec_get_proto_info_legacy(). */
  450. {
  451. struct ec_response_hello *data;
  452. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  453. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  454. data = (struct ec_response_hello *)mock->o_data;
  455. data->out_data = 0xa1b2c3d4;
  456. }
  457. cros_ec_proto_test_query_all_pretest(test);
  458. ret = cros_ec_query_all(ec_dev);
  459. KUNIT_EXPECT_EQ(test, ret, 0);
  460. /* For cros_ec_get_proto_info() without passthru. */
  461. {
  462. mock = cros_kunit_ec_xfer_mock_next();
  463. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  464. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  465. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  466. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  467. sizeof(struct ec_response_get_protocol_info));
  468. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  469. }
  470. /* For cros_ec_get_proto_info_legacy(). */
  471. {
  472. struct ec_params_hello *data;
  473. mock = cros_kunit_ec_xfer_mock_next();
  474. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  475. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  476. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  477. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  478. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  479. data = (struct ec_params_hello *)mock->i_data;
  480. KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
  481. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
  482. KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
  483. KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
  484. KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
  485. KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
  486. KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
  487. KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
  488. }
  489. }
  490. static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test)
  491. {
  492. struct cros_ec_proto_test_priv *priv = test->priv;
  493. struct cros_ec_device *ec_dev = &priv->ec_dev;
  494. struct ec_xfer_mock *mock;
  495. int ret;
  496. /* For cros_ec_get_proto_info() without passthru. */
  497. {
  498. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  499. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  500. }
  501. /* For cros_ec_get_proto_info_legacy(). */
  502. {
  503. mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
  504. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  505. }
  506. cros_ec_proto_test_query_all_pretest(test);
  507. ret = cros_ec_query_all(ec_dev);
  508. KUNIT_EXPECT_EQ(test, ret, -EIO);
  509. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
  510. /* For cros_ec_get_proto_info() without passthru. */
  511. {
  512. mock = cros_kunit_ec_xfer_mock_next();
  513. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  514. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  515. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  516. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  517. sizeof(struct ec_response_get_protocol_info));
  518. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  519. }
  520. /* For cros_ec_get_proto_info_legacy(). */
  521. {
  522. mock = cros_kunit_ec_xfer_mock_next();
  523. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  524. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  525. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  526. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  527. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
  528. }
  529. }
  530. static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test)
  531. {
  532. struct cros_ec_proto_test_priv *priv = test->priv;
  533. struct cros_ec_device *ec_dev = &priv->ec_dev;
  534. struct ec_xfer_mock *mock;
  535. int ret;
  536. /* For cros_ec_get_proto_info() without passthru. */
  537. {
  538. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  539. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  540. }
  541. /* For cros_ec_get_proto_info_legacy(). */
  542. {
  543. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  544. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  545. }
  546. cros_ec_proto_test_query_all_pretest(test);
  547. ret = cros_ec_query_all(ec_dev);
  548. KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP);
  549. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
  550. /* For cros_ec_get_proto_info() without passthru. */
  551. {
  552. mock = cros_kunit_ec_xfer_mock_next();
  553. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  554. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  555. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  556. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  557. sizeof(struct ec_response_get_protocol_info));
  558. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  559. }
  560. /* For cros_ec_get_proto_info_legacy(). */
  561. {
  562. mock = cros_kunit_ec_xfer_mock_next();
  563. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  564. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  565. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  566. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  567. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
  568. }
  569. }
  570. static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test)
  571. {
  572. struct cros_ec_proto_test_priv *priv = test->priv;
  573. struct cros_ec_device *ec_dev = &priv->ec_dev;
  574. struct ec_xfer_mock *mock;
  575. int ret;
  576. /* For cros_ec_get_proto_info() without passthru. */
  577. {
  578. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  579. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  580. }
  581. /* For cros_ec_get_proto_info_legacy(). */
  582. {
  583. struct ec_response_hello *data;
  584. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  585. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  586. data = (struct ec_response_hello *)mock->o_data;
  587. data->out_data = 0xbeefbfbf;
  588. }
  589. cros_ec_proto_test_query_all_pretest(test);
  590. ret = cros_ec_query_all(ec_dev);
  591. KUNIT_EXPECT_EQ(test, ret, -EBADMSG);
  592. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
  593. /* For cros_ec_get_proto_info() without passthru. */
  594. {
  595. mock = cros_kunit_ec_xfer_mock_next();
  596. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  597. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  598. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  599. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  600. sizeof(struct ec_response_get_protocol_info));
  601. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  602. }
  603. /* For cros_ec_get_proto_info_legacy(). */
  604. {
  605. mock = cros_kunit_ec_xfer_mock_next();
  606. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  607. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  608. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  609. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  610. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
  611. }
  612. }
  613. static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test)
  614. {
  615. struct cros_ec_proto_test_priv *priv = test->priv;
  616. struct cros_ec_device *ec_dev = &priv->ec_dev;
  617. struct ec_xfer_mock *mock;
  618. int ret;
  619. /* For cros_ec_get_proto_info() without passthru. */
  620. {
  621. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  622. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  623. }
  624. /* For cros_ec_get_proto_info_legacy(). */
  625. {
  626. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  627. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  628. }
  629. cros_ec_proto_test_query_all_pretest(test);
  630. ret = cros_ec_query_all(ec_dev);
  631. KUNIT_EXPECT_EQ(test, ret, -EPROTO);
  632. KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
  633. /* For cros_ec_get_proto_info() without passthru. */
  634. {
  635. mock = cros_kunit_ec_xfer_mock_next();
  636. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  637. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  638. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  639. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  640. sizeof(struct ec_response_get_protocol_info));
  641. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  642. }
  643. /* For cros_ec_get_proto_info_legacy(). */
  644. {
  645. mock = cros_kunit_ec_xfer_mock_next();
  646. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  647. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  648. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  649. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
  650. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
  651. }
  652. }
  653. static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test)
  654. {
  655. struct cros_ec_proto_test_priv *priv = test->priv;
  656. struct cros_ec_device *ec_dev = &priv->ec_dev;
  657. struct ec_xfer_mock *mock;
  658. int ret;
  659. /* Set some garbage bytes. */
  660. ec_dev->mkbp_event_supported = 0xbf;
  661. /* For cros_ec_get_proto_info() without passthru. */
  662. {
  663. struct ec_response_get_protocol_info *data;
  664. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  665. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  666. /*
  667. * Although it doesn't check the value, provides valid sizes so that
  668. * cros_ec_query_all() allocates din and dout correctly.
  669. */
  670. data = (struct ec_response_get_protocol_info *)mock->o_data;
  671. data->max_request_packet_size = 0xbe;
  672. data->max_response_packet_size = 0xef;
  673. }
  674. /* For cros_ec_get_proto_info() with passthru. */
  675. {
  676. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  677. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  678. }
  679. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  680. {
  681. struct ec_response_get_cmd_versions *data;
  682. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  683. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  684. data = (struct ec_response_get_cmd_versions *)mock->o_data;
  685. data->version_mask = 0;
  686. }
  687. cros_ec_proto_test_query_all_pretest(test);
  688. ret = cros_ec_query_all(ec_dev);
  689. KUNIT_EXPECT_EQ(test, ret, 0);
  690. /* For cros_ec_get_proto_info() without passthru. */
  691. {
  692. mock = cros_kunit_ec_xfer_mock_next();
  693. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  694. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  695. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  696. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  697. sizeof(struct ec_response_get_protocol_info));
  698. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  699. }
  700. /* For cros_ec_get_proto_info() with passthru. */
  701. {
  702. mock = cros_kunit_ec_xfer_mock_next();
  703. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  704. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  705. KUNIT_EXPECT_EQ(test, mock->msg.command,
  706. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  707. EC_CMD_GET_PROTOCOL_INFO);
  708. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  709. sizeof(struct ec_response_get_protocol_info));
  710. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  711. }
  712. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  713. {
  714. struct ec_params_get_cmd_versions *data;
  715. mock = cros_kunit_ec_xfer_mock_next();
  716. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  717. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  718. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  719. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  720. sizeof(struct ec_response_get_cmd_versions));
  721. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  722. data = (struct ec_params_get_cmd_versions *)mock->i_data;
  723. KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
  724. KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
  725. }
  726. }
  727. static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test)
  728. {
  729. struct cros_ec_proto_test_priv *priv = test->priv;
  730. struct cros_ec_device *ec_dev = &priv->ec_dev;
  731. struct ec_xfer_mock *mock;
  732. int ret;
  733. /* Set some garbage bytes. */
  734. ec_dev->mkbp_event_supported = 0xbf;
  735. /* For cros_ec_get_proto_info() without passthru. */
  736. {
  737. struct ec_response_get_protocol_info *data;
  738. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  739. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  740. /*
  741. * Although it doesn't check the value, provides valid sizes so that
  742. * cros_ec_query_all() allocates din and dout correctly.
  743. */
  744. data = (struct ec_response_get_protocol_info *)mock->o_data;
  745. data->max_request_packet_size = 0xbe;
  746. data->max_response_packet_size = 0xef;
  747. }
  748. /* For cros_ec_get_proto_info() with passthru. */
  749. {
  750. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  751. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  752. }
  753. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  754. {
  755. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  756. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  757. }
  758. cros_ec_proto_test_query_all_pretest(test);
  759. ret = cros_ec_query_all(ec_dev);
  760. KUNIT_EXPECT_EQ(test, ret, 0);
  761. /* For cros_ec_get_proto_info() without passthru. */
  762. {
  763. mock = cros_kunit_ec_xfer_mock_next();
  764. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  765. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  766. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  767. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  768. sizeof(struct ec_response_get_protocol_info));
  769. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  770. }
  771. /* For cros_ec_get_proto_info() with passthru. */
  772. {
  773. mock = cros_kunit_ec_xfer_mock_next();
  774. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  775. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  776. KUNIT_EXPECT_EQ(test, mock->msg.command,
  777. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  778. EC_CMD_GET_PROTOCOL_INFO);
  779. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  780. sizeof(struct ec_response_get_protocol_info));
  781. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  782. }
  783. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  784. {
  785. struct ec_params_get_cmd_versions *data;
  786. mock = cros_kunit_ec_xfer_mock_next();
  787. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  788. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  789. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  790. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  791. sizeof(struct ec_response_get_cmd_versions));
  792. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  793. data = (struct ec_params_get_cmd_versions *)mock->i_data;
  794. KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
  795. KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
  796. }
  797. }
  798. static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test)
  799. {
  800. struct cros_ec_proto_test_priv *priv = test->priv;
  801. struct cros_ec_device *ec_dev = &priv->ec_dev;
  802. struct ec_xfer_mock *mock;
  803. int ret;
  804. /* Set some garbage bytes. */
  805. ec_dev->mkbp_event_supported = 0xbf;
  806. /* For cros_ec_get_proto_info() without passthru. */
  807. {
  808. struct ec_response_get_protocol_info *data;
  809. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  810. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  811. /*
  812. * Although it doesn't check the value, provides valid sizes so that
  813. * cros_ec_query_all() allocates din and dout correctly.
  814. */
  815. data = (struct ec_response_get_protocol_info *)mock->o_data;
  816. data->max_request_packet_size = 0xbe;
  817. data->max_response_packet_size = 0xef;
  818. }
  819. /* For cros_ec_get_proto_info() with passthru. */
  820. {
  821. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  822. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  823. }
  824. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  825. {
  826. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  827. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  828. }
  829. cros_ec_proto_test_query_all_pretest(test);
  830. ret = cros_ec_query_all(ec_dev);
  831. KUNIT_EXPECT_EQ(test, ret, 0);
  832. /* For cros_ec_get_proto_info() without passthru. */
  833. {
  834. mock = cros_kunit_ec_xfer_mock_next();
  835. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  836. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  837. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  838. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  839. sizeof(struct ec_response_get_protocol_info));
  840. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  841. }
  842. /* For cros_ec_get_proto_info() with passthru. */
  843. {
  844. mock = cros_kunit_ec_xfer_mock_next();
  845. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  846. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  847. KUNIT_EXPECT_EQ(test, mock->msg.command,
  848. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  849. EC_CMD_GET_PROTOCOL_INFO);
  850. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  851. sizeof(struct ec_response_get_protocol_info));
  852. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  853. }
  854. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  855. {
  856. struct ec_params_get_cmd_versions *data;
  857. mock = cros_kunit_ec_xfer_mock_next();
  858. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  859. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  860. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  861. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  862. sizeof(struct ec_response_get_cmd_versions));
  863. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  864. data = (struct ec_params_get_cmd_versions *)mock->i_data;
  865. KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
  866. KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
  867. }
  868. }
  869. static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test)
  870. {
  871. struct cros_ec_proto_test_priv *priv = test->priv;
  872. struct cros_ec_device *ec_dev = &priv->ec_dev;
  873. struct ec_xfer_mock *mock;
  874. int ret;
  875. /* Set some garbage bytes. */
  876. ec_dev->host_sleep_v1 = true;
  877. /* For cros_ec_get_proto_info() without passthru. */
  878. {
  879. struct ec_response_get_protocol_info *data;
  880. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  881. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  882. /*
  883. * Although it doesn't check the value, provides valid sizes so that
  884. * cros_ec_query_all() allocates din and dout correctly.
  885. */
  886. data = (struct ec_response_get_protocol_info *)mock->o_data;
  887. data->max_request_packet_size = 0xbe;
  888. data->max_response_packet_size = 0xef;
  889. }
  890. /* For cros_ec_get_proto_info() with passthru. */
  891. {
  892. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  893. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  894. }
  895. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  896. {
  897. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  898. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  899. }
  900. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  901. {
  902. struct ec_response_get_cmd_versions *data;
  903. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  904. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  905. data = (struct ec_response_get_cmd_versions *)mock->o_data;
  906. data->version_mask = 0;
  907. }
  908. cros_ec_proto_test_query_all_pretest(test);
  909. ret = cros_ec_query_all(ec_dev);
  910. KUNIT_EXPECT_EQ(test, ret, 0);
  911. /* For cros_ec_get_proto_info() without passthru. */
  912. {
  913. mock = cros_kunit_ec_xfer_mock_next();
  914. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  915. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  916. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  917. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  918. sizeof(struct ec_response_get_protocol_info));
  919. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  920. }
  921. /* For cros_ec_get_proto_info() with passthru. */
  922. {
  923. mock = cros_kunit_ec_xfer_mock_next();
  924. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  925. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  926. KUNIT_EXPECT_EQ(test, mock->msg.command,
  927. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  928. EC_CMD_GET_PROTOCOL_INFO);
  929. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  930. sizeof(struct ec_response_get_protocol_info));
  931. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  932. }
  933. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  934. {
  935. mock = cros_kunit_ec_xfer_mock_next();
  936. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  937. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  938. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  939. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  940. sizeof(struct ec_response_get_cmd_versions));
  941. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  942. }
  943. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  944. {
  945. mock = cros_kunit_ec_xfer_mock_next();
  946. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  947. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  948. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  949. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  950. sizeof(struct ec_response_get_cmd_versions));
  951. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  952. KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
  953. }
  954. }
  955. static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kunit *test)
  956. {
  957. struct cros_ec_proto_test_priv *priv = test->priv;
  958. struct cros_ec_device *ec_dev = &priv->ec_dev;
  959. struct ec_xfer_mock *mock;
  960. int ret;
  961. /* Set some garbage bytes. */
  962. ec_dev->host_sleep_v1 = true;
  963. /* For cros_ec_get_proto_info() without passthru. */
  964. {
  965. struct ec_response_get_protocol_info *data;
  966. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  967. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  968. /*
  969. * Although it doesn't check the value, provides valid sizes so that
  970. * cros_ec_query_all() allocates din and dout correctly.
  971. */
  972. data = (struct ec_response_get_protocol_info *)mock->o_data;
  973. data->max_request_packet_size = 0xbe;
  974. data->max_response_packet_size = 0xef;
  975. }
  976. /* For cros_ec_get_proto_info() with passthru. */
  977. {
  978. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  979. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  980. }
  981. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  982. {
  983. struct ec_response_get_cmd_versions *data;
  984. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  985. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  986. /* In order to pollute next cros_ec_get_host_command_version_mask(). */
  987. data = (struct ec_response_get_cmd_versions *)mock->o_data;
  988. data->version_mask = 0xbeef;
  989. }
  990. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  991. {
  992. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  993. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  994. }
  995. cros_ec_proto_test_query_all_pretest(test);
  996. ret = cros_ec_query_all(ec_dev);
  997. KUNIT_EXPECT_EQ(test, ret, 0);
  998. /* For cros_ec_get_proto_info() without passthru. */
  999. {
  1000. mock = cros_kunit_ec_xfer_mock_next();
  1001. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1002. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1003. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  1004. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1005. sizeof(struct ec_response_get_protocol_info));
  1006. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1007. }
  1008. /* For cros_ec_get_proto_info() with passthru. */
  1009. {
  1010. mock = cros_kunit_ec_xfer_mock_next();
  1011. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1012. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1013. KUNIT_EXPECT_EQ(test, mock->msg.command,
  1014. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  1015. EC_CMD_GET_PROTOCOL_INFO);
  1016. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1017. sizeof(struct ec_response_get_protocol_info));
  1018. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1019. }
  1020. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  1021. {
  1022. mock = cros_kunit_ec_xfer_mock_next();
  1023. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1024. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1025. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1026. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1027. sizeof(struct ec_response_get_cmd_versions));
  1028. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1029. }
  1030. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  1031. {
  1032. mock = cros_kunit_ec_xfer_mock_next();
  1033. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1034. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1035. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1036. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1037. sizeof(struct ec_response_get_cmd_versions));
  1038. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1039. KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
  1040. }
  1041. }
  1042. static void cros_ec_proto_test_query_all_default_wake_mask_return_error(struct kunit *test)
  1043. {
  1044. struct cros_ec_proto_test_priv *priv = test->priv;
  1045. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1046. struct ec_xfer_mock *mock;
  1047. int ret;
  1048. /* Set some garbage bytes. */
  1049. ec_dev->host_event_wake_mask = U32_MAX;
  1050. /* For cros_ec_get_proto_info() without passthru. */
  1051. {
  1052. struct ec_response_get_protocol_info *data;
  1053. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1054. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1055. /*
  1056. * Although it doesn't check the value, provides valid sizes so that
  1057. * cros_ec_query_all() allocates din and dout correctly.
  1058. */
  1059. data = (struct ec_response_get_protocol_info *)mock->o_data;
  1060. data->max_request_packet_size = 0xbe;
  1061. data->max_response_packet_size = 0xef;
  1062. }
  1063. /* For cros_ec_get_proto_info() with passthru. */
  1064. {
  1065. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  1066. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1067. }
  1068. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  1069. {
  1070. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1071. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1072. }
  1073. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  1074. {
  1075. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1076. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1077. }
  1078. /* For cros_ec_get_host_event_wake_mask(). */
  1079. {
  1080. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  1081. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1082. }
  1083. cros_ec_proto_test_query_all_pretest(test);
  1084. ret = cros_ec_query_all(ec_dev);
  1085. KUNIT_EXPECT_EQ(test, ret, 0);
  1086. /* For cros_ec_get_proto_info() without passthru. */
  1087. {
  1088. mock = cros_kunit_ec_xfer_mock_next();
  1089. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1090. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1091. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  1092. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1093. sizeof(struct ec_response_get_protocol_info));
  1094. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1095. }
  1096. /* For cros_ec_get_proto_info() with passthru. */
  1097. {
  1098. mock = cros_kunit_ec_xfer_mock_next();
  1099. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1100. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1101. KUNIT_EXPECT_EQ(test, mock->msg.command,
  1102. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  1103. EC_CMD_GET_PROTOCOL_INFO);
  1104. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1105. sizeof(struct ec_response_get_protocol_info));
  1106. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1107. }
  1108. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  1109. {
  1110. mock = cros_kunit_ec_xfer_mock_next();
  1111. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1112. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1113. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1114. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1115. sizeof(struct ec_response_get_cmd_versions));
  1116. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1117. }
  1118. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  1119. {
  1120. mock = cros_kunit_ec_xfer_mock_next();
  1121. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1122. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1123. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1124. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1125. sizeof(struct ec_response_get_cmd_versions));
  1126. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1127. }
  1128. /* For cros_ec_get_host_event_wake_mask(). */
  1129. {
  1130. u32 mask;
  1131. mock = cros_kunit_ec_xfer_mock_next();
  1132. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1133. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1134. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
  1135. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
  1136. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1137. mask = ec_dev->host_event_wake_mask;
  1138. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0);
  1139. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0);
  1140. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0);
  1141. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0);
  1142. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0);
  1143. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0);
  1144. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0);
  1145. }
  1146. }
  1147. static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit *test)
  1148. {
  1149. struct cros_ec_proto_test_priv *priv = test->priv;
  1150. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1151. struct ec_xfer_mock *mock;
  1152. int ret;
  1153. /* Set some garbage bytes. */
  1154. ec_dev->host_event_wake_mask = U32_MAX;
  1155. /* For cros_ec_get_proto_info() without passthru. */
  1156. {
  1157. struct ec_response_get_protocol_info *data;
  1158. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1159. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1160. /*
  1161. * Although it doesn't check the value, provides valid sizes so that
  1162. * cros_ec_query_all() allocates din and dout correctly.
  1163. */
  1164. data = (struct ec_response_get_protocol_info *)mock->o_data;
  1165. data->max_request_packet_size = 0xbe;
  1166. data->max_response_packet_size = 0xef;
  1167. }
  1168. /* For cros_ec_get_proto_info() with passthru. */
  1169. {
  1170. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  1171. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1172. }
  1173. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  1174. {
  1175. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1176. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1177. }
  1178. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  1179. {
  1180. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1181. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1182. }
  1183. /* For get_host_event_wake_mask(). */
  1184. {
  1185. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1186. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1187. }
  1188. cros_ec_proto_test_query_all_pretest(test);
  1189. ret = cros_ec_query_all(ec_dev);
  1190. KUNIT_EXPECT_EQ(test, ret, 0);
  1191. /* For cros_ec_get_proto_info() without passthru. */
  1192. {
  1193. mock = cros_kunit_ec_xfer_mock_next();
  1194. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1195. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1196. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
  1197. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1198. sizeof(struct ec_response_get_protocol_info));
  1199. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1200. }
  1201. /* For cros_ec_get_proto_info() with passthru. */
  1202. {
  1203. mock = cros_kunit_ec_xfer_mock_next();
  1204. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1205. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1206. KUNIT_EXPECT_EQ(test, mock->msg.command,
  1207. EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
  1208. EC_CMD_GET_PROTOCOL_INFO);
  1209. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1210. sizeof(struct ec_response_get_protocol_info));
  1211. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1212. }
  1213. /* For cros_ec_get_host_command_version_mask() for MKBP. */
  1214. {
  1215. mock = cros_kunit_ec_xfer_mock_next();
  1216. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1217. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1218. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1219. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1220. sizeof(struct ec_response_get_cmd_versions));
  1221. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1222. }
  1223. /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
  1224. {
  1225. mock = cros_kunit_ec_xfer_mock_next();
  1226. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1227. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1228. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
  1229. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1230. sizeof(struct ec_response_get_cmd_versions));
  1231. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
  1232. }
  1233. /* For get_host_event_wake_mask(). */
  1234. {
  1235. u32 mask;
  1236. mock = cros_kunit_ec_xfer_mock_next();
  1237. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1238. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1239. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
  1240. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
  1241. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1242. mask = ec_dev->host_event_wake_mask;
  1243. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0);
  1244. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0);
  1245. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0);
  1246. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0);
  1247. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0);
  1248. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0);
  1249. KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0);
  1250. }
  1251. }
  1252. static void cros_ec_proto_test_cmd_xfer_normal(struct kunit *test)
  1253. {
  1254. struct cros_ec_proto_test_priv *priv = test->priv;
  1255. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1256. struct ec_xfer_mock *mock;
  1257. int ret;
  1258. DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100);
  1259. ec_dev->max_request = 0xff;
  1260. ec_dev->max_response = 0xee;
  1261. ec_dev->max_passthru = 0xdd;
  1262. buf->version = 0;
  1263. buf->command = EC_CMD_HELLO;
  1264. buf->insize = 4;
  1265. buf->outsize = 2;
  1266. buf->data[0] = 0x55;
  1267. buf->data[1] = 0xaa;
  1268. {
  1269. u8 *data;
  1270. mock = cros_kunit_ec_xfer_mock_add(test, 4);
  1271. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1272. data = (u8 *)mock->o_data;
  1273. data[0] = 0xaa;
  1274. data[1] = 0x55;
  1275. data[2] = 0xcc;
  1276. data[3] = 0x33;
  1277. }
  1278. ret = cros_ec_cmd_xfer(ec_dev, buf);
  1279. KUNIT_EXPECT_EQ(test, ret, 4);
  1280. {
  1281. u8 *data;
  1282. mock = cros_kunit_ec_xfer_mock_next();
  1283. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1284. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1285. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  1286. KUNIT_EXPECT_EQ(test, mock->msg.insize, 4);
  1287. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2);
  1288. data = (u8 *)mock->i_data;
  1289. KUNIT_EXPECT_EQ(test, data[0], 0x55);
  1290. KUNIT_EXPECT_EQ(test, data[1], 0xaa);
  1291. KUNIT_EXPECT_EQ(test, buf->data[0], 0xaa);
  1292. KUNIT_EXPECT_EQ(test, buf->data[1], 0x55);
  1293. KUNIT_EXPECT_EQ(test, buf->data[2], 0xcc);
  1294. KUNIT_EXPECT_EQ(test, buf->data[3], 0x33);
  1295. }
  1296. }
  1297. static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit *test)
  1298. {
  1299. struct cros_ec_proto_test_priv *priv = test->priv;
  1300. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1301. struct ec_xfer_mock *mock;
  1302. int ret;
  1303. DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100);
  1304. ec_dev->max_request = 0xff;
  1305. ec_dev->max_response = 0xee;
  1306. ec_dev->max_passthru = 0xdd;
  1307. buf->version = 0;
  1308. buf->command = EC_CMD_HELLO;
  1309. buf->insize = 0xee + 1;
  1310. buf->outsize = 2;
  1311. {
  1312. mock = cros_kunit_ec_xfer_mock_add(test, 0xcc);
  1313. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1314. }
  1315. ret = cros_ec_cmd_xfer(ec_dev, buf);
  1316. KUNIT_EXPECT_EQ(test, ret, 0xcc);
  1317. {
  1318. mock = cros_kunit_ec_xfer_mock_next();
  1319. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1320. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1321. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
  1322. KUNIT_EXPECT_EQ(test, mock->msg.insize, 0xee);
  1323. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2);
  1324. }
  1325. }
  1326. static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit *test)
  1327. {
  1328. struct cros_ec_proto_test_priv *priv = test->priv;
  1329. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1330. int ret;
  1331. DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100);
  1332. ec_dev->max_request = 0xff;
  1333. ec_dev->max_response = 0xee;
  1334. ec_dev->max_passthru = 0xdd;
  1335. buf->version = 0;
  1336. buf->command = EC_CMD_HELLO;
  1337. buf->insize = 4;
  1338. buf->outsize = 0xff + 1;
  1339. ret = cros_ec_cmd_xfer(ec_dev, buf);
  1340. KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
  1341. }
  1342. static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit *test)
  1343. {
  1344. struct cros_ec_proto_test_priv *priv = test->priv;
  1345. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1346. int ret;
  1347. DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100);
  1348. ec_dev->max_request = 0xff;
  1349. ec_dev->max_response = 0xee;
  1350. ec_dev->max_passthru = 0xdd;
  1351. buf->version = 0;
  1352. buf->command = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) + EC_CMD_HELLO;
  1353. buf->insize = 4;
  1354. buf->outsize = 0xdd + 1;
  1355. ret = cros_ec_cmd_xfer(ec_dev, buf);
  1356. KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
  1357. }
  1358. static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test)
  1359. {
  1360. struct cros_ec_proto_test_priv *priv = test->priv;
  1361. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1362. int ret;
  1363. struct cros_ec_command msg;
  1364. memset(&msg, 0, sizeof(msg));
  1365. ec_dev->proto_version = 3;
  1366. ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
  1367. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1368. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1369. KUNIT_EXPECT_EQ(test, ret, 0);
  1370. KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 0);
  1371. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 1);
  1372. }
  1373. static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test)
  1374. {
  1375. struct cros_ec_proto_test_priv *priv = test->priv;
  1376. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1377. int ret;
  1378. struct cros_ec_command msg;
  1379. memset(&msg, 0, sizeof(msg));
  1380. ec_dev->proto_version = 3;
  1381. ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
  1382. ec_dev->pkt_xfer = NULL;
  1383. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1384. KUNIT_EXPECT_EQ(test, ret, -EIO);
  1385. }
  1386. static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test)
  1387. {
  1388. struct cros_ec_proto_test_priv *priv = test->priv;
  1389. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1390. int ret;
  1391. struct cros_ec_command msg;
  1392. memset(&msg, 0, sizeof(msg));
  1393. ec_dev->proto_version = 2;
  1394. ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
  1395. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1396. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1397. KUNIT_EXPECT_EQ(test, ret, 0);
  1398. KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 1);
  1399. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 0);
  1400. }
  1401. static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test)
  1402. {
  1403. struct cros_ec_proto_test_priv *priv = test->priv;
  1404. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1405. int ret;
  1406. struct cros_ec_command msg;
  1407. memset(&msg, 0, sizeof(msg));
  1408. ec_dev->proto_version = 2;
  1409. ec_dev->cmd_xfer = NULL;
  1410. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1411. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1412. KUNIT_EXPECT_EQ(test, ret, -EIO);
  1413. }
  1414. static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test)
  1415. {
  1416. struct cros_ec_proto_test_priv *priv = test->priv;
  1417. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1418. struct ec_xfer_mock *mock;
  1419. int ret;
  1420. struct cros_ec_command msg;
  1421. memset(&msg, 0, sizeof(msg));
  1422. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1423. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1424. {
  1425. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1426. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1427. }
  1428. /* For EC_CMD_GET_COMMS_STATUS. */
  1429. {
  1430. struct ec_response_get_comms_status *data;
  1431. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1432. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1433. data = (struct ec_response_get_comms_status *)mock->o_data;
  1434. data->flags = 0;
  1435. }
  1436. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1437. KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status));
  1438. KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS);
  1439. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1440. {
  1441. mock = cros_kunit_ec_xfer_mock_next();
  1442. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1443. }
  1444. /* For EC_CMD_GET_COMMS_STATUS. */
  1445. {
  1446. mock = cros_kunit_ec_xfer_mock_next();
  1447. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1448. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1449. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_COMMS_STATUS);
  1450. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1451. sizeof(struct ec_response_get_comms_status));
  1452. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1453. }
  1454. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
  1455. }
  1456. static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test)
  1457. {
  1458. struct cros_ec_proto_test_priv *priv = test->priv;
  1459. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1460. struct ec_xfer_mock *mock;
  1461. int ret;
  1462. struct cros_ec_command msg;
  1463. memset(&msg, 0, sizeof(msg));
  1464. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1465. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1466. {
  1467. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1468. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1469. }
  1470. /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
  1471. cros_kunit_ec_xfer_mock_default_ret = -EAGAIN;
  1472. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1473. KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
  1474. /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
  1475. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
  1476. }
  1477. static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test)
  1478. {
  1479. struct cros_ec_proto_test_priv *priv = test->priv;
  1480. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1481. struct ec_xfer_mock *mock;
  1482. int ret;
  1483. struct cros_ec_command msg;
  1484. memset(&msg, 0, sizeof(msg));
  1485. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1486. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1487. {
  1488. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1489. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1490. }
  1491. /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
  1492. {
  1493. struct ec_response_get_comms_status *data;
  1494. int i;
  1495. for (i = 0; i < 50; ++i) {
  1496. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1497. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1498. data = (struct ec_response_get_comms_status *)mock->o_data;
  1499. data->flags |= EC_COMMS_STATUS_PROCESSING;
  1500. }
  1501. }
  1502. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1503. KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
  1504. /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
  1505. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
  1506. }
  1507. static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test)
  1508. {
  1509. struct cros_ec_proto_test_priv *priv = test->priv;
  1510. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1511. struct ec_xfer_mock *mock;
  1512. int ret;
  1513. struct cros_ec_command msg;
  1514. memset(&msg, 0, sizeof(msg));
  1515. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1516. {
  1517. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1518. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1519. }
  1520. /* For EC_CMD_GET_COMMS_STATUS. */
  1521. {
  1522. mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
  1523. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1524. }
  1525. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1526. KUNIT_EXPECT_EQ(test, ret, -EIO);
  1527. }
  1528. static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test)
  1529. {
  1530. struct cros_ec_proto_test_priv *priv = test->priv;
  1531. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1532. struct ec_xfer_mock *mock;
  1533. int ret;
  1534. struct cros_ec_command msg;
  1535. memset(&msg, 0, sizeof(msg));
  1536. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1537. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1538. {
  1539. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1540. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1541. }
  1542. /* For EC_CMD_GET_COMMS_STATUS. */
  1543. {
  1544. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
  1545. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1546. }
  1547. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1548. KUNIT_EXPECT_EQ(test, ret, 0);
  1549. KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND);
  1550. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
  1551. }
  1552. static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit *test)
  1553. {
  1554. struct cros_ec_proto_test_priv *priv = test->priv;
  1555. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1556. struct ec_xfer_mock *mock;
  1557. int ret;
  1558. struct cros_ec_command msg;
  1559. memset(&msg, 0, sizeof(msg));
  1560. ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
  1561. /* For the first host command to return EC_RES_IN_PROGRESS. */
  1562. {
  1563. mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
  1564. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1565. }
  1566. /* For EC_CMD_GET_COMMS_STATUS. */
  1567. {
  1568. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1569. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1570. }
  1571. ret = cros_ec_cmd_xfer(ec_dev, &msg);
  1572. KUNIT_EXPECT_EQ(test, ret, -EPROTO);
  1573. KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
  1574. }
  1575. static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit *test)
  1576. {
  1577. struct cros_ec_proto_test_priv *priv = test->priv;
  1578. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1579. struct ec_xfer_mock *mock;
  1580. int ret;
  1581. struct cros_ec_command msg;
  1582. memset(&msg, 0, sizeof(msg));
  1583. /* For cros_ec_cmd_xfer(). */
  1584. {
  1585. mock = cros_kunit_ec_xfer_mock_add(test, 0);
  1586. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1587. }
  1588. ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
  1589. KUNIT_EXPECT_EQ(test, ret, 0);
  1590. }
  1591. static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit *test)
  1592. {
  1593. struct cros_ec_proto_test_priv *priv = test->priv;
  1594. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1595. struct ec_xfer_mock *mock;
  1596. int ret;
  1597. struct cros_ec_command msg;
  1598. memset(&msg, 0, sizeof(msg));
  1599. /* For cros_ec_cmd_xfer(). */
  1600. {
  1601. mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
  1602. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1603. }
  1604. ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
  1605. KUNIT_EXPECT_EQ(test, ret, -EPROTO);
  1606. }
  1607. static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test)
  1608. {
  1609. struct cros_ec_proto_test_priv *priv = test->priv;
  1610. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1611. struct ec_xfer_mock *mock;
  1612. int ret, i;
  1613. struct cros_ec_command msg;
  1614. static const int map[] = {
  1615. [EC_RES_SUCCESS] = 0,
  1616. [EC_RES_INVALID_COMMAND] = -EOPNOTSUPP,
  1617. [EC_RES_ERROR] = -EIO,
  1618. [EC_RES_INVALID_PARAM] = -EINVAL,
  1619. [EC_RES_ACCESS_DENIED] = -EACCES,
  1620. [EC_RES_INVALID_RESPONSE] = -EPROTO,
  1621. [EC_RES_INVALID_VERSION] = -ENOPROTOOPT,
  1622. [EC_RES_INVALID_CHECKSUM] = -EBADMSG,
  1623. /*
  1624. * EC_RES_IN_PROGRESS is special because cros_ec_send_command() has extra logic to
  1625. * handle it. Note that default cros_kunit_ec_xfer_mock_default_ret == 0 thus
  1626. * cros_ec_xfer_command() in cros_ec_wait_until_complete() returns 0. As a result,
  1627. * it returns -EPROTO without calling cros_ec_map_error().
  1628. */
  1629. [EC_RES_IN_PROGRESS] = -EPROTO,
  1630. [EC_RES_UNAVAILABLE] = -ENODATA,
  1631. [EC_RES_TIMEOUT] = -ETIMEDOUT,
  1632. [EC_RES_OVERFLOW] = -EOVERFLOW,
  1633. [EC_RES_INVALID_HEADER] = -EBADR,
  1634. [EC_RES_REQUEST_TRUNCATED] = -EBADR,
  1635. [EC_RES_RESPONSE_TOO_BIG] = -EFBIG,
  1636. [EC_RES_BUS_ERROR] = -EFAULT,
  1637. [EC_RES_BUSY] = -EBUSY,
  1638. [EC_RES_INVALID_HEADER_VERSION] = -EBADMSG,
  1639. [EC_RES_INVALID_HEADER_CRC] = -EBADMSG,
  1640. [EC_RES_INVALID_DATA_CRC] = -EBADMSG,
  1641. [EC_RES_DUP_UNAVAILABLE] = -ENODATA,
  1642. };
  1643. memset(&msg, 0, sizeof(msg));
  1644. for (i = 0; i < ARRAY_SIZE(map); ++i) {
  1645. mock = cros_kunit_ec_xfer_mock_addx(test, 0, i, 0);
  1646. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1647. ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
  1648. KUNIT_EXPECT_EQ(test, ret, map[i]);
  1649. }
  1650. }
  1651. static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test)
  1652. {
  1653. struct cros_ec_proto_test_priv *priv = test->priv;
  1654. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1655. struct ec_xfer_mock *mock;
  1656. int ret;
  1657. bool wake_event, more_events;
  1658. ec_dev->max_request = 0xff;
  1659. ec_dev->max_response = 0xee;
  1660. ec_dev->mkbp_event_supported = 0;
  1661. /* Set some garbage bytes. */
  1662. wake_event = false;
  1663. more_events = true;
  1664. /* For get_keyboard_state_event(). */
  1665. {
  1666. union ec_response_get_next_data_v3 *data;
  1667. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1668. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1669. data = (union ec_response_get_next_data_v3 *)mock->o_data;
  1670. data->host_event = 0xbeef;
  1671. }
  1672. ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
  1673. KUNIT_EXPECT_EQ(test, ret, sizeof(union ec_response_get_next_data_v3));
  1674. KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_KEY_MATRIX);
  1675. KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.host_event, 0xbeef);
  1676. KUNIT_EXPECT_TRUE(test, wake_event);
  1677. KUNIT_EXPECT_FALSE(test, more_events);
  1678. /* For get_keyboard_state_event(). */
  1679. {
  1680. mock = cros_kunit_ec_xfer_mock_next();
  1681. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1682. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1683. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MKBP_STATE);
  1684. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(union ec_response_get_next_data_v3));
  1685. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1686. }
  1687. }
  1688. static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test)
  1689. {
  1690. struct cros_ec_proto_test_priv *priv = test->priv;
  1691. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1692. int ret;
  1693. ec_dev->mkbp_event_supported = 1;
  1694. ec_dev->suspended = true;
  1695. ret = cros_ec_get_next_event(ec_dev, NULL, NULL);
  1696. KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN);
  1697. }
  1698. static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test)
  1699. {
  1700. struct cros_ec_proto_test_priv *priv = test->priv;
  1701. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1702. struct ec_xfer_mock *mock;
  1703. int ret;
  1704. bool wake_event, more_events;
  1705. ec_dev->max_request = 0xff;
  1706. ec_dev->max_response = 0xee;
  1707. ec_dev->mkbp_event_supported = 1;
  1708. /* Set some garbage bytes. */
  1709. wake_event = true;
  1710. more_events = false;
  1711. /* For get_next_event_xfer(). */
  1712. {
  1713. struct ec_response_get_next_event *data;
  1714. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1715. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1716. data = (struct ec_response_get_next_event *)mock->o_data;
  1717. data->event_type = EC_MKBP_EVENT_SENSOR_FIFO | EC_MKBP_HAS_MORE_EVENTS;
  1718. data->data.sysrq = 0xbeef;
  1719. }
  1720. ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
  1721. KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event));
  1722. KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_SENSOR_FIFO);
  1723. KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
  1724. KUNIT_EXPECT_FALSE(test, wake_event);
  1725. KUNIT_EXPECT_TRUE(test, more_events);
  1726. /* For get_next_event_xfer(). */
  1727. {
  1728. mock = cros_kunit_ec_xfer_mock_next();
  1729. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1730. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1731. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
  1732. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_next_event));
  1733. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1734. }
  1735. }
  1736. static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test)
  1737. {
  1738. struct cros_ec_proto_test_priv *priv = test->priv;
  1739. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1740. struct ec_xfer_mock *mock;
  1741. int ret;
  1742. bool wake_event, more_events;
  1743. ec_dev->max_request = 0xff;
  1744. ec_dev->max_response = 0xee;
  1745. ec_dev->mkbp_event_supported = 3;
  1746. /* Set some garbage bytes. */
  1747. wake_event = false;
  1748. more_events = true;
  1749. /* For get_next_event_xfer(). */
  1750. {
  1751. struct ec_response_get_next_event_v1 *data;
  1752. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1753. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1754. data = (struct ec_response_get_next_event_v1 *)mock->o_data;
  1755. data->event_type = EC_MKBP_EVENT_FINGERPRINT;
  1756. data->data.sysrq = 0xbeef;
  1757. }
  1758. ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
  1759. KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event_v1));
  1760. KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_FINGERPRINT);
  1761. KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
  1762. KUNIT_EXPECT_TRUE(test, wake_event);
  1763. KUNIT_EXPECT_FALSE(test, more_events);
  1764. /* For get_next_event_xfer(). */
  1765. {
  1766. mock = cros_kunit_ec_xfer_mock_next();
  1767. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1768. KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
  1769. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
  1770. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1771. sizeof(struct ec_response_get_next_event_v1));
  1772. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1773. }
  1774. }
  1775. static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test)
  1776. {
  1777. struct cros_ec_proto_test_priv *priv = test->priv;
  1778. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1779. struct ec_xfer_mock *mock;
  1780. int ret;
  1781. bool wake_event;
  1782. struct ec_response_get_next_event_v1 *data;
  1783. ec_dev->max_request = 0xff;
  1784. ec_dev->max_response = 0xee;
  1785. ec_dev->mkbp_event_supported = 3;
  1786. ec_dev->host_event_wake_mask = U32_MAX;
  1787. /* Set some garbage bytes. */
  1788. wake_event = true;
  1789. /* For get_next_event_xfer(). */
  1790. {
  1791. mock = cros_kunit_ec_xfer_mock_add(test,
  1792. sizeof(data->event_type) +
  1793. sizeof(data->data.host_event));
  1794. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1795. data = (struct ec_response_get_next_event_v1 *)mock->o_data;
  1796. data->event_type = EC_MKBP_EVENT_HOST_EVENT;
  1797. put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), &data->data.host_event);
  1798. }
  1799. ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
  1800. KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
  1801. KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
  1802. KUNIT_EXPECT_FALSE(test, wake_event);
  1803. /* For get_next_event_xfer(). */
  1804. {
  1805. mock = cros_kunit_ec_xfer_mock_next();
  1806. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1807. KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
  1808. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
  1809. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1810. sizeof(struct ec_response_get_next_event_v1));
  1811. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1812. }
  1813. }
  1814. static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test)
  1815. {
  1816. struct cros_ec_proto_test_priv *priv = test->priv;
  1817. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1818. struct ec_xfer_mock *mock;
  1819. int ret;
  1820. bool wake_event;
  1821. struct ec_response_get_next_event_v1 *data;
  1822. ec_dev->max_request = 0xff;
  1823. ec_dev->max_response = 0xee;
  1824. ec_dev->mkbp_event_supported = 3;
  1825. ec_dev->host_event_wake_mask = U32_MAX & ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED);
  1826. /* Set some garbage bytes. */
  1827. wake_event = true;
  1828. /* For get_next_event_xfer(). */
  1829. {
  1830. mock = cros_kunit_ec_xfer_mock_add(test,
  1831. sizeof(data->event_type) +
  1832. sizeof(data->data.host_event));
  1833. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1834. data = (struct ec_response_get_next_event_v1 *)mock->o_data;
  1835. data->event_type = EC_MKBP_EVENT_HOST_EVENT;
  1836. put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED),
  1837. &data->data.host_event);
  1838. }
  1839. ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
  1840. KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
  1841. KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
  1842. KUNIT_EXPECT_FALSE(test, wake_event);
  1843. /* For get_next_event_xfer(). */
  1844. {
  1845. mock = cros_kunit_ec_xfer_mock_next();
  1846. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1847. KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
  1848. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
  1849. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  1850. sizeof(struct ec_response_get_next_event_v1));
  1851. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1852. }
  1853. }
  1854. static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit *test)
  1855. {
  1856. struct cros_ec_proto_test_priv *priv = test->priv;
  1857. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1858. int ret;
  1859. ec_dev->mkbp_event_supported = 0;
  1860. ret = cros_ec_get_host_event(ec_dev);
  1861. KUNIT_EXPECT_EQ(test, ret, 0);
  1862. }
  1863. static void cros_ec_proto_test_get_host_event_not_host_event(struct kunit *test)
  1864. {
  1865. struct cros_ec_proto_test_priv *priv = test->priv;
  1866. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1867. int ret;
  1868. ec_dev->mkbp_event_supported = 1;
  1869. ec_dev->event_data.event_type = EC_MKBP_EVENT_FINGERPRINT;
  1870. ret = cros_ec_get_host_event(ec_dev);
  1871. KUNIT_EXPECT_EQ(test, ret, 0);
  1872. }
  1873. static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit *test)
  1874. {
  1875. struct cros_ec_proto_test_priv *priv = test->priv;
  1876. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1877. int ret;
  1878. ec_dev->mkbp_event_supported = 1;
  1879. ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT;
  1880. ec_dev->event_size = 0xff;
  1881. ret = cros_ec_get_host_event(ec_dev);
  1882. KUNIT_EXPECT_EQ(test, ret, 0);
  1883. }
  1884. static void cros_ec_proto_test_get_host_event_normal(struct kunit *test)
  1885. {
  1886. struct cros_ec_proto_test_priv *priv = test->priv;
  1887. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1888. int ret;
  1889. ec_dev->mkbp_event_supported = 1;
  1890. ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT;
  1891. ec_dev->event_size = sizeof(ec_dev->event_data.data.host_event);
  1892. put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC),
  1893. &ec_dev->event_data.data.host_event);
  1894. ret = cros_ec_get_host_event(ec_dev);
  1895. KUNIT_EXPECT_EQ(test, ret, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC));
  1896. }
  1897. static void cros_ec_proto_test_check_features_cached(struct kunit *test)
  1898. {
  1899. int ret, i;
  1900. static struct cros_ec_dev ec;
  1901. ec.features.flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT);
  1902. ec.features.flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP);
  1903. for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
  1904. ret = cros_ec_check_features(&ec, i);
  1905. switch (i) {
  1906. case EC_FEATURE_FINGERPRINT:
  1907. case EC_FEATURE_SCP:
  1908. KUNIT_EXPECT_TRUE(test, ret);
  1909. break;
  1910. default:
  1911. KUNIT_EXPECT_FALSE(test, ret);
  1912. break;
  1913. }
  1914. }
  1915. }
  1916. static void cros_ec_proto_test_check_features_not_cached(struct kunit *test)
  1917. {
  1918. struct cros_ec_proto_test_priv *priv = test->priv;
  1919. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1920. struct ec_xfer_mock *mock;
  1921. int ret, i;
  1922. static struct cros_ec_dev ec;
  1923. ec_dev->max_request = 0xff;
  1924. ec_dev->max_response = 0xee;
  1925. ec.ec_dev = ec_dev;
  1926. ec.dev = ec_dev->dev;
  1927. ec.cmd_offset = 0;
  1928. ec.features.flags[0] = -1;
  1929. ec.features.flags[1] = -1;
  1930. /* For EC_CMD_GET_FEATURES. */
  1931. {
  1932. struct ec_response_get_features *data;
  1933. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1934. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1935. data = (struct ec_response_get_features *)mock->o_data;
  1936. data->flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT);
  1937. data->flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP);
  1938. }
  1939. for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
  1940. ret = cros_ec_check_features(&ec, i);
  1941. switch (i) {
  1942. case EC_FEATURE_FINGERPRINT:
  1943. case EC_FEATURE_SCP:
  1944. KUNIT_EXPECT_TRUE(test, ret);
  1945. break;
  1946. default:
  1947. KUNIT_EXPECT_FALSE(test, ret);
  1948. break;
  1949. }
  1950. }
  1951. /* For EC_CMD_GET_FEATURES. */
  1952. {
  1953. mock = cros_kunit_ec_xfer_mock_next();
  1954. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1955. KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
  1956. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_FEATURES);
  1957. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_features));
  1958. KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
  1959. }
  1960. }
  1961. static void cros_ec_proto_test_get_sensor_count_normal(struct kunit *test)
  1962. {
  1963. struct cros_ec_proto_test_priv *priv = test->priv;
  1964. struct cros_ec_device *ec_dev = &priv->ec_dev;
  1965. struct ec_xfer_mock *mock;
  1966. int ret;
  1967. static struct cros_ec_dev ec;
  1968. ec_dev->max_request = 0xff;
  1969. ec_dev->max_response = 0xee;
  1970. ec.ec_dev = ec_dev;
  1971. ec.dev = ec_dev->dev;
  1972. ec.cmd_offset = 0;
  1973. /* For EC_CMD_MOTION_SENSE_CMD. */
  1974. {
  1975. struct ec_response_motion_sense *data;
  1976. mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
  1977. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  1978. data = (struct ec_response_motion_sense *)mock->o_data;
  1979. data->dump.sensor_count = 0xbf;
  1980. }
  1981. ret = cros_ec_get_sensor_count(&ec);
  1982. KUNIT_EXPECT_EQ(test, ret, 0xbf);
  1983. /* For EC_CMD_MOTION_SENSE_CMD. */
  1984. {
  1985. struct ec_params_motion_sense *data;
  1986. mock = cros_kunit_ec_xfer_mock_next();
  1987. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  1988. KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
  1989. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
  1990. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense));
  1991. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  1992. data = (struct ec_params_motion_sense *)mock->i_data;
  1993. KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
  1994. }
  1995. }
  1996. static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit *test)
  1997. {
  1998. struct cros_ec_proto_test_priv *priv = test->priv;
  1999. struct cros_ec_device *ec_dev = &priv->ec_dev;
  2000. struct ec_xfer_mock *mock;
  2001. int ret;
  2002. static struct cros_ec_dev ec;
  2003. ec_dev->max_request = 0xff;
  2004. ec_dev->max_response = 0xee;
  2005. ec.ec_dev = ec_dev;
  2006. ec.dev = ec_dev->dev;
  2007. ec.cmd_offset = 0;
  2008. /* For EC_CMD_MOTION_SENSE_CMD. */
  2009. {
  2010. mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
  2011. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  2012. }
  2013. ret = cros_ec_get_sensor_count(&ec);
  2014. KUNIT_EXPECT_EQ(test, ret, -EPROTO);
  2015. /* For EC_CMD_MOTION_SENSE_CMD. */
  2016. {
  2017. struct ec_params_motion_sense *data;
  2018. mock = cros_kunit_ec_xfer_mock_next();
  2019. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  2020. KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
  2021. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
  2022. KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense));
  2023. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  2024. data = (struct ec_params_motion_sense *)mock->i_data;
  2025. KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
  2026. }
  2027. }
  2028. static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit *test)
  2029. {
  2030. struct cros_ec_proto_test_priv *priv = test->priv;
  2031. struct cros_ec_device *ec_dev = &priv->ec_dev;
  2032. struct ec_xfer_mock *mock;
  2033. int ret, i;
  2034. static struct cros_ec_dev ec;
  2035. struct {
  2036. u8 readmem_data;
  2037. int expected_result;
  2038. } test_data[] = {
  2039. { 0, 0 },
  2040. { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT, 2 },
  2041. };
  2042. ec_dev->max_request = 0xff;
  2043. ec_dev->max_response = 0xee;
  2044. ec_dev->cmd_readmem = cros_kunit_readmem_mock;
  2045. ec.ec_dev = ec_dev;
  2046. ec.dev = ec_dev->dev;
  2047. ec.cmd_offset = 0;
  2048. for (i = 0; i < ARRAY_SIZE(test_data); ++i) {
  2049. /* For EC_CMD_MOTION_SENSE_CMD. */
  2050. {
  2051. mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
  2052. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  2053. }
  2054. /* For readmem. */
  2055. {
  2056. cros_kunit_readmem_mock_data = kunit_kzalloc(test, 1, GFP_KERNEL);
  2057. KUNIT_ASSERT_PTR_NE(test, cros_kunit_readmem_mock_data, NULL);
  2058. cros_kunit_readmem_mock_data[0] = test_data[i].readmem_data;
  2059. cros_kunit_ec_xfer_mock_default_ret = 1;
  2060. }
  2061. ret = cros_ec_get_sensor_count(&ec);
  2062. KUNIT_EXPECT_EQ(test, ret, test_data[i].expected_result);
  2063. /* For EC_CMD_MOTION_SENSE_CMD. */
  2064. {
  2065. struct ec_params_motion_sense *data;
  2066. mock = cros_kunit_ec_xfer_mock_next();
  2067. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  2068. KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
  2069. KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
  2070. KUNIT_EXPECT_EQ(test, mock->msg.insize,
  2071. sizeof(struct ec_response_motion_sense));
  2072. KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
  2073. data = (struct ec_params_motion_sense *)mock->i_data;
  2074. KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
  2075. }
  2076. /* For readmem. */
  2077. {
  2078. KUNIT_EXPECT_EQ(test, cros_kunit_readmem_mock_offset, EC_MEMMAP_ACC_STATUS);
  2079. }
  2080. }
  2081. }
  2082. static void cros_ec_proto_test_ec_cmd(struct kunit *test)
  2083. {
  2084. struct cros_ec_proto_test_priv *priv = test->priv;
  2085. struct cros_ec_device *ec_dev = &priv->ec_dev;
  2086. struct ec_xfer_mock *mock;
  2087. int ret;
  2088. u8 out[3], in[2];
  2089. ec_dev->max_request = 0xff;
  2090. ec_dev->max_response = 0xee;
  2091. out[0] = 0xdd;
  2092. out[1] = 0xcc;
  2093. out[2] = 0xbb;
  2094. {
  2095. u8 *data;
  2096. mock = cros_kunit_ec_xfer_mock_add(test, 2);
  2097. KUNIT_ASSERT_PTR_NE(test, mock, NULL);
  2098. data = (u8 *)mock->o_data;
  2099. data[0] = 0xaa;
  2100. data[1] = 0x99;
  2101. }
  2102. ret = cros_ec_cmd(ec_dev, 0x88, 0x77, out, ARRAY_SIZE(out), in, ARRAY_SIZE(in));
  2103. KUNIT_EXPECT_EQ(test, ret, 2);
  2104. {
  2105. u8 *data;
  2106. mock = cros_kunit_ec_xfer_mock_next();
  2107. KUNIT_EXPECT_PTR_NE(test, mock, NULL);
  2108. KUNIT_EXPECT_EQ(test, mock->msg.version, 0x88);
  2109. KUNIT_EXPECT_EQ(test, mock->msg.command, 0x77);
  2110. KUNIT_EXPECT_EQ(test, mock->msg.insize, ARRAY_SIZE(in));
  2111. KUNIT_EXPECT_EQ(test, mock->msg.outsize, ARRAY_SIZE(out));
  2112. data = (u8 *)mock->i_data;
  2113. KUNIT_EXPECT_EQ(test, data[0], 0xdd);
  2114. KUNIT_EXPECT_EQ(test, data[1], 0xcc);
  2115. KUNIT_EXPECT_EQ(test, data[2], 0xbb);
  2116. }
  2117. }
  2118. static void cros_ec_proto_test_release(struct device *dev)
  2119. {
  2120. }
  2121. static int cros_ec_proto_test_init(struct kunit *test)
  2122. {
  2123. struct cros_ec_proto_test_priv *priv;
  2124. struct cros_ec_device *ec_dev;
  2125. priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
  2126. if (!priv)
  2127. return -ENOMEM;
  2128. test->priv = priv;
  2129. ec_dev = &priv->ec_dev;
  2130. ec_dev->dout = (u8 *)priv->dout;
  2131. ec_dev->dout_size = ARRAY_SIZE(priv->dout);
  2132. ec_dev->din = (u8 *)priv->din;
  2133. ec_dev->din_size = ARRAY_SIZE(priv->din);
  2134. ec_dev->proto_version = EC_HOST_REQUEST_VERSION;
  2135. ec_dev->dev = kunit_kzalloc(test, sizeof(*ec_dev->dev), GFP_KERNEL);
  2136. if (!ec_dev->dev)
  2137. return -ENOMEM;
  2138. device_initialize(ec_dev->dev);
  2139. dev_set_name(ec_dev->dev, "cros_ec_proto_test");
  2140. ec_dev->dev->release = cros_ec_proto_test_release;
  2141. ec_dev->cmd_xfer = cros_kunit_ec_xfer_mock;
  2142. ec_dev->pkt_xfer = cros_kunit_ec_xfer_mock;
  2143. mutex_init(&ec_dev->lock);
  2144. priv->msg = (struct cros_ec_command *)priv->_msg;
  2145. cros_kunit_mock_reset();
  2146. return 0;
  2147. }
  2148. static void cros_ec_proto_test_exit(struct kunit *test)
  2149. {
  2150. struct cros_ec_proto_test_priv *priv = test->priv;
  2151. struct cros_ec_device *ec_dev = &priv->ec_dev;
  2152. put_device(ec_dev->dev);
  2153. }
  2154. static struct kunit_case cros_ec_proto_test_cases[] = {
  2155. KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal),
  2156. KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize),
  2157. KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal),
  2158. KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize),
  2159. KUNIT_CASE(cros_ec_proto_test_check_result),
  2160. KUNIT_CASE(cros_ec_proto_test_query_all_normal),
  2161. KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error),
  2162. KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0),
  2163. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error),
  2164. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0),
  2165. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error),
  2166. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error),
  2167. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error),
  2168. KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0),
  2169. KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp),
  2170. KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error),
  2171. KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0),
  2172. KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep),
  2173. KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0),
  2174. KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error),
  2175. KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0),
  2176. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_normal),
  2177. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize),
  2178. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru),
  2179. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru),
  2180. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal),
  2181. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op),
  2182. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal),
  2183. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op),
  2184. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal),
  2185. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain),
  2186. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing),
  2187. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error),
  2188. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error),
  2189. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return0),
  2190. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal),
  2191. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error),
  2192. KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error),
  2193. KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event),
  2194. KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended),
  2195. KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0),
  2196. KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2),
  2197. KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc),
  2198. KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked),
  2199. KUNIT_CASE(cros_ec_proto_test_get_host_event_no_mkbp_event),
  2200. KUNIT_CASE(cros_ec_proto_test_get_host_event_not_host_event),
  2201. KUNIT_CASE(cros_ec_proto_test_get_host_event_wrong_event_size),
  2202. KUNIT_CASE(cros_ec_proto_test_get_host_event_normal),
  2203. KUNIT_CASE(cros_ec_proto_test_check_features_cached),
  2204. KUNIT_CASE(cros_ec_proto_test_check_features_not_cached),
  2205. KUNIT_CASE(cros_ec_proto_test_get_sensor_count_normal),
  2206. KUNIT_CASE(cros_ec_proto_test_get_sensor_count_xfer_error),
  2207. KUNIT_CASE(cros_ec_proto_test_get_sensor_count_legacy),
  2208. KUNIT_CASE(cros_ec_proto_test_ec_cmd),
  2209. {}
  2210. };
  2211. static struct kunit_suite cros_ec_proto_test_suite = {
  2212. .name = "cros_ec_proto_test",
  2213. .init = cros_ec_proto_test_init,
  2214. .exit = cros_ec_proto_test_exit,
  2215. .test_cases = cros_ec_proto_test_cases,
  2216. };
  2217. kunit_test_suite(cros_ec_proto_test_suite);
  2218. MODULE_DESCRIPTION("Kunit tests for ChromeOS Embedded Controller protocol");
  2219. MODULE_LICENSE("GPL");