dal_remotetest.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. /* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. /*
  14. * DAL remote test device test suite.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/errno.h>
  19. #include <linux/string.h>
  20. #include <linux/debugfs.h>
  21. #include "dal_remotetest.h"
  22. #define BYTEBUF_LEN 64
  23. #define rpc_error(num) \
  24. do { \
  25. errmask |= (1 << num); \
  26. printk(KERN_INFO "%s: remote_unittest_%d failed (%d)\n", \
  27. __func__, num, ret); \
  28. } while (0)
  29. #define verify_error(num, field) \
  30. do { \
  31. errmask |= (1 << num); \
  32. printk(KERN_INFO "%s: remote_unittest_%d failed (%s)\n", \
  33. __func__, num, field); \
  34. } while (0)
  35. static struct dentry *debugfs_dir_entry;
  36. static struct dentry *debugfs_modem_entry;
  37. static struct dentry *debugfs_dsp_entry;
  38. static uint8_t in_bytebuf[BYTEBUF_LEN];
  39. static uint8_t out_bytebuf[BYTEBUF_LEN];
  40. static uint8_t out_bytebuf2[BYTEBUF_LEN];
  41. static struct remote_test_data in_data;
  42. static struct remote_test_data out_data;
  43. static int block_until_cb = 1;
  44. static void init_data(struct remote_test_data *data)
  45. {
  46. int i;
  47. data->regular_event = REMOTE_UNITTEST_INPUT_HANDLE;
  48. data->payload_event = REMOTE_UNITTEST_INPUT_HANDLE;
  49. for (i = 0; i < 32; i++)
  50. data->test[i] = i;
  51. }
  52. static int verify_data(struct remote_test_data *data)
  53. {
  54. int i;
  55. if (data->regular_event != REMOTE_UNITTEST_INPUT_HANDLE ||
  56. data->payload_event != REMOTE_UNITTEST_INPUT_HANDLE)
  57. return -1;
  58. for (i = 0; i < 32; i++)
  59. if (data->test[i] != i)
  60. return -1;
  61. return 0;
  62. }
  63. static int verify_uint32_buffer(uint32_t *buf)
  64. {
  65. int i;
  66. for (i = 0; i < 32; i++)
  67. if (buf[i] != i)
  68. return -1;
  69. return 0;
  70. }
  71. static void init_bytebuf(uint8_t *bytebuf)
  72. {
  73. int i;
  74. for (i = 0; i < BYTEBUF_LEN; i++)
  75. bytebuf[i] = i & 0xff;
  76. }
  77. static int verify_bytebuf(uint8_t *bytebuf)
  78. {
  79. int i;
  80. for (i = 0; i < BYTEBUF_LEN; i++)
  81. if (bytebuf[i] != (i & 0xff))
  82. return -1;
  83. return 0;
  84. }
  85. static void test_cb(void *context, uint32_t param, void *data, uint32_t len)
  86. {
  87. block_until_cb = 0;
  88. }
  89. static int remotetest_exec(int dest, u64 *val)
  90. {
  91. void *dev_handle;
  92. void *event_handles[3];
  93. void *cb_handle;
  94. int ret;
  95. u64 errmask = 0;
  96. uint32_t ouint;
  97. uint32_t oalen;
  98. /* test daldevice_attach */
  99. ret = daldevice_attach(REMOTE_UNITTEST_DEVICEID, NULL,
  100. dest, &dev_handle);
  101. if (ret) {
  102. printk(KERN_INFO "%s: failed to attach (%d)\n", __func__, ret);
  103. *val = 0xffffffff;
  104. return 0;
  105. }
  106. /* test remote_unittest_0 */
  107. ret = remote_unittest_0(dev_handle, REMOTE_UNITTEST_INARG_1);
  108. if (ret)
  109. rpc_error(0);
  110. /* test remote_unittest_1 */
  111. ret = remote_unittest_1(dev_handle, REMOTE_UNITTEST_INARG_1,
  112. REMOTE_UNITTEST_INARG_2);
  113. if (ret)
  114. rpc_error(1);
  115. /* test remote_unittest_2 */
  116. ouint = 0;
  117. ret = remote_unittest_2(dev_handle, REMOTE_UNITTEST_INARG_1, &ouint);
  118. if (ret)
  119. rpc_error(2);
  120. else if (ouint != REMOTE_UNITTEST_OUTARG_1)
  121. verify_error(2, "ouint");
  122. /* test remote_unittest_3 */
  123. ret = remote_unittest_3(dev_handle, REMOTE_UNITTEST_INARG_1,
  124. REMOTE_UNITTEST_INARG_2,
  125. REMOTE_UNITTEST_INARG_3);
  126. if (ret)
  127. rpc_error(3);
  128. /* test remote_unittest_4 */
  129. ouint = 0;
  130. ret = remote_unittest_4(dev_handle, REMOTE_UNITTEST_INARG_1,
  131. REMOTE_UNITTEST_INARG_2, &ouint);
  132. if (ret)
  133. rpc_error(4);
  134. else if (ouint != REMOTE_UNITTEST_OUTARG_1)
  135. verify_error(4, "ouint");
  136. /* test remote_unittest_5 */
  137. init_data(&in_data);
  138. ret = remote_unittest_5(dev_handle, &in_data, sizeof(in_data));
  139. if (ret)
  140. rpc_error(5);
  141. /* test remote_unittest_6 */
  142. init_data(&in_data);
  143. ret = remote_unittest_6(dev_handle, REMOTE_UNITTEST_INARG_1,
  144. &in_data.test, sizeof(in_data.test));
  145. if (ret)
  146. rpc_error(6);
  147. /* test remote_unittest_7 */
  148. init_data(&in_data);
  149. memset(&out_data, 0, sizeof(out_data));
  150. ret = remote_unittest_7(dev_handle, &in_data, sizeof(in_data),
  151. &out_data.test, sizeof(out_data.test),
  152. &oalen);
  153. if (ret)
  154. rpc_error(7);
  155. else if (oalen != sizeof(out_data.test))
  156. verify_error(7, "oalen");
  157. else if (verify_uint32_buffer(out_data.test))
  158. verify_error(7, "obuf");
  159. /* test remote_unittest_8 */
  160. init_bytebuf(in_bytebuf);
  161. memset(&out_data, 0, sizeof(out_data));
  162. ret = remote_unittest_8(dev_handle, in_bytebuf, sizeof(in_bytebuf),
  163. &out_data, sizeof(out_data));
  164. if (ret)
  165. rpc_error(8);
  166. else if (verify_data(&out_data))
  167. verify_error(8, "obuf");
  168. /* test remote_unittest_9 */
  169. memset(&out_bytebuf, 0, sizeof(out_bytebuf));
  170. ret = remote_unittest_9(dev_handle, out_bytebuf, sizeof(out_bytebuf));
  171. if (ret)
  172. rpc_error(9);
  173. else if (verify_bytebuf(out_bytebuf))
  174. verify_error(9, "obuf");
  175. /* test remote_unittest_10 */
  176. init_bytebuf(in_bytebuf);
  177. memset(&out_bytebuf, 0, sizeof(out_bytebuf));
  178. ret = remote_unittest_10(dev_handle, REMOTE_UNITTEST_INARG_1,
  179. in_bytebuf, sizeof(in_bytebuf),
  180. out_bytebuf, sizeof(out_bytebuf), &oalen);
  181. if (ret)
  182. rpc_error(10);
  183. else if (oalen != sizeof(out_bytebuf))
  184. verify_error(10, "oalen");
  185. else if (verify_bytebuf(out_bytebuf))
  186. verify_error(10, "obuf");
  187. /* test remote_unittest_11 */
  188. memset(&out_bytebuf, 0, sizeof(out_bytebuf));
  189. ret = remote_unittest_11(dev_handle, REMOTE_UNITTEST_INARG_1,
  190. out_bytebuf, sizeof(out_bytebuf));
  191. if (ret)
  192. rpc_error(11);
  193. else if (verify_bytebuf(out_bytebuf))
  194. verify_error(11, "obuf");
  195. /* test remote_unittest_12 */
  196. memset(&out_bytebuf, 0, sizeof(out_bytebuf));
  197. ret = remote_unittest_12(dev_handle, REMOTE_UNITTEST_INARG_1,
  198. out_bytebuf, sizeof(out_bytebuf), &oalen);
  199. if (ret)
  200. rpc_error(12);
  201. else if (oalen != sizeof(out_bytebuf))
  202. verify_error(12, "oalen");
  203. else if (verify_bytebuf(out_bytebuf))
  204. verify_error(12, "obuf");
  205. /* test remote_unittest_13 */
  206. init_data(&in_data);
  207. memset(&out_data, 0, sizeof(out_data));
  208. ret = remote_unittest_13(dev_handle, in_data.test, sizeof(in_data.test),
  209. &in_data, sizeof(in_data),
  210. &out_data, sizeof(out_data));
  211. if (ret)
  212. rpc_error(13);
  213. else if (verify_data(&out_data))
  214. verify_error(13, "obuf");
  215. /* test remote_unittest_14 */
  216. init_data(&in_data);
  217. memset(out_bytebuf, 0, sizeof(out_bytebuf));
  218. memset(out_bytebuf2, 0, sizeof(out_bytebuf2));
  219. ret = remote_unittest_14(dev_handle,
  220. in_data.test, sizeof(in_data.test),
  221. out_bytebuf, sizeof(out_bytebuf),
  222. out_bytebuf2, sizeof(out_bytebuf2), &oalen);
  223. if (ret)
  224. rpc_error(14);
  225. else if (verify_bytebuf(out_bytebuf))
  226. verify_error(14, "obuf");
  227. else if (oalen != sizeof(out_bytebuf2))
  228. verify_error(14, "oalen");
  229. else if (verify_bytebuf(out_bytebuf2))
  230. verify_error(14, "obuf2");
  231. /* test remote_unittest_15 */
  232. init_data(&in_data);
  233. memset(out_bytebuf, 0, sizeof(out_bytebuf));
  234. memset(&out_data, 0, sizeof(out_data));
  235. ret = remote_unittest_15(dev_handle,
  236. in_data.test, sizeof(in_data.test),
  237. &in_data, sizeof(in_data),
  238. &out_data, sizeof(out_data), &oalen,
  239. out_bytebuf, sizeof(out_bytebuf));
  240. if (ret)
  241. rpc_error(15);
  242. else if (oalen != sizeof(out_data))
  243. verify_error(15, "oalen");
  244. else if (verify_bytebuf(out_bytebuf))
  245. verify_error(15, "obuf");
  246. else if (verify_data(&out_data))
  247. verify_error(15, "obuf2");
  248. /* test setting up asynch events */
  249. event_handles[0] = dalrpc_alloc_event(dev_handle);
  250. event_handles[1] = dalrpc_alloc_event(dev_handle);
  251. event_handles[2] = dalrpc_alloc_event(dev_handle);
  252. cb_handle = dalrpc_alloc_cb(dev_handle, test_cb, &out_data);
  253. in_data.regular_event = (uint32_t)event_handles[2];
  254. in_data.payload_event = (uint32_t)cb_handle;
  255. ret = remote_unittest_eventcfg(dev_handle, &in_data, sizeof(in_data));
  256. if (ret) {
  257. errmask |= (1 << 16);
  258. printk(KERN_INFO "%s: failed to configure asynch (%d)\n",
  259. __func__, ret);
  260. }
  261. /* test event */
  262. ret = remote_unittest_eventtrig(dev_handle,
  263. REMOTE_UNITTEST_REGULAR_EVENT);
  264. if (ret) {
  265. errmask |= (1 << 17);
  266. printk(KERN_INFO "%s: failed to trigger event (%d)\n",
  267. __func__, ret);
  268. }
  269. ret = dalrpc_event_wait(event_handles[2], 1000);
  270. if (ret) {
  271. errmask |= (1 << 18);
  272. printk(KERN_INFO "%s: failed to receive event (%d)\n",
  273. __func__, ret);
  274. }
  275. /* test event again */
  276. ret = remote_unittest_eventtrig(dev_handle,
  277. REMOTE_UNITTEST_REGULAR_EVENT);
  278. if (ret) {
  279. errmask |= (1 << 19);
  280. printk(KERN_INFO "%s: failed to trigger event (%d)\n",
  281. __func__, ret);
  282. }
  283. ret = dalrpc_event_wait_multiple(3, event_handles, 1000);
  284. if (ret != 2) {
  285. errmask |= (1 << 20);
  286. printk(KERN_INFO "%s: failed to receive event (%d)\n",
  287. __func__, ret);
  288. }
  289. /* test callback */
  290. ret = remote_unittest_eventtrig(dev_handle,
  291. REMOTE_UNITTEST_CALLBACK_EVENT);
  292. if (ret) {
  293. errmask |= (1 << 21);
  294. printk(KERN_INFO "%s: failed to trigger callback (%d)\n",
  295. __func__, ret);
  296. } else
  297. while (block_until_cb)
  298. ;
  299. dalrpc_dealloc_cb(dev_handle, cb_handle);
  300. dalrpc_dealloc_event(dev_handle, event_handles[0]);
  301. dalrpc_dealloc_event(dev_handle, event_handles[1]);
  302. dalrpc_dealloc_event(dev_handle, event_handles[2]);
  303. /* test daldevice_detach */
  304. ret = daldevice_detach(dev_handle);
  305. if (ret) {
  306. errmask |= (1 << 22);
  307. printk(KERN_INFO "%s: failed to detach (%d)\n", __func__, ret);
  308. }
  309. printk(KERN_INFO "%s: remote_unittest complete\n", __func__);
  310. *val = errmask;
  311. return 0;
  312. }
  313. static int remotetest_modem_exec(void *data, u64 *val)
  314. {
  315. return remotetest_exec(DALRPC_DEST_MODEM, val);
  316. }
  317. static int remotetest_dsp_exec(void *data, u64 *val)
  318. {
  319. return remotetest_exec(DALRPC_DEST_QDSP, val);
  320. }
  321. DEFINE_SIMPLE_ATTRIBUTE(dal_modemtest_fops, remotetest_modem_exec,
  322. NULL, "%llu\n");
  323. DEFINE_SIMPLE_ATTRIBUTE(dal_dsptest_fops, remotetest_dsp_exec,
  324. NULL, "%llu\n");
  325. static int __init remotetest_init(void)
  326. {
  327. debugfs_dir_entry = debugfs_create_dir("dal", 0);
  328. if (IS_ERR(debugfs_dir_entry))
  329. return PTR_ERR(debugfs_dir_entry);
  330. debugfs_modem_entry = debugfs_create_file("modem_test", 0444,
  331. debugfs_dir_entry,
  332. NULL, &dal_modemtest_fops);
  333. if (IS_ERR(debugfs_modem_entry)) {
  334. debugfs_remove(debugfs_dir_entry);
  335. return PTR_ERR(debugfs_modem_entry);
  336. }
  337. debugfs_dsp_entry = debugfs_create_file("dsp_test", 0444,
  338. debugfs_dir_entry,
  339. NULL, &dal_dsptest_fops);
  340. if (IS_ERR(debugfs_dsp_entry)) {
  341. debugfs_remove(debugfs_modem_entry);
  342. debugfs_remove(debugfs_dir_entry);
  343. return PTR_ERR(debugfs_dsp_entry);
  344. }
  345. return 0;
  346. }
  347. static void __exit remotetest_exit(void)
  348. {
  349. debugfs_remove(debugfs_modem_entry);
  350. debugfs_remove(debugfs_dsp_entry);
  351. debugfs_remove(debugfs_dir_entry);
  352. }
  353. MODULE_LICENSE("GPL v2");
  354. MODULE_DESCRIPTION("Test for DAL RPC");
  355. MODULE_VERSION("1.0");
  356. module_init(remotetest_init);
  357. module_exit(remotetest_exit);