synx_debugfs_util.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/slab.h>
  6. #include <linux/random.h>
  7. #include <linux/vmalloc.h>
  8. #include "synx_debugfs.h"
  9. #include "synx_debugfs_util.h"
  10. #include "synx_util.h"
  11. #include "synx_private.h"
  12. #include "synx_global.h"
  13. #define MAX_CUSTOM_STATUS ((1UL << 32) - 1)
  14. char *synx_debugfs_util_get_state_name(u32 status)
  15. {
  16. char *state;
  17. if (status == 0)
  18. state = "INV";
  19. else if (status == 1)
  20. state = "ACT";
  21. else if (status == 2)
  22. state = "SUC";
  23. else if (status == 3)
  24. state = "ERR";
  25. else if (status == 4)
  26. state = "CAN";
  27. else if (status == 5)
  28. state = "EXT";
  29. else if (status == 6)
  30. state = "SSR";
  31. else if (status > 64 && status <= MAX_CUSTOM_STATUS)
  32. state = "CUS";
  33. else
  34. state = "???";
  35. return state;
  36. }
  37. static int synx_debugfs_util_get_client_data(struct synx_client *client)
  38. {
  39. if (IS_ERR_OR_NULL(client))
  40. return -SYNX_NOENT;
  41. kref_get(&client->refcount);
  42. return SYNX_SUCCESS;
  43. }
  44. static void synx_debugfs_util_put_client_data(struct synx_client *client)
  45. {
  46. if (!IS_ERR_OR_NULL(client))
  47. kref_put(&client->refcount, synx_client_destroy);
  48. }
  49. static int synx_debugfs_util_get_handle(struct synx_handle_coredata *handle_coredata)
  50. {
  51. if (IS_ERR_OR_NULL(handle_coredata))
  52. return -SYNX_NOENT;
  53. kref_get(&handle_coredata->refcount);
  54. return SYNX_SUCCESS;
  55. }
  56. static void synx_debugfs_util_put_handle(struct synx_handle_coredata *handle_coredata)
  57. {
  58. if (!IS_ERR_OR_NULL(handle_coredata))
  59. kref_put(&handle_coredata->refcount, synx_util_destroy_handle);
  60. }
  61. static int synx_debugfs_util_get_CSL_fence_entry(struct synx_entry_64 *entry)
  62. {
  63. if (IS_ERR_OR_NULL(entry))
  64. return -SYNX_NOENT;
  65. kref_get(&entry->refcount);
  66. return SYNX_SUCCESS;
  67. }
  68. static void synx_debugfs_util_put_CSL_fence_entry(struct synx_entry_64 *entry)
  69. {
  70. if (!IS_ERR_OR_NULL(entry))
  71. kref_put(&entry->refcount, synx_util_destroy_data);
  72. }
  73. bool synx_debugfs_util_is_valid_global_shared_memory_entry(struct synx_global_coredata *entry,
  74. u32 idx)
  75. {
  76. int i;
  77. if (!entry || entry->handle != idx)
  78. return false;
  79. if (entry->status || entry->handle || entry->refcount ||
  80. entry->num_child || entry->subscribers || entry->waiters)
  81. return true;
  82. for (i = 0; i < SYNX_GLOBAL_MAX_PARENTS; i++) {
  83. if (entry->parents[i])
  84. return true;
  85. }
  86. return false;
  87. }
  88. static bool synx_debugfs_util_is_valid_dma_handle_range(struct synx_fence_entry *fence_entry)
  89. {
  90. if ((fence_entry->g_handle >= lower_handle_id &&
  91. fence_entry->g_handle <= upper_handle_id) ||
  92. (fence_entry->l_handle >= lower_handle_id &&
  93. fence_entry->l_handle <= upper_handle_id))
  94. return true;
  95. return false;
  96. }
  97. static void synx_debugfs_util_print_map_column_values(char **cur,
  98. char **end,
  99. struct synx_map_entry *entry)
  100. {
  101. if (synx_columns & STATUS_COLUMN)
  102. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%s", synx_debugfs_util_get_state_name
  103. (synx_util_get_object_status(entry->synx_obj)));
  104. if (synx_columns & ID_COLUMN)
  105. SYNX_CONSOLE_LOG(*cur, *end, "\t\t %x", entry->key);
  106. if (synx_columns & REF_CNT_COLUMN)
  107. SYNX_CONSOLE_LOG(*cur, *end, "\t %d", kref_read(&entry->refcount));
  108. if (synx_columns & BOUND_COLUMN)
  109. SYNX_CONSOLE_LOG(*cur, *end, "\t %d", entry->synx_obj->num_bound_synxs);
  110. if (synx_columns & GLOBAL_IDX_COLUMN)
  111. SYNX_CONSOLE_LOG(*cur, *end, "\t\t %d", entry->synx_obj->global_idx);
  112. if (synx_columns & MAP_CNT_COLUMN)
  113. SYNX_CONSOLE_LOG(*cur, *end, "\t\t %d", entry->synx_obj->map_count);
  114. SYNX_CONSOLE_LOG(*cur, *end, "\n\t-------------------------------------");
  115. SYNX_CONSOLE_LOG(*cur, *end, "-----------------------------------------");
  116. SYNX_CONSOLE_LOG(*cur, *end, "-----------\n");
  117. }
  118. void synx_debugfs_util_print_hash_table(char **cur,
  119. char **end,
  120. bool is_global)
  121. {
  122. struct synx_map_entry *map_entry = NULL;
  123. struct synx_coredata *synx_obj = NULL;
  124. u32 key;
  125. if (is_global)
  126. SYNX_CONSOLE_LOG(*cur, *end,
  127. "\n\t-------------GLOBAL MAP TABLE------------\n");
  128. else
  129. SYNX_CONSOLE_LOG(*cur, *end,
  130. "\n\t-------------LOCAL MAP TABLE------------\n");
  131. SYNX_CONSOLE_LOG(*cur, *end, "\n\t\t");
  132. if (synx_columns & STATUS_COLUMN)
  133. SYNX_CONSOLE_LOG(*cur, *end, "| STATUS |");
  134. if (synx_columns & ID_COLUMN)
  135. SYNX_CONSOLE_LOG(*cur, *end, "| HANDLE |");
  136. if (synx_columns & REF_CNT_COLUMN)
  137. SYNX_CONSOLE_LOG(*cur, *end, "| REF CNT |");
  138. if (synx_columns & BOUND_COLUMN)
  139. SYNX_CONSOLE_LOG(*cur, *end, "| NUM BOUND |");
  140. if (synx_columns & GLOBAL_IDX_COLUMN)
  141. SYNX_CONSOLE_LOG(*cur, *end, "| GLOBAL INDEX |");
  142. if (synx_columns & MAP_CNT_COLUMN)
  143. SYNX_CONSOLE_LOG(*cur, *end, "| MAP CNT |");
  144. SYNX_CONSOLE_LOG(*cur, *end, "\n");
  145. for (key = lower_handle_id; key <= upper_handle_id; key++) {
  146. map_entry = synx_util_get_map_entry(key);
  147. if (IS_ERR_OR_NULL(map_entry) || IS_ERR_OR_NULL(map_entry->synx_obj) ||
  148. (is_global ^ synx_util_is_global_handle(key))) {
  149. synx_util_release_map_entry(map_entry);
  150. continue;
  151. }
  152. synx_obj = map_entry->synx_obj;
  153. synx_util_get_object(synx_obj);
  154. mutex_lock(&synx_obj->obj_lock);
  155. synx_debugfs_util_print_map_column_values(cur, end, map_entry);
  156. mutex_unlock(&synx_obj->obj_lock);
  157. synx_util_put_object(synx_obj);
  158. synx_util_release_map_entry(map_entry);
  159. }
  160. }
  161. void synx_debugfs_util_print_dma_fence(char **cur,
  162. char **end)
  163. {
  164. struct synx_fence_entry *curr = NULL;
  165. struct hlist_node *tmp;
  166. struct dma_fence *fence_entry = NULL;
  167. u32 map_itr;
  168. SYNX_CONSOLE_LOG(*cur, *end, "\n\t-------------DMA FENCE MAP TABLE------------\n");
  169. if (synx_columns & FENCE_COLUMN)
  170. SYNX_CONSOLE_LOG(*cur, *end, "| DMA FENCE |");
  171. if (synx_columns & STATUS_COLUMN)
  172. SYNX_CONSOLE_LOG(*cur, *end, "| STATUS |");
  173. if (synx_columns & ID_COLUMN)
  174. SYNX_CONSOLE_LOG(*cur, *end, "| HANDLE |");
  175. if (synx_columns & REF_CNT_COLUMN)
  176. SYNX_CONSOLE_LOG(*cur, *end, "| REF CNT |");
  177. SYNX_CONSOLE_LOG(*cur, *end, "\n");
  178. spin_lock_bh(&synx_dev->native->fence_map_lock);
  179. hash_for_each_safe(synx_dev->native->fence_map, map_itr, tmp, curr, node) {
  180. if (IS_ERR_OR_NULL(curr))
  181. continue;
  182. fence_entry = (struct dma_fence *)curr->key;
  183. dma_fence_get(fence_entry);
  184. if (synx_debugfs_util_is_valid_dma_handle_range(curr)) {
  185. if (synx_columns & FENCE_COLUMN)
  186. SYNX_CONSOLE_LOG(*cur, *end, "\t%p", fence_entry);
  187. if (synx_columns & STATUS_COLUMN)
  188. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%s",
  189. synx_debugfs_util_get_state_name
  190. (__fence_state(fence_entry, false)));
  191. if (synx_columns & ID_COLUMN) {
  192. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", curr->g_handle);
  193. SYNX_CONSOLE_LOG(*cur, *end, "\t%d", curr->l_handle);
  194. }
  195. if (synx_columns & REF_CNT_COLUMN)
  196. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d",
  197. kref_read(&(fence_entry)->refcount));
  198. SYNX_CONSOLE_LOG(*cur, *end,
  199. "\n\t-------------------------------------");
  200. SYNX_CONSOLE_LOG(*cur, *end,
  201. "-----------------------------------------");
  202. SYNX_CONSOLE_LOG(*cur, *end, "-----------\n");
  203. }
  204. dma_fence_put(fence_entry);
  205. }
  206. spin_unlock_bh(&synx_dev->native->fence_map_lock);
  207. }
  208. void synx_debugfs_util_print_csl_fence(char **cur,
  209. char **end)
  210. {
  211. u32 itr, rc = SYNX_SUCCESS;
  212. struct synx_entry_64 *curr = NULL;
  213. struct hlist_node *tmp;
  214. struct synx_map_entry *map_entry = NULL;
  215. SYNX_CONSOLE_LOG(*cur, *end, "\n\t------------- CSL FENCE MAP TABLE------------\n");
  216. if (synx_columns & FENCE_COLUMN)
  217. SYNX_CONSOLE_LOG(*cur, *end, "| CSL FENCE |");
  218. if (synx_columns & STATUS_COLUMN)
  219. SYNX_CONSOLE_LOG(*cur, *end, "| STATUS |");
  220. if (synx_columns & ID_COLUMN)
  221. SYNX_CONSOLE_LOG(*cur, *end, "| HANDLE |");
  222. if (synx_columns & REF_CNT_COLUMN)
  223. SYNX_CONSOLE_LOG(*cur, *end, "| REF CNT |");
  224. SYNX_CONSOLE_LOG(*cur, *end, "\n");
  225. spin_lock_bh(&synx_dev->native->csl_map_lock);
  226. hash_for_each_safe(synx_dev->native->csl_fence_map, itr, tmp, curr, node) {
  227. rc = synx_debugfs_util_get_CSL_fence_entry(curr);
  228. if (rc) {
  229. spin_unlock_bh(&synx_dev->native->csl_map_lock);
  230. return;
  231. }
  232. if (curr->data[0] >= lower_handle_id && curr->data[0] <= upper_handle_id) {
  233. if (synx_columns & FENCE_COLUMN)
  234. SYNX_CONSOLE_LOG(*cur, *end, "%p", curr->key);
  235. if (synx_columns & STATUS_COLUMN) {
  236. map_entry = synx_util_get_map_entry(curr->data[0]);
  237. if (!IS_ERR_OR_NULL(map_entry) &&
  238. !IS_ERR_OR_NULL(map_entry->synx_obj)) {
  239. SYNX_CONSOLE_LOG(*cur, *end, "\t%s",
  240. synx_debugfs_util_get_state_name
  241. (synx_util_get_object_status(map_entry->synx_obj)));
  242. synx_util_release_map_entry(map_entry);
  243. }
  244. } //TODO : Update status field of CSL Fence with updated structure
  245. if (synx_columns & ID_COLUMN)
  246. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", curr->data[0]);
  247. if (synx_columns & REF_CNT_COLUMN)
  248. SYNX_CONSOLE_LOG(*cur, *end, "\t%d", kref_read(&curr->refcount));
  249. SYNX_CONSOLE_LOG(*cur, *end, "\n\t-------------------------------------");
  250. SYNX_CONSOLE_LOG(*cur, *end, "-----------------------------------------");
  251. SYNX_CONSOLE_LOG(*cur, *end, "-----------\n");
  252. }
  253. synx_debugfs_util_put_CSL_fence_entry(curr);
  254. }
  255. spin_unlock_bh(&synx_dev->native->csl_map_lock);
  256. }
  257. void synx_debugfs_util_print_global_shared_memory(char **cur,
  258. char **end)
  259. {
  260. struct synx_global_coredata synx_global_entry;
  261. u32 i, idx;
  262. /* Column heading set up*/
  263. SYNX_CONSOLE_LOG(*cur, *end,
  264. "\n\t ------------- GLOBAL SHARED MEMORY ------------\n\t");
  265. if (synx_columns & STATUS_COLUMN)
  266. SYNX_CONSOLE_LOG(*cur, *end, "| STATUS |");
  267. if (synx_columns & ID_COLUMN)
  268. SYNX_CONSOLE_LOG(*cur, *end, "| HANDLE |");
  269. if (synx_columns & REF_CNT_COLUMN)
  270. SYNX_CONSOLE_LOG(*cur, *end, "| REF CNT |");
  271. if (synx_columns & NUM_CHILD_COLUMN)
  272. SYNX_CONSOLE_LOG(*cur, *end, "| NUM CHILD |");
  273. if (synx_columns & SUBSCRIBERS_COLUMN)
  274. SYNX_CONSOLE_LOG(*cur, *end, "| SUBSCRIBERS |");
  275. if (synx_columns & WAITERS_COLUMN)
  276. SYNX_CONSOLE_LOG(*cur, *end, "| WAITERS |");
  277. if (synx_columns & PARENTS_COLUMN)
  278. SYNX_CONSOLE_LOG(*cur, *end, "| PARENTS |");
  279. SYNX_CONSOLE_LOG(*cur, *end, "\n");
  280. for (idx = lower_handle_id ; idx <= upper_handle_id ; idx++) {
  281. if (!synx_fetch_global_shared_memory_handle_details(idx, &synx_global_entry) ||
  282. !synx_debugfs_util_is_valid_global_shared_memory_entry(&synx_global_entry, idx))
  283. continue;
  284. if (synx_columns & STATUS_COLUMN)
  285. SYNX_CONSOLE_LOG(*cur, *end, "\t %s",
  286. synx_debugfs_util_get_state_name(synx_global_entry.status));
  287. if (synx_columns & ID_COLUMN)
  288. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%x", synx_global_entry.handle);
  289. if (synx_columns & REF_CNT_COLUMN)
  290. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", synx_global_entry.refcount);
  291. if (synx_columns & NUM_CHILD_COLUMN)
  292. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", synx_global_entry.num_child);
  293. if (synx_columns & SUBSCRIBERS_COLUMN)
  294. SYNX_CONSOLE_LOG(*cur, *end, "\t%d", synx_global_entry.subscribers);
  295. if (synx_columns & WAITERS_COLUMN)
  296. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", synx_global_entry.waiters);
  297. if (synx_columns & PARENTS_COLUMN) {
  298. for (i = 0; i < SYNX_GLOBAL_MAX_PARENTS; i++) {
  299. if (synx_global_entry.parents[i])
  300. SYNX_CONSOLE_LOG(*cur, *end, " %2u",
  301. synx_global_entry.parents[i]);
  302. }
  303. }
  304. SYNX_CONSOLE_LOG(*cur, *end, "\n\t-------------------------------------");
  305. SYNX_CONSOLE_LOG(*cur, *end, "-----------------------------------------");
  306. SYNX_CONSOLE_LOG(*cur, *end, "-----------\n");
  307. }
  308. }
  309. void synx_debugfs_util_print_client_table(char **cur,
  310. char **end)
  311. {
  312. u32 rc = SYNX_SUCCESS;
  313. struct synx_client *curr;
  314. struct hlist_node *tmp;
  315. struct hlist_node *tmp2;
  316. struct synx_handle_coredata *curr2 = NULL;
  317. u32 client_map_itr, handle_map_itr;
  318. SYNX_CONSOLE_LOG(*cur, *end, "\n\t ------------- CLIENT MAP TABLE------------\n");
  319. if (synx_columns & CLIENT_ID_COLUMN)
  320. SYNX_CONSOLE_LOG(*cur, *end, "| CLIENT ID |");
  321. if (synx_columns & REF_CNT_COLUMN)
  322. SYNX_CONSOLE_LOG(*cur, *end, "|CLIENT REF COUNT|");
  323. if (synx_columns & ID_COLUMN)
  324. SYNX_CONSOLE_LOG(*cur, *end, "| HANDLE ID |");
  325. if (synx_columns & REF_CNT_COLUMN)
  326. SYNX_CONSOLE_LOG(*cur, *end, "|REF COUNT|");
  327. if (synx_columns & REL_CNT_COLUMN)
  328. SYNX_CONSOLE_LOG(*cur, *end, "|REL COUNT|");
  329. SYNX_CONSOLE_LOG(*cur, *end, "\n");
  330. spin_lock_bh(&synx_dev->native->metadata_map_lock);
  331. hash_for_each_safe(synx_dev->native->client_metadata_map,
  332. client_map_itr, tmp, curr, node) {
  333. rc = synx_debugfs_util_get_client_data(curr);
  334. if (rc)
  335. goto bail;
  336. spin_lock_bh(&curr->handle_map_lock);
  337. hash_for_each_safe(curr->handle_map,
  338. handle_map_itr, tmp2, curr2, node) {
  339. rc = synx_debugfs_util_get_handle(curr2);
  340. if (rc) {
  341. spin_unlock_bh(&curr->handle_map_lock);
  342. synx_debugfs_util_put_client_data(curr);
  343. goto bail;
  344. }
  345. if (curr2->key >= lower_handle_id && curr2->key <= upper_handle_id) {
  346. if (synx_columns & CLIENT_ID_COLUMN)
  347. SYNX_CONSOLE_LOG(*cur, *end, "\t%u", curr->id);
  348. if (synx_columns & REF_CNT_COLUMN)
  349. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d",
  350. kref_read(&curr->refcount));
  351. if (synx_columns & ID_COLUMN)
  352. SYNX_CONSOLE_LOG(*cur, *end, "\t%d", curr2->key);
  353. if (synx_columns & REF_CNT_COLUMN)
  354. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d",
  355. kref_read(&curr2->refcount));
  356. if (synx_columns & REL_CNT_COLUMN)
  357. SYNX_CONSOLE_LOG(*cur, *end, "\t\t%d", curr2->rel_count);
  358. SYNX_CONSOLE_LOG(*cur, *end,
  359. "\n\t-------------------------------------");
  360. SYNX_CONSOLE_LOG(*cur, *end,
  361. "-----------------------------------------");
  362. SYNX_CONSOLE_LOG(*cur, *end, "-----------\n");
  363. }
  364. synx_debugfs_util_put_handle(curr2);
  365. }
  366. spin_unlock_bh(&curr->handle_map_lock);
  367. synx_debugfs_util_put_client_data(curr);
  368. }
  369. bail:
  370. spin_unlock_bh(&synx_dev->native->metadata_map_lock);
  371. }
  372. void synx_debugfs_util_load_help_content(char **cur,
  373. char **end)
  374. {
  375. SYNX_CONSOLE_LOG(*cur, *end,
  376. "\n\n\tSynx tables Supported for debugfs with the column names:");
  377. SYNX_CONSOLE_LOG(*cur, *end,
  378. "\n\n\tGLOBAL/LOCAL MAP COLUMNS : STATUS, ID, REF_CNT, BOUND,");
  379. SYNX_CONSOLE_LOG(*cur, *end, "\tGLOBAL INDEX, MAP CNT\n");
  380. SYNX_CONSOLE_LOG(*cur, *end,
  381. "\n\tGLOBAL SHARED MEMORY COLUMNS : STATUS, ID,");
  382. SYNX_CONSOLE_LOG(*cur, *end,
  383. "REF_CNT, NUM_CHILD, \tSUBSCRIBERS, WAITERS, PARENTS");
  384. SYNX_CONSOLE_LOG(*cur, *end,
  385. "\n\n\tCLIENT MAP COLUMNS : CLIENT_ID, REF_CNT, REL_CNT, ID");
  386. SYNX_CONSOLE_LOG(*cur, *end,
  387. "\n\n\tDMA FENCE COLUMNS: STATUS, ID, REF_CNT, DMA FENCE");
  388. SYNX_CONSOLE_LOG(*cur, *end, "\n\n\tINSTRUCTIONS TO BE FOLLOWED:");
  389. SYNX_CONSOLE_LOG(*cur, *end,
  390. "\n\n\tTO PRINT CHOOSE THE COLUMNS ACCORDINGLY AND ADD UP THE");
  391. SYNX_CONSOLE_LOG(*cur, *end,
  392. "\tHEXADECIMAL VALUES & PASS THE ADDED UP VALUES FOR COLUMN ALONG");
  393. SYNX_CONSOLE_LOG(*cur, *end, "WITH TABLE SELECTION VALUE AS SHOWN BELOW:");
  394. SYNX_CONSOLE_LOG(*cur, *end,
  395. "\n\tSet Below Values for Column selection\n");
  396. SYNX_CONSOLE_LOG(*cur, *end, "\n\n\tNAME_COLUMN = 0x0001");
  397. SYNX_CONSOLE_LOG(*cur, *end, "\n\tID_COLUMN = 0x0002");
  398. SYNX_CONSOLE_LOG(*cur, *end, "\n\tBOUND_COLUMN = 0x0004");
  399. SYNX_CONSOLE_LOG(*cur, *end, "\n\tSTATUS_COLUMN = 0x0008");
  400. SYNX_CONSOLE_LOG(*cur, *end, "\n\tFENCE_COLUMN = 0x0010");
  401. SYNX_CONSOLE_LOG(*cur, *end, "\n\tCOREDATA_COLUMN = 0x0020");
  402. SYNX_CONSOLE_LOG(*cur, *end, "\n\tGLOBAL_IDX_COLUMN = 0x0040");
  403. SYNX_CONSOLE_LOG(*cur, *end, "\n\tREL_CNT_COLUMN = 0x0080");
  404. SYNX_CONSOLE_LOG(*cur, *end, "\n\tMAP_CNT_COLUMN = 0x0100");
  405. SYNX_CONSOLE_LOG(*cur, *end, "\n\tREF_CNT_COLUMN = 0x0200");
  406. SYNX_CONSOLE_LOG(*cur, *end, "\n\tNUM_CHILD_COLUMN = 0x0400");
  407. SYNX_CONSOLE_LOG(*cur, *end, "\n\tSUBSCRIBERS_COLUMN= 0x0800");
  408. SYNX_CONSOLE_LOG(*cur, *end, "\n\tWAITERS_COLUMN = 0x1000");
  409. SYNX_CONSOLE_LOG(*cur, *end, "\n\tPARENTS_COLUMN = 0x2000");
  410. SYNX_CONSOLE_LOG(*cur, *end, "\n\tCLIENT_ID_COLUMN = 0x4000");
  411. SYNX_CONSOLE_LOG(*cur, *end,
  412. "\n\n\tSet Below Values for Table selection\n");
  413. SYNX_CONSOLE_LOG(*cur, *end, "\n\tLOCAL_HASHTABLE = 0x00010000");
  414. SYNX_CONSOLE_LOG(*cur, *end, "\n\tGLOBAL_HASHTABLE = 0x00020000");
  415. SYNX_CONSOLE_LOG(*cur, *end, "\n\tCLIENT_HASHTABLE = 0x00040000");
  416. SYNX_CONSOLE_LOG(*cur, *end, "\n\tGLOBAL_SHARED_MEM = 0x00080000");
  417. SYNX_CONSOLE_LOG(*cur, *end, "\n\tDMA_FENCE_MAP = 0x00100000\n");
  418. SYNX_CONSOLE_LOG(*cur, *end,
  419. "\n\tExample : To select Global map & all its columns :");
  420. SYNX_CONSOLE_LOG(*cur, *end, "\n\t echo 0x2034E>column_level");
  421. SYNX_CONSOLE_LOG(*cur, *end, "\n\t Last four digits in hexadecimal flag");
  422. SYNX_CONSOLE_LOG(*cur, *end, " is dedicated for setting columns,");
  423. SYNX_CONSOLE_LOG(*cur, *end,
  424. "\tuser can even set \"FFFF\" to set all columns");
  425. SYNX_CONSOLE_LOG(*cur, *end,
  426. "\n\t Instead of passing 0x2034E, \tuser can even pass");
  427. SYNX_CONSOLE_LOG(*cur, *end, " 0x2FFFF to fetch the same");
  428. SYNX_CONSOLE_LOG(*cur, *end,
  429. "\n\n\tUser can set Handle Range with echo command as shown below\n");
  430. SYNX_CONSOLE_LOG(*cur, *end, "\n\techo 1048577-1048580>synx_table");
  431. SYNX_CONSOLE_LOG(*cur, *end,
  432. "\n\tFor single handle : echo \"1048577\">synx_table");
  433. SYNX_CONSOLE_LOG(*cur, *end,
  434. "\n\tHandle range can be set in hexadecimal values as shown below:");
  435. SYNX_CONSOLE_LOG(*cur, *end, "\n\techo 0x100001-10000f>synx_table");
  436. SYNX_CONSOLE_LOG(*cur, *end,
  437. "\n\tSingle handle : echo 0x100001>synx_table");
  438. SYNX_CONSOLE_LOG(*cur, *end,
  439. "\n\n\tTo print info on console : cat synx_table");
  440. SYNX_CONSOLE_LOG(*cur, *end, "\n\n\tHandle states :");
  441. SYNX_CONSOLE_LOG(*cur, *end, "\n\tACT : SYNX_STATE_ACTIVE");
  442. SYNX_CONSOLE_LOG(*cur, *end, "\n\tINV : SYNX_STATE_INVALID");
  443. SYNX_CONSOLE_LOG(*cur, *end, "\n\tERR : SYNX_STATE_SIGNALED_ERROR");
  444. SYNX_CONSOLE_LOG(*cur, *end, "\n\tSUC : SYNX_STATE_SIGNALED_SUCCESS");
  445. SYNX_CONSOLE_LOG(*cur, *end, "\n\tCAN : SYNX_STATE_SIGNALED_CANCELLED");
  446. SYNX_CONSOLE_LOG(*cur, *end, "\n\tEXT : SYNX_STATE_SIGNALED_EXTERNAL");
  447. SYNX_CONSOLE_LOG(*cur, *end, "\n\tSSR : SYNX_STATE_SIGNALED_SSR\n");
  448. SYNX_CONSOLE_LOG(*cur, *end, "\n\tCUS : CUSTOM SIGNAL");
  449. SYNX_CONSOLE_LOG(*cur, *end, "\n\t??? : UNKNOWN / UNDEFINED");
  450. SYNX_CONSOLE_LOG(*cur, *end, "\n\n\tAdditional information:");
  451. SYNX_CONSOLE_LOG(*cur, *end,
  452. "\n\tNo need to set handle ID range and column or table selection");
  453. SYNX_CONSOLE_LOG(*cur, *end, "\tvalues again if once it is already set");
  454. SYNX_CONSOLE_LOG(*cur, *end,
  455. "\n\tSimply using cat synx_table command user can print the data");
  456. SYNX_CONSOLE_LOG(*cur, *end, "\tfor same table with same set of columns");
  457. SYNX_CONSOLE_LOG(*cur, *end, "\n\tTo print all tables and all");
  458. SYNX_CONSOLE_LOG(*cur, *end, "columns set column level value to 0x1fffff");
  459. SYNX_CONSOLE_LOG(*cur, *end,
  460. "\n\tCurrently we do not support CSL fence\n\n");
  461. }