kgsl_debugfs.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /* Copyright (c) 2002,2008-2014,2020, 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. #include <linux/module.h>
  14. #include <linux/debugfs.h>
  15. #include "kgsl.h"
  16. #include "kgsl_device.h"
  17. #include "kgsl_sharedmem.h"
  18. /*default log levels is error for everything*/
  19. #define KGSL_LOG_LEVEL_MAX 7
  20. struct dentry *kgsl_debugfs_dir;
  21. static struct dentry *pm_d_debugfs;
  22. struct dentry *proc_d_debugfs;
  23. static int pm_dump_set(void *data, u64 val)
  24. {
  25. struct kgsl_device *device = data;
  26. if (val) {
  27. kgsl_mutex_lock(&device->mutex, &device->mutex_owner);
  28. kgsl_postmortem_dump(device, 1);
  29. kgsl_mutex_unlock(&device->mutex, &device->mutex_owner);
  30. }
  31. return 0;
  32. }
  33. DEFINE_SIMPLE_ATTRIBUTE(pm_dump_fops,
  34. NULL,
  35. pm_dump_set, "%llu\n");
  36. static int pm_regs_enabled_set(void *data, u64 val)
  37. {
  38. struct kgsl_device *device = data;
  39. device->pm_regs_enabled = val ? 1 : 0;
  40. return 0;
  41. }
  42. static int pm_regs_enabled_get(void *data, u64 *val)
  43. {
  44. struct kgsl_device *device = data;
  45. *val = device->pm_regs_enabled;
  46. return 0;
  47. }
  48. static int pm_ib_enabled_set(void *data, u64 val)
  49. {
  50. struct kgsl_device *device = data;
  51. device->pm_ib_enabled = val ? 1 : 0;
  52. return 0;
  53. }
  54. static int pm_ib_enabled_get(void *data, u64 *val)
  55. {
  56. struct kgsl_device *device = data;
  57. *val = device->pm_ib_enabled;
  58. return 0;
  59. }
  60. static int pm_enabled_set(void *data, u64 val)
  61. {
  62. struct kgsl_device *device = data;
  63. device->pm_dump_enable = val;
  64. return 0;
  65. }
  66. static int pm_enabled_get(void *data, u64 *val)
  67. {
  68. struct kgsl_device *device = data;
  69. *val = device->pm_dump_enable;
  70. return 0;
  71. }
  72. DEFINE_SIMPLE_ATTRIBUTE(pm_regs_enabled_fops,
  73. pm_regs_enabled_get,
  74. pm_regs_enabled_set, "%llu\n");
  75. DEFINE_SIMPLE_ATTRIBUTE(pm_ib_enabled_fops,
  76. pm_ib_enabled_get,
  77. pm_ib_enabled_set, "%llu\n");
  78. DEFINE_SIMPLE_ATTRIBUTE(pm_enabled_fops,
  79. pm_enabled_get,
  80. pm_enabled_set, "%llu\n");
  81. static inline int kgsl_log_set(unsigned int *log_val, void *data, u64 val)
  82. {
  83. *log_val = min((unsigned int)val, (unsigned int)KGSL_LOG_LEVEL_MAX);
  84. return 0;
  85. }
  86. #define KGSL_DEBUGFS_LOG(__log) \
  87. static int __log ## _set(void *data, u64 val) \
  88. { \
  89. struct kgsl_device *device = data; \
  90. return kgsl_log_set(&device->__log, data, val); \
  91. } \
  92. static int __log ## _get(void *data, u64 *val) \
  93. { \
  94. struct kgsl_device *device = data; \
  95. *val = device->__log; \
  96. return 0; \
  97. } \
  98. DEFINE_SIMPLE_ATTRIBUTE(__log ## _fops, \
  99. __log ## _get, __log ## _set, "%llu\n"); \
  100. KGSL_DEBUGFS_LOG(drv_log);
  101. KGSL_DEBUGFS_LOG(cmd_log);
  102. KGSL_DEBUGFS_LOG(ctxt_log);
  103. KGSL_DEBUGFS_LOG(mem_log);
  104. KGSL_DEBUGFS_LOG(pwr_log);
  105. void kgsl_device_debugfs_init(struct kgsl_device *device)
  106. {
  107. if (kgsl_debugfs_dir && !IS_ERR(kgsl_debugfs_dir))
  108. device->d_debugfs = debugfs_create_dir(device->name,
  109. kgsl_debugfs_dir);
  110. if (!device->d_debugfs || IS_ERR(device->d_debugfs))
  111. return;
  112. debugfs_create_file("log_level_cmd", 0644, device->d_debugfs, device,
  113. &cmd_log_fops);
  114. debugfs_create_file("log_level_ctxt", 0644, device->d_debugfs, device,
  115. &ctxt_log_fops);
  116. debugfs_create_file("log_level_drv", 0644, device->d_debugfs, device,
  117. &drv_log_fops);
  118. debugfs_create_file("log_level_mem", 0644, device->d_debugfs, device,
  119. &mem_log_fops);
  120. debugfs_create_file("log_level_pwr", 0644, device->d_debugfs, device,
  121. &pwr_log_fops);
  122. /* Create postmortem dump control files */
  123. pm_d_debugfs = debugfs_create_dir("postmortem", device->d_debugfs);
  124. if (IS_ERR(pm_d_debugfs))
  125. return;
  126. debugfs_create_file("dump", 0600, pm_d_debugfs, device,
  127. &pm_dump_fops);
  128. debugfs_create_file("regs_enabled", 0644, pm_d_debugfs, device,
  129. &pm_regs_enabled_fops);
  130. debugfs_create_file("ib_enabled", 0644, pm_d_debugfs, device,
  131. &pm_ib_enabled_fops);
  132. debugfs_create_file("enable", 0644, pm_d_debugfs, device,
  133. &pm_enabled_fops);
  134. }
  135. static const char * const memtype_strings[] = {
  136. "gpumem",
  137. "pmem",
  138. "ashmem",
  139. "usermap",
  140. "ion",
  141. };
  142. static const char *memtype_str(int memtype)
  143. {
  144. if (memtype < ARRAY_SIZE(memtype_strings))
  145. return memtype_strings[memtype];
  146. return "unknown";
  147. }
  148. static char get_alignflag(const struct kgsl_memdesc *m)
  149. {
  150. int align = kgsl_memdesc_get_align(m);
  151. if (align >= ilog2(SZ_1M))
  152. return 'L';
  153. else if (align >= ilog2(SZ_64K))
  154. return 'l';
  155. return '-';
  156. }
  157. static char get_cacheflag(const struct kgsl_memdesc *m)
  158. {
  159. static const char table[] = {
  160. [KGSL_CACHEMODE_WRITECOMBINE] = '-',
  161. [KGSL_CACHEMODE_UNCACHED] = 'u',
  162. [KGSL_CACHEMODE_WRITEBACK] = 'b',
  163. [KGSL_CACHEMODE_WRITETHROUGH] = 't',
  164. };
  165. return table[kgsl_memdesc_get_cachemode(m)];
  166. }
  167. static void print_mem_entry(struct seq_file *s, struct kgsl_mem_entry *entry)
  168. {
  169. char flags[7];
  170. char usage[16];
  171. struct kgsl_memdesc *m = &entry->memdesc;
  172. flags[0] = kgsl_memdesc_is_global(m) ? 'g' : '-';
  173. flags[1] = m->flags & KGSL_MEMFLAGS_GPUREADONLY ? 'r' : '-';
  174. flags[2] = get_alignflag(m);
  175. flags[3] = get_cacheflag(m);
  176. flags[4] = kgsl_memdesc_use_cpu_map(m) ? 'p' : '-';
  177. flags[5] = (m->useraddr) ? 'Y' : 'N';
  178. flags[6] = '\0';
  179. kgsl_get_memory_usage(usage, sizeof(usage), m->flags);
  180. seq_printf(s, "%pK %pK %8zd %5d %6s %10s %16s %5d\n",
  181. (unsigned long *) m->gpuaddr,
  182. (unsigned long *) m->useraddr,
  183. m->size, entry->id, flags,
  184. memtype_str(entry->memtype), usage, m->sglen);
  185. }
  186. struct process_mem_entry {
  187. struct kgsl_process_private *pprivate;
  188. int unbound;
  189. };
  190. static struct kgsl_mem_entry *process_mem_seq_find(
  191. struct seq_file *s, void *v, loff_t l)
  192. {
  193. struct process_mem_entry *e = s->private;
  194. struct kgsl_process_private *private = e->pprivate;
  195. struct kgsl_mem_entry *entry = v;
  196. struct rb_node *node = NULL;
  197. int id = 0;
  198. l--;
  199. spin_lock(&private->mem_lock);
  200. if (entry == SEQ_START_TOKEN) {
  201. node = rb_first(&private->mem_rb);
  202. e->unbound = 0;
  203. } else if (!e->unbound) {
  204. node = rb_next(&entry->node);
  205. } else {
  206. id = entry->id + 1;
  207. }
  208. for (; node; node = rb_next(node)) {
  209. if (l-- == 0) {
  210. entry = rb_entry(node, struct kgsl_mem_entry, node);
  211. if (kgsl_mem_entry_get(entry)) {
  212. e->unbound = 0;
  213. goto found;
  214. }
  215. l++;
  216. }
  217. }
  218. for (entry = idr_get_next(&private->mem_idr, &id); entry;
  219. id++, entry = idr_get_next(&private->mem_idr, &id)) {
  220. if (!entry->memdesc.gpuaddr && (l-- == 0)) {
  221. if (kgsl_mem_entry_get(entry)) {
  222. e->unbound = 1;
  223. goto found;
  224. }
  225. l++;
  226. }
  227. }
  228. entry = NULL;
  229. found:
  230. spin_unlock(&private->mem_lock);
  231. if (v != SEQ_START_TOKEN)
  232. kgsl_mem_entry_put(v);
  233. return entry;
  234. }
  235. static void *process_mem_seq_start(struct seq_file *s, loff_t *pos)
  236. {
  237. loff_t l = *pos;
  238. if (l == 0)
  239. return SEQ_START_TOKEN;
  240. else
  241. return process_mem_seq_find(s, SEQ_START_TOKEN, l);
  242. }
  243. static void *process_mem_seq_next(struct seq_file *s, void *v, loff_t *pos)
  244. {
  245. ++*pos;
  246. return process_mem_seq_find(s, v, 1);
  247. }
  248. static void process_mem_seq_stop(struct seq_file *s, void *v)
  249. {
  250. if (v && v != SEQ_START_TOKEN)
  251. kgsl_mem_entry_put(v);
  252. }
  253. static int process_mem_seq_show(struct seq_file *s, void *v)
  254. {
  255. if (v == SEQ_START_TOKEN)
  256. seq_printf(s, "%8s %8s %8s %5s %6s %10s %16s %5s\n",
  257. "gpuaddr", "useraddr", "size", "id", "flags", "type",
  258. "usage", "sglen");
  259. else
  260. print_mem_entry(s, v);
  261. return 0;
  262. }
  263. static const struct seq_operations process_mem_seq_ops = {
  264. .start = process_mem_seq_start,
  265. .next = process_mem_seq_next,
  266. .stop = process_mem_seq_stop,
  267. .show = process_mem_seq_show,
  268. };
  269. static int process_mem_open(struct inode *inode, struct file *file)
  270. {
  271. int ret;
  272. pid_t pid = (pid_t) (unsigned long) inode->i_private;
  273. struct kgsl_process_private *private = NULL;
  274. private = kgsl_process_private_find(pid);
  275. if (!private)
  276. return -ENODEV;
  277. ret = seq_open_private(file, &process_mem_seq_ops,
  278. sizeof(struct process_mem_entry));
  279. if (ret) {
  280. kgsl_process_private_put(private);
  281. } else {
  282. struct seq_file *s = file->private_data;
  283. struct process_mem_entry *e = s->private;
  284. e->pprivate = private;
  285. }
  286. return ret;
  287. }
  288. static int process_mem_release(struct inode *inode, struct file *file)
  289. {
  290. struct seq_file *s = file->private_data;
  291. struct process_mem_entry *e = s->private;
  292. struct kgsl_process_private *private = e->pprivate;
  293. if (private)
  294. kgsl_process_private_put(private);
  295. return seq_release_private(inode, file);
  296. }
  297. static const struct file_operations process_mem_fops = {
  298. .open = process_mem_open,
  299. .read = seq_read,
  300. .llseek = seq_lseek,
  301. .release = process_mem_release,
  302. };
  303. /**
  304. * kgsl_process_init_debugfs() - Initialize debugfs for a process
  305. * @private: Pointer to process private structure created for the process
  306. *
  307. * @returns: 0 on success, error code otherwise
  308. *
  309. * kgsl_process_init_debugfs() is called at the time of creating the
  310. * process struct when a process opens kgsl device for the first time.
  311. * The function creates the debugfs files for the process. If debugfs is
  312. * disabled in the kernel, we ignore that error and return as successful.
  313. */
  314. int
  315. kgsl_process_init_debugfs(struct kgsl_process_private *private)
  316. {
  317. unsigned char name[16];
  318. int ret = 0;
  319. struct dentry *dentry;
  320. snprintf(name, sizeof(name), "%d", pid_nr(private->pid));
  321. private->debug_root = debugfs_create_dir(name, proc_d_debugfs);
  322. if (!private->debug_root)
  323. return -EINVAL;
  324. /*
  325. * debugfs_create_dir() and debugfs_create_file() both
  326. * return -ENODEV if debugfs is disabled in the kernel.
  327. * We make a distinction between these two functions
  328. * failing and debugfs being disabled in the kernel.
  329. * In the first case, we abort process private struct
  330. * creation, in the second we continue without any changes.
  331. * So if debugfs is disabled in kernel, return as
  332. * success.
  333. */
  334. dentry = debugfs_create_file("mem", 0444, private->debug_root,
  335. (void *) ((unsigned long) pid_nr(private->pid)),
  336. &process_mem_fops);
  337. if (IS_ERR(dentry)) {
  338. ret = PTR_ERR(dentry);
  339. if (ret == -ENODEV)
  340. ret = 0;
  341. }
  342. return ret;
  343. }
  344. void kgsl_core_debugfs_init(void)
  345. {
  346. kgsl_debugfs_dir = debugfs_create_dir("kgsl", 0);
  347. proc_d_debugfs = debugfs_create_dir("proc", kgsl_debugfs_dir);
  348. }
  349. void kgsl_core_debugfs_close(void)
  350. {
  351. debugfs_remove_recursive(kgsl_debugfs_dir);
  352. }