debugfs.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * debugfs.c - DesignWare USB3 DRD Controller DebugFS file
  4. *
  5. * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
  6. *
  7. * Authors: Felipe Balbi <balbi@ti.com>,
  8. * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/slab.h>
  12. #include <linux/ptrace.h>
  13. #include <linux/types.h>
  14. #include <linux/spinlock.h>
  15. #include <linux/debugfs.h>
  16. #include <linux/seq_file.h>
  17. #include <linux/delay.h>
  18. #include <linux/uaccess.h>
  19. #include <linux/usb/ch9.h>
  20. #include "core.h"
  21. #include "gadget.h"
  22. #include "io.h"
  23. #include "debug.h"
  24. #define DWC3_LSP_MUX_UNSELECTED 0xfffff
  25. #define dump_register(nm) \
  26. { \
  27. .name = __stringify(nm), \
  28. .offset = DWC3_ ##nm, \
  29. }
  30. #define dump_ep_register_set(n) \
  31. { \
  32. .name = "DEPCMDPAR2("__stringify(n)")", \
  33. .offset = DWC3_DEPCMDPAR2(n), \
  34. }, \
  35. { \
  36. .name = "DEPCMDPAR1("__stringify(n)")", \
  37. .offset = DWC3_DEPCMDPAR1(n), \
  38. }, \
  39. { \
  40. .name = "DEPCMDPAR0("__stringify(n)")", \
  41. .offset = DWC3_DEPCMDPAR0(n), \
  42. }, \
  43. { \
  44. .name = "DEPCMD("__stringify(n)")", \
  45. .offset = DWC3_DEPCMD(n), \
  46. }
  47. static const struct debugfs_reg32 dwc3_regs[] = {
  48. dump_register(GSBUSCFG0),
  49. dump_register(GSBUSCFG1),
  50. dump_register(GTXTHRCFG),
  51. dump_register(GRXTHRCFG),
  52. dump_register(GCTL),
  53. dump_register(GEVTEN),
  54. dump_register(GSTS),
  55. dump_register(GUCTL1),
  56. dump_register(GSNPSID),
  57. dump_register(GGPIO),
  58. dump_register(GUID),
  59. dump_register(GUCTL),
  60. dump_register(GBUSERRADDR0),
  61. dump_register(GBUSERRADDR1),
  62. dump_register(GPRTBIMAP0),
  63. dump_register(GPRTBIMAP1),
  64. dump_register(GHWPARAMS0),
  65. dump_register(GHWPARAMS1),
  66. dump_register(GHWPARAMS2),
  67. dump_register(GHWPARAMS3),
  68. dump_register(GHWPARAMS4),
  69. dump_register(GHWPARAMS5),
  70. dump_register(GHWPARAMS6),
  71. dump_register(GHWPARAMS7),
  72. dump_register(GDBGFIFOSPACE),
  73. dump_register(GDBGLTSSM),
  74. dump_register(GDBGBMU),
  75. dump_register(GPRTBIMAP_HS0),
  76. dump_register(GPRTBIMAP_HS1),
  77. dump_register(GPRTBIMAP_FS0),
  78. dump_register(GPRTBIMAP_FS1),
  79. dump_register(GUCTL2),
  80. dump_register(VER_NUMBER),
  81. dump_register(VER_TYPE),
  82. dump_register(GUSB2PHYCFG(0)),
  83. dump_register(GUSB2PHYCFG(1)),
  84. dump_register(GUSB2PHYCFG(2)),
  85. dump_register(GUSB2PHYCFG(3)),
  86. dump_register(GUSB2PHYCFG(4)),
  87. dump_register(GUSB2PHYCFG(5)),
  88. dump_register(GUSB2PHYCFG(6)),
  89. dump_register(GUSB2PHYCFG(7)),
  90. dump_register(GUSB2PHYCFG(8)),
  91. dump_register(GUSB2PHYCFG(9)),
  92. dump_register(GUSB2PHYCFG(10)),
  93. dump_register(GUSB2PHYCFG(11)),
  94. dump_register(GUSB2PHYCFG(12)),
  95. dump_register(GUSB2PHYCFG(13)),
  96. dump_register(GUSB2PHYCFG(14)),
  97. dump_register(GUSB2PHYCFG(15)),
  98. dump_register(GUSB2I2CCTL(0)),
  99. dump_register(GUSB2I2CCTL(1)),
  100. dump_register(GUSB2I2CCTL(2)),
  101. dump_register(GUSB2I2CCTL(3)),
  102. dump_register(GUSB2I2CCTL(4)),
  103. dump_register(GUSB2I2CCTL(5)),
  104. dump_register(GUSB2I2CCTL(6)),
  105. dump_register(GUSB2I2CCTL(7)),
  106. dump_register(GUSB2I2CCTL(8)),
  107. dump_register(GUSB2I2CCTL(9)),
  108. dump_register(GUSB2I2CCTL(10)),
  109. dump_register(GUSB2I2CCTL(11)),
  110. dump_register(GUSB2I2CCTL(12)),
  111. dump_register(GUSB2I2CCTL(13)),
  112. dump_register(GUSB2I2CCTL(14)),
  113. dump_register(GUSB2I2CCTL(15)),
  114. dump_register(GUSB2PHYACC(0)),
  115. dump_register(GUSB2PHYACC(1)),
  116. dump_register(GUSB2PHYACC(2)),
  117. dump_register(GUSB2PHYACC(3)),
  118. dump_register(GUSB2PHYACC(4)),
  119. dump_register(GUSB2PHYACC(5)),
  120. dump_register(GUSB2PHYACC(6)),
  121. dump_register(GUSB2PHYACC(7)),
  122. dump_register(GUSB2PHYACC(8)),
  123. dump_register(GUSB2PHYACC(9)),
  124. dump_register(GUSB2PHYACC(10)),
  125. dump_register(GUSB2PHYACC(11)),
  126. dump_register(GUSB2PHYACC(12)),
  127. dump_register(GUSB2PHYACC(13)),
  128. dump_register(GUSB2PHYACC(14)),
  129. dump_register(GUSB2PHYACC(15)),
  130. dump_register(GUSB3PIPECTL(0)),
  131. dump_register(GUSB3PIPECTL(1)),
  132. dump_register(GUSB3PIPECTL(2)),
  133. dump_register(GUSB3PIPECTL(3)),
  134. dump_register(GUSB3PIPECTL(4)),
  135. dump_register(GUSB3PIPECTL(5)),
  136. dump_register(GUSB3PIPECTL(6)),
  137. dump_register(GUSB3PIPECTL(7)),
  138. dump_register(GUSB3PIPECTL(8)),
  139. dump_register(GUSB3PIPECTL(9)),
  140. dump_register(GUSB3PIPECTL(10)),
  141. dump_register(GUSB3PIPECTL(11)),
  142. dump_register(GUSB3PIPECTL(12)),
  143. dump_register(GUSB3PIPECTL(13)),
  144. dump_register(GUSB3PIPECTL(14)),
  145. dump_register(GUSB3PIPECTL(15)),
  146. dump_register(GTXFIFOSIZ(0)),
  147. dump_register(GTXFIFOSIZ(1)),
  148. dump_register(GTXFIFOSIZ(2)),
  149. dump_register(GTXFIFOSIZ(3)),
  150. dump_register(GTXFIFOSIZ(4)),
  151. dump_register(GTXFIFOSIZ(5)),
  152. dump_register(GTXFIFOSIZ(6)),
  153. dump_register(GTXFIFOSIZ(7)),
  154. dump_register(GTXFIFOSIZ(8)),
  155. dump_register(GTXFIFOSIZ(9)),
  156. dump_register(GTXFIFOSIZ(10)),
  157. dump_register(GTXFIFOSIZ(11)),
  158. dump_register(GTXFIFOSIZ(12)),
  159. dump_register(GTXFIFOSIZ(13)),
  160. dump_register(GTXFIFOSIZ(14)),
  161. dump_register(GTXFIFOSIZ(15)),
  162. dump_register(GTXFIFOSIZ(16)),
  163. dump_register(GTXFIFOSIZ(17)),
  164. dump_register(GTXFIFOSIZ(18)),
  165. dump_register(GTXFIFOSIZ(19)),
  166. dump_register(GTXFIFOSIZ(20)),
  167. dump_register(GTXFIFOSIZ(21)),
  168. dump_register(GTXFIFOSIZ(22)),
  169. dump_register(GTXFIFOSIZ(23)),
  170. dump_register(GTXFIFOSIZ(24)),
  171. dump_register(GTXFIFOSIZ(25)),
  172. dump_register(GTXFIFOSIZ(26)),
  173. dump_register(GTXFIFOSIZ(27)),
  174. dump_register(GTXFIFOSIZ(28)),
  175. dump_register(GTXFIFOSIZ(29)),
  176. dump_register(GTXFIFOSIZ(30)),
  177. dump_register(GTXFIFOSIZ(31)),
  178. dump_register(GRXFIFOSIZ(0)),
  179. dump_register(GRXFIFOSIZ(1)),
  180. dump_register(GRXFIFOSIZ(2)),
  181. dump_register(GRXFIFOSIZ(3)),
  182. dump_register(GRXFIFOSIZ(4)),
  183. dump_register(GRXFIFOSIZ(5)),
  184. dump_register(GRXFIFOSIZ(6)),
  185. dump_register(GRXFIFOSIZ(7)),
  186. dump_register(GRXFIFOSIZ(8)),
  187. dump_register(GRXFIFOSIZ(9)),
  188. dump_register(GRXFIFOSIZ(10)),
  189. dump_register(GRXFIFOSIZ(11)),
  190. dump_register(GRXFIFOSIZ(12)),
  191. dump_register(GRXFIFOSIZ(13)),
  192. dump_register(GRXFIFOSIZ(14)),
  193. dump_register(GRXFIFOSIZ(15)),
  194. dump_register(GRXFIFOSIZ(16)),
  195. dump_register(GRXFIFOSIZ(17)),
  196. dump_register(GRXFIFOSIZ(18)),
  197. dump_register(GRXFIFOSIZ(19)),
  198. dump_register(GRXFIFOSIZ(20)),
  199. dump_register(GRXFIFOSIZ(21)),
  200. dump_register(GRXFIFOSIZ(22)),
  201. dump_register(GRXFIFOSIZ(23)),
  202. dump_register(GRXFIFOSIZ(24)),
  203. dump_register(GRXFIFOSIZ(25)),
  204. dump_register(GRXFIFOSIZ(26)),
  205. dump_register(GRXFIFOSIZ(27)),
  206. dump_register(GRXFIFOSIZ(28)),
  207. dump_register(GRXFIFOSIZ(29)),
  208. dump_register(GRXFIFOSIZ(30)),
  209. dump_register(GRXFIFOSIZ(31)),
  210. dump_register(GEVNTADRLO(0)),
  211. dump_register(GEVNTADRHI(0)),
  212. dump_register(GEVNTSIZ(0)),
  213. dump_register(GEVNTCOUNT(0)),
  214. dump_register(GHWPARAMS8),
  215. dump_register(GUCTL3),
  216. dump_register(GFLADJ),
  217. dump_register(DCFG),
  218. dump_register(DCTL),
  219. dump_register(DEVTEN),
  220. dump_register(DSTS),
  221. dump_register(DGCMDPAR),
  222. dump_register(DGCMD),
  223. dump_register(DALEPENA),
  224. dump_ep_register_set(0),
  225. dump_ep_register_set(1),
  226. dump_ep_register_set(2),
  227. dump_ep_register_set(3),
  228. dump_ep_register_set(4),
  229. dump_ep_register_set(5),
  230. dump_ep_register_set(6),
  231. dump_ep_register_set(7),
  232. dump_ep_register_set(8),
  233. dump_ep_register_set(9),
  234. dump_ep_register_set(10),
  235. dump_ep_register_set(11),
  236. dump_ep_register_set(12),
  237. dump_ep_register_set(13),
  238. dump_ep_register_set(14),
  239. dump_ep_register_set(15),
  240. dump_ep_register_set(16),
  241. dump_ep_register_set(17),
  242. dump_ep_register_set(18),
  243. dump_ep_register_set(19),
  244. dump_ep_register_set(20),
  245. dump_ep_register_set(21),
  246. dump_ep_register_set(22),
  247. dump_ep_register_set(23),
  248. dump_ep_register_set(24),
  249. dump_ep_register_set(25),
  250. dump_ep_register_set(26),
  251. dump_ep_register_set(27),
  252. dump_ep_register_set(28),
  253. dump_ep_register_set(29),
  254. dump_ep_register_set(30),
  255. dump_ep_register_set(31),
  256. dump_register(OCFG),
  257. dump_register(OCTL),
  258. dump_register(OEVT),
  259. dump_register(OEVTEN),
  260. dump_register(OSTS),
  261. };
  262. static void dwc3_host_lsp(struct seq_file *s)
  263. {
  264. struct dwc3 *dwc = s->private;
  265. bool dbc_enabled;
  266. u32 sel;
  267. u32 reg;
  268. u32 val;
  269. dbc_enabled = !!(dwc->hwparams.hwparams1 & DWC3_GHWPARAMS1_ENDBC);
  270. sel = dwc->dbg_lsp_select;
  271. if (sel == DWC3_LSP_MUX_UNSELECTED) {
  272. seq_puts(s, "Write LSP selection to print for host\n");
  273. return;
  274. }
  275. reg = DWC3_GDBGLSPMUX_HOSTSELECT(sel);
  276. dwc3_writel(dwc, DWC3_GDBGLSPMUX, reg);
  277. val = dwc3_readl(dwc, DWC3_GDBGLSP);
  278. seq_printf(s, "GDBGLSP[%d] = 0x%08x\n", sel, val);
  279. if (dbc_enabled && sel < 256) {
  280. reg |= DWC3_GDBGLSPMUX_ENDBC;
  281. dwc3_writel(dwc, DWC3_GDBGLSPMUX, reg);
  282. val = dwc3_readl(dwc, DWC3_GDBGLSP);
  283. seq_printf(s, "GDBGLSP_DBC[%d] = 0x%08x\n", sel, val);
  284. }
  285. }
  286. static void dwc3_gadget_lsp(struct seq_file *s)
  287. {
  288. struct dwc3 *dwc = s->private;
  289. int i;
  290. u32 reg;
  291. for (i = 0; i < 16; i++) {
  292. reg = DWC3_GDBGLSPMUX_DEVSELECT(i);
  293. dwc3_writel(dwc, DWC3_GDBGLSPMUX, reg);
  294. reg = dwc3_readl(dwc, DWC3_GDBGLSP);
  295. seq_printf(s, "GDBGLSP[%d] = 0x%08x\n", i, reg);
  296. }
  297. }
  298. static int dwc3_lsp_show(struct seq_file *s, void *unused)
  299. {
  300. struct dwc3 *dwc = s->private;
  301. unsigned int current_mode;
  302. unsigned long flags;
  303. u32 reg;
  304. int ret;
  305. ret = pm_runtime_resume_and_get(dwc->dev);
  306. if (ret < 0)
  307. return ret;
  308. spin_lock_irqsave(&dwc->lock, flags);
  309. reg = dwc3_readl(dwc, DWC3_GSTS);
  310. current_mode = DWC3_GSTS_CURMOD(reg);
  311. switch (current_mode) {
  312. case DWC3_GSTS_CURMOD_HOST:
  313. dwc3_host_lsp(s);
  314. break;
  315. case DWC3_GSTS_CURMOD_DEVICE:
  316. dwc3_gadget_lsp(s);
  317. break;
  318. default:
  319. seq_puts(s, "Mode is unknown, no LSP register printed\n");
  320. break;
  321. }
  322. spin_unlock_irqrestore(&dwc->lock, flags);
  323. pm_runtime_put_sync(dwc->dev);
  324. return 0;
  325. }
  326. static int dwc3_lsp_open(struct inode *inode, struct file *file)
  327. {
  328. return single_open(file, dwc3_lsp_show, inode->i_private);
  329. }
  330. static ssize_t dwc3_lsp_write(struct file *file, const char __user *ubuf,
  331. size_t count, loff_t *ppos)
  332. {
  333. struct seq_file *s = file->private_data;
  334. struct dwc3 *dwc = s->private;
  335. unsigned long flags;
  336. char buf[32] = { 0 };
  337. u32 sel;
  338. int ret;
  339. if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
  340. return -EFAULT;
  341. ret = kstrtouint(buf, 0, &sel);
  342. if (ret)
  343. return ret;
  344. spin_lock_irqsave(&dwc->lock, flags);
  345. dwc->dbg_lsp_select = sel;
  346. spin_unlock_irqrestore(&dwc->lock, flags);
  347. return count;
  348. }
  349. static const struct file_operations dwc3_lsp_fops = {
  350. .open = dwc3_lsp_open,
  351. .write = dwc3_lsp_write,
  352. .read = seq_read,
  353. .llseek = seq_lseek,
  354. .release = single_release,
  355. };
  356. static int dwc3_mode_show(struct seq_file *s, void *unused)
  357. {
  358. struct dwc3 *dwc = s->private;
  359. unsigned long flags;
  360. u32 reg;
  361. u32 mode;
  362. int ret;
  363. ret = pm_runtime_resume_and_get(dwc->dev);
  364. if (ret < 0)
  365. return ret;
  366. spin_lock_irqsave(&dwc->lock, flags);
  367. reg = dwc3_readl(dwc, DWC3_GCTL);
  368. spin_unlock_irqrestore(&dwc->lock, flags);
  369. mode = DWC3_GCTL_PRTCAP(reg);
  370. switch (mode) {
  371. case DWC3_GCTL_PRTCAP_HOST:
  372. case DWC3_GCTL_PRTCAP_DEVICE:
  373. case DWC3_GCTL_PRTCAP_OTG:
  374. seq_printf(s, "%s\n", dwc3_mode_string(mode));
  375. break;
  376. default:
  377. seq_printf(s, "UNKNOWN %08x\n", mode);
  378. }
  379. pm_runtime_put_sync(dwc->dev);
  380. return 0;
  381. }
  382. static int dwc3_mode_open(struct inode *inode, struct file *file)
  383. {
  384. return single_open(file, dwc3_mode_show, inode->i_private);
  385. }
  386. static ssize_t dwc3_mode_write(struct file *file,
  387. const char __user *ubuf, size_t count, loff_t *ppos)
  388. {
  389. struct seq_file *s = file->private_data;
  390. struct dwc3 *dwc = s->private;
  391. u32 mode = 0;
  392. char buf[32];
  393. if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
  394. return -EFAULT;
  395. if (dwc->dr_mode != USB_DR_MODE_OTG)
  396. return count;
  397. if (!strncmp(buf, "host", 4))
  398. mode = DWC3_GCTL_PRTCAP_HOST;
  399. if (!strncmp(buf, "device", 6))
  400. mode = DWC3_GCTL_PRTCAP_DEVICE;
  401. if (!strncmp(buf, "otg", 3))
  402. mode = DWC3_GCTL_PRTCAP_OTG;
  403. dwc3_set_mode(dwc, mode);
  404. return count;
  405. }
  406. static const struct file_operations dwc3_mode_fops = {
  407. .open = dwc3_mode_open,
  408. .write = dwc3_mode_write,
  409. .read = seq_read,
  410. .llseek = seq_lseek,
  411. .release = single_release,
  412. };
  413. static int dwc3_testmode_show(struct seq_file *s, void *unused)
  414. {
  415. struct dwc3 *dwc = s->private;
  416. unsigned long flags;
  417. u32 reg;
  418. int ret;
  419. ret = pm_runtime_resume_and_get(dwc->dev);
  420. if (ret < 0)
  421. return ret;
  422. spin_lock_irqsave(&dwc->lock, flags);
  423. reg = dwc3_readl(dwc, DWC3_DCTL);
  424. reg &= DWC3_DCTL_TSTCTRL_MASK;
  425. reg >>= 1;
  426. spin_unlock_irqrestore(&dwc->lock, flags);
  427. switch (reg) {
  428. case 0:
  429. seq_puts(s, "no test\n");
  430. break;
  431. case USB_TEST_J:
  432. seq_puts(s, "test_j\n");
  433. break;
  434. case USB_TEST_K:
  435. seq_puts(s, "test_k\n");
  436. break;
  437. case USB_TEST_SE0_NAK:
  438. seq_puts(s, "test_se0_nak\n");
  439. break;
  440. case USB_TEST_PACKET:
  441. seq_puts(s, "test_packet\n");
  442. break;
  443. case USB_TEST_FORCE_ENABLE:
  444. seq_puts(s, "test_force_enable\n");
  445. break;
  446. default:
  447. seq_printf(s, "UNKNOWN %d\n", reg);
  448. }
  449. pm_runtime_put_sync(dwc->dev);
  450. return 0;
  451. }
  452. static int dwc3_testmode_open(struct inode *inode, struct file *file)
  453. {
  454. return single_open(file, dwc3_testmode_show, inode->i_private);
  455. }
  456. static ssize_t dwc3_testmode_write(struct file *file,
  457. const char __user *ubuf, size_t count, loff_t *ppos)
  458. {
  459. struct seq_file *s = file->private_data;
  460. struct dwc3 *dwc = s->private;
  461. unsigned long flags;
  462. u32 testmode = 0;
  463. char buf[32];
  464. int ret;
  465. if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
  466. return -EFAULT;
  467. if (!strncmp(buf, "test_j", 6))
  468. testmode = USB_TEST_J;
  469. else if (!strncmp(buf, "test_k", 6))
  470. testmode = USB_TEST_K;
  471. else if (!strncmp(buf, "test_se0_nak", 12))
  472. testmode = USB_TEST_SE0_NAK;
  473. else if (!strncmp(buf, "test_packet", 11))
  474. testmode = USB_TEST_PACKET;
  475. else if (!strncmp(buf, "test_force_enable", 17))
  476. testmode = USB_TEST_FORCE_ENABLE;
  477. else
  478. testmode = 0;
  479. ret = pm_runtime_resume_and_get(dwc->dev);
  480. if (ret < 0)
  481. return ret;
  482. spin_lock_irqsave(&dwc->lock, flags);
  483. dwc3_gadget_set_test_mode(dwc, testmode);
  484. spin_unlock_irqrestore(&dwc->lock, flags);
  485. pm_runtime_put_sync(dwc->dev);
  486. return count;
  487. }
  488. static const struct file_operations dwc3_testmode_fops = {
  489. .open = dwc3_testmode_open,
  490. .write = dwc3_testmode_write,
  491. .read = seq_read,
  492. .llseek = seq_lseek,
  493. .release = single_release,
  494. };
  495. static int dwc3_link_state_show(struct seq_file *s, void *unused)
  496. {
  497. struct dwc3 *dwc = s->private;
  498. unsigned long flags;
  499. enum dwc3_link_state state;
  500. u32 reg;
  501. u8 speed;
  502. int ret;
  503. ret = pm_runtime_resume_and_get(dwc->dev);
  504. if (ret < 0)
  505. return ret;
  506. spin_lock_irqsave(&dwc->lock, flags);
  507. reg = dwc3_readl(dwc, DWC3_GSTS);
  508. if (DWC3_GSTS_CURMOD(reg) != DWC3_GSTS_CURMOD_DEVICE) {
  509. seq_puts(s, "Not available\n");
  510. spin_unlock_irqrestore(&dwc->lock, flags);
  511. pm_runtime_put_sync(dwc->dev);
  512. return 0;
  513. }
  514. reg = dwc3_readl(dwc, DWC3_DSTS);
  515. state = DWC3_DSTS_USBLNKST(reg);
  516. speed = reg & DWC3_DSTS_CONNECTSPD;
  517. seq_printf(s, "%s\n", (speed >= DWC3_DSTS_SUPERSPEED) ?
  518. dwc3_gadget_link_string(state) :
  519. dwc3_gadget_hs_link_string(state));
  520. spin_unlock_irqrestore(&dwc->lock, flags);
  521. pm_runtime_put_sync(dwc->dev);
  522. return 0;
  523. }
  524. static int dwc3_link_state_open(struct inode *inode, struct file *file)
  525. {
  526. return single_open(file, dwc3_link_state_show, inode->i_private);
  527. }
  528. static ssize_t dwc3_link_state_write(struct file *file,
  529. const char __user *ubuf, size_t count, loff_t *ppos)
  530. {
  531. struct seq_file *s = file->private_data;
  532. struct dwc3 *dwc = s->private;
  533. unsigned long flags;
  534. enum dwc3_link_state state = 0;
  535. char buf[32];
  536. u32 reg;
  537. u8 speed;
  538. int ret;
  539. if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
  540. return -EFAULT;
  541. if (!strncmp(buf, "SS.Disabled", 11))
  542. state = DWC3_LINK_STATE_SS_DIS;
  543. else if (!strncmp(buf, "Rx.Detect", 9))
  544. state = DWC3_LINK_STATE_RX_DET;
  545. else if (!strncmp(buf, "SS.Inactive", 11))
  546. state = DWC3_LINK_STATE_SS_INACT;
  547. else if (!strncmp(buf, "Recovery", 8))
  548. state = DWC3_LINK_STATE_RECOV;
  549. else if (!strncmp(buf, "Compliance", 10))
  550. state = DWC3_LINK_STATE_CMPLY;
  551. else if (!strncmp(buf, "Loopback", 8))
  552. state = DWC3_LINK_STATE_LPBK;
  553. else
  554. return -EINVAL;
  555. ret = pm_runtime_resume_and_get(dwc->dev);
  556. if (ret < 0)
  557. return ret;
  558. spin_lock_irqsave(&dwc->lock, flags);
  559. reg = dwc3_readl(dwc, DWC3_GSTS);
  560. if (DWC3_GSTS_CURMOD(reg) != DWC3_GSTS_CURMOD_DEVICE) {
  561. spin_unlock_irqrestore(&dwc->lock, flags);
  562. pm_runtime_put_sync(dwc->dev);
  563. return -EINVAL;
  564. }
  565. reg = dwc3_readl(dwc, DWC3_DSTS);
  566. speed = reg & DWC3_DSTS_CONNECTSPD;
  567. if (speed < DWC3_DSTS_SUPERSPEED &&
  568. state != DWC3_LINK_STATE_RECOV) {
  569. spin_unlock_irqrestore(&dwc->lock, flags);
  570. pm_runtime_put_sync(dwc->dev);
  571. return -EINVAL;
  572. }
  573. dwc3_gadget_set_link_state(dwc, state);
  574. spin_unlock_irqrestore(&dwc->lock, flags);
  575. pm_runtime_put_sync(dwc->dev);
  576. return count;
  577. }
  578. static const struct file_operations dwc3_link_state_fops = {
  579. .open = dwc3_link_state_open,
  580. .write = dwc3_link_state_write,
  581. .read = seq_read,
  582. .llseek = seq_lseek,
  583. .release = single_release,
  584. };
  585. struct dwc3_ep_file_map {
  586. const char name[25];
  587. const struct file_operations *const fops;
  588. };
  589. static int dwc3_tx_fifo_size_show(struct seq_file *s, void *unused)
  590. {
  591. struct dwc3_ep *dep = s->private;
  592. struct dwc3 *dwc = dep->dwc;
  593. unsigned long flags;
  594. u32 mdwidth;
  595. u32 val;
  596. int ret;
  597. ret = pm_runtime_resume_and_get(dwc->dev);
  598. if (ret < 0)
  599. return ret;
  600. spin_lock_irqsave(&dwc->lock, flags);
  601. val = dwc3_core_fifo_space(dep, DWC3_TXFIFO);
  602. /* Convert to bytes */
  603. mdwidth = dwc3_mdwidth(dwc);
  604. val *= mdwidth;
  605. val >>= 3;
  606. seq_printf(s, "%u\n", val);
  607. spin_unlock_irqrestore(&dwc->lock, flags);
  608. pm_runtime_put_sync(dwc->dev);
  609. return 0;
  610. }
  611. static int dwc3_rx_fifo_size_show(struct seq_file *s, void *unused)
  612. {
  613. struct dwc3_ep *dep = s->private;
  614. struct dwc3 *dwc = dep->dwc;
  615. unsigned long flags;
  616. u32 mdwidth;
  617. u32 val;
  618. int ret;
  619. ret = pm_runtime_resume_and_get(dwc->dev);
  620. if (ret < 0)
  621. return ret;
  622. spin_lock_irqsave(&dwc->lock, flags);
  623. val = dwc3_core_fifo_space(dep, DWC3_RXFIFO);
  624. /* Convert to bytes */
  625. mdwidth = dwc3_mdwidth(dwc);
  626. val *= mdwidth;
  627. val >>= 3;
  628. seq_printf(s, "%u\n", val);
  629. spin_unlock_irqrestore(&dwc->lock, flags);
  630. pm_runtime_put_sync(dwc->dev);
  631. return 0;
  632. }
  633. static int dwc3_tx_request_queue_show(struct seq_file *s, void *unused)
  634. {
  635. struct dwc3_ep *dep = s->private;
  636. struct dwc3 *dwc = dep->dwc;
  637. unsigned long flags;
  638. u32 val;
  639. int ret;
  640. ret = pm_runtime_resume_and_get(dwc->dev);
  641. if (ret < 0)
  642. return ret;
  643. spin_lock_irqsave(&dwc->lock, flags);
  644. val = dwc3_core_fifo_space(dep, DWC3_TXREQQ);
  645. seq_printf(s, "%u\n", val);
  646. spin_unlock_irqrestore(&dwc->lock, flags);
  647. pm_runtime_put_sync(dwc->dev);
  648. return 0;
  649. }
  650. static int dwc3_rx_request_queue_show(struct seq_file *s, void *unused)
  651. {
  652. struct dwc3_ep *dep = s->private;
  653. struct dwc3 *dwc = dep->dwc;
  654. unsigned long flags;
  655. u32 val;
  656. int ret;
  657. ret = pm_runtime_resume_and_get(dwc->dev);
  658. if (ret < 0)
  659. return ret;
  660. spin_lock_irqsave(&dwc->lock, flags);
  661. val = dwc3_core_fifo_space(dep, DWC3_RXREQQ);
  662. seq_printf(s, "%u\n", val);
  663. spin_unlock_irqrestore(&dwc->lock, flags);
  664. pm_runtime_put_sync(dwc->dev);
  665. return 0;
  666. }
  667. static int dwc3_rx_info_queue_show(struct seq_file *s, void *unused)
  668. {
  669. struct dwc3_ep *dep = s->private;
  670. struct dwc3 *dwc = dep->dwc;
  671. unsigned long flags;
  672. u32 val;
  673. int ret;
  674. ret = pm_runtime_resume_and_get(dwc->dev);
  675. if (ret < 0)
  676. return ret;
  677. spin_lock_irqsave(&dwc->lock, flags);
  678. val = dwc3_core_fifo_space(dep, DWC3_RXINFOQ);
  679. seq_printf(s, "%u\n", val);
  680. spin_unlock_irqrestore(&dwc->lock, flags);
  681. pm_runtime_put_sync(dwc->dev);
  682. return 0;
  683. }
  684. static int dwc3_descriptor_fetch_queue_show(struct seq_file *s, void *unused)
  685. {
  686. struct dwc3_ep *dep = s->private;
  687. struct dwc3 *dwc = dep->dwc;
  688. unsigned long flags;
  689. u32 val;
  690. int ret;
  691. ret = pm_runtime_resume_and_get(dwc->dev);
  692. if (ret < 0)
  693. return ret;
  694. spin_lock_irqsave(&dwc->lock, flags);
  695. val = dwc3_core_fifo_space(dep, DWC3_DESCFETCHQ);
  696. seq_printf(s, "%u\n", val);
  697. spin_unlock_irqrestore(&dwc->lock, flags);
  698. pm_runtime_put_sync(dwc->dev);
  699. return 0;
  700. }
  701. static int dwc3_event_queue_show(struct seq_file *s, void *unused)
  702. {
  703. struct dwc3_ep *dep = s->private;
  704. struct dwc3 *dwc = dep->dwc;
  705. unsigned long flags;
  706. u32 val;
  707. int ret;
  708. ret = pm_runtime_resume_and_get(dwc->dev);
  709. if (ret < 0)
  710. return ret;
  711. spin_lock_irqsave(&dwc->lock, flags);
  712. val = dwc3_core_fifo_space(dep, DWC3_EVENTQ);
  713. seq_printf(s, "%u\n", val);
  714. spin_unlock_irqrestore(&dwc->lock, flags);
  715. pm_runtime_put_sync(dwc->dev);
  716. return 0;
  717. }
  718. static int dwc3_transfer_type_show(struct seq_file *s, void *unused)
  719. {
  720. struct dwc3_ep *dep = s->private;
  721. struct dwc3 *dwc = dep->dwc;
  722. unsigned long flags;
  723. spin_lock_irqsave(&dwc->lock, flags);
  724. if (!(dep->flags & DWC3_EP_ENABLED) || !dep->endpoint.desc) {
  725. seq_puts(s, "--\n");
  726. goto out;
  727. }
  728. switch (usb_endpoint_type(dep->endpoint.desc)) {
  729. case USB_ENDPOINT_XFER_CONTROL:
  730. seq_puts(s, "control\n");
  731. break;
  732. case USB_ENDPOINT_XFER_ISOC:
  733. seq_puts(s, "isochronous\n");
  734. break;
  735. case USB_ENDPOINT_XFER_BULK:
  736. seq_puts(s, "bulk\n");
  737. break;
  738. case USB_ENDPOINT_XFER_INT:
  739. seq_puts(s, "interrupt\n");
  740. break;
  741. default:
  742. seq_puts(s, "--\n");
  743. }
  744. out:
  745. spin_unlock_irqrestore(&dwc->lock, flags);
  746. return 0;
  747. }
  748. static int dwc3_trb_ring_show(struct seq_file *s, void *unused)
  749. {
  750. struct dwc3_ep *dep = s->private;
  751. struct dwc3 *dwc = dep->dwc;
  752. unsigned long flags;
  753. int i;
  754. int ret;
  755. ret = pm_runtime_resume_and_get(dwc->dev);
  756. if (ret < 0)
  757. return ret;
  758. spin_lock_irqsave(&dwc->lock, flags);
  759. if (dep->number <= 1) {
  760. seq_puts(s, "--\n");
  761. goto out;
  762. }
  763. seq_puts(s, "buffer_addr,size,type,ioc,isp_imi,csp,chn,lst,hwo\n");
  764. for (i = 0; i < DWC3_TRB_NUM; i++) {
  765. struct dwc3_trb *trb = &dep->trb_pool[i];
  766. unsigned int type = DWC3_TRBCTL_TYPE(trb->ctrl);
  767. seq_printf(s, "%08x%08x,%d,%s,%d,%d,%d,%d,%d,%d %c%c\n",
  768. trb->bph, trb->bpl, trb->size,
  769. dwc3_trb_type_string(type),
  770. !!(trb->ctrl & DWC3_TRB_CTRL_IOC),
  771. !!(trb->ctrl & DWC3_TRB_CTRL_ISP_IMI),
  772. !!(trb->ctrl & DWC3_TRB_CTRL_CSP),
  773. !!(trb->ctrl & DWC3_TRB_CTRL_CHN),
  774. !!(trb->ctrl & DWC3_TRB_CTRL_LST),
  775. !!(trb->ctrl & DWC3_TRB_CTRL_HWO),
  776. dep->trb_enqueue == i ? 'E' : ' ',
  777. dep->trb_dequeue == i ? 'D' : ' ');
  778. }
  779. out:
  780. spin_unlock_irqrestore(&dwc->lock, flags);
  781. pm_runtime_put_sync(dwc->dev);
  782. return 0;
  783. }
  784. static int dwc3_ep_info_register_show(struct seq_file *s, void *unused)
  785. {
  786. struct dwc3_ep *dep = s->private;
  787. struct dwc3 *dwc = dep->dwc;
  788. unsigned long flags;
  789. u64 ep_info;
  790. u32 lower_32_bits;
  791. u32 upper_32_bits;
  792. u32 reg;
  793. int ret;
  794. ret = pm_runtime_resume_and_get(dwc->dev);
  795. if (ret < 0)
  796. return ret;
  797. spin_lock_irqsave(&dwc->lock, flags);
  798. reg = DWC3_GDBGLSPMUX_EPSELECT(dep->number);
  799. dwc3_writel(dwc, DWC3_GDBGLSPMUX, reg);
  800. lower_32_bits = dwc3_readl(dwc, DWC3_GDBGEPINFO0);
  801. upper_32_bits = dwc3_readl(dwc, DWC3_GDBGEPINFO1);
  802. ep_info = ((u64)upper_32_bits << 32) | lower_32_bits;
  803. seq_printf(s, "0x%016llx\n", ep_info);
  804. spin_unlock_irqrestore(&dwc->lock, flags);
  805. pm_runtime_put_sync(dwc->dev);
  806. return 0;
  807. }
  808. DEFINE_SHOW_ATTRIBUTE(dwc3_tx_fifo_size);
  809. DEFINE_SHOW_ATTRIBUTE(dwc3_rx_fifo_size);
  810. DEFINE_SHOW_ATTRIBUTE(dwc3_tx_request_queue);
  811. DEFINE_SHOW_ATTRIBUTE(dwc3_rx_request_queue);
  812. DEFINE_SHOW_ATTRIBUTE(dwc3_rx_info_queue);
  813. DEFINE_SHOW_ATTRIBUTE(dwc3_descriptor_fetch_queue);
  814. DEFINE_SHOW_ATTRIBUTE(dwc3_event_queue);
  815. DEFINE_SHOW_ATTRIBUTE(dwc3_transfer_type);
  816. DEFINE_SHOW_ATTRIBUTE(dwc3_trb_ring);
  817. DEFINE_SHOW_ATTRIBUTE(dwc3_ep_info_register);
  818. static const struct dwc3_ep_file_map dwc3_ep_file_map[] = {
  819. { "tx_fifo_size", &dwc3_tx_fifo_size_fops, },
  820. { "rx_fifo_size", &dwc3_rx_fifo_size_fops, },
  821. { "tx_request_queue", &dwc3_tx_request_queue_fops, },
  822. { "rx_request_queue", &dwc3_rx_request_queue_fops, },
  823. { "rx_info_queue", &dwc3_rx_info_queue_fops, },
  824. { "descriptor_fetch_queue", &dwc3_descriptor_fetch_queue_fops, },
  825. { "event_queue", &dwc3_event_queue_fops, },
  826. { "transfer_type", &dwc3_transfer_type_fops, },
  827. { "trb_ring", &dwc3_trb_ring_fops, },
  828. { "GDBGEPINFO", &dwc3_ep_info_register_fops, },
  829. };
  830. void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
  831. {
  832. struct dentry *dir;
  833. int i;
  834. dir = debugfs_create_dir(dep->name, dep->dwc->debug_root);
  835. for (i = 0; i < ARRAY_SIZE(dwc3_ep_file_map); i++) {
  836. const struct file_operations *fops = dwc3_ep_file_map[i].fops;
  837. const char *name = dwc3_ep_file_map[i].name;
  838. debugfs_create_file(name, 0444, dir, dep, fops);
  839. }
  840. }
  841. void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep)
  842. {
  843. debugfs_lookup_and_remove(dep->name, dep->dwc->debug_root);
  844. }
  845. void dwc3_debugfs_init(struct dwc3 *dwc)
  846. {
  847. struct dentry *root;
  848. dwc->regset = kzalloc_obj(*dwc->regset);
  849. if (!dwc->regset)
  850. return;
  851. dwc->dbg_lsp_select = DWC3_LSP_MUX_UNSELECTED;
  852. dwc->regset->regs = dwc3_regs;
  853. dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
  854. dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
  855. dwc->regset->dev = dwc->dev;
  856. root = debugfs_create_dir(dev_name(dwc->dev), usb_debug_root);
  857. dwc->debug_root = root;
  858. debugfs_create_regset32("regdump", 0444, root, dwc->regset);
  859. debugfs_create_file("lsp_dump", 0644, root, dwc, &dwc3_lsp_fops);
  860. if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE))
  861. debugfs_create_file("mode", 0644, root, dwc,
  862. &dwc3_mode_fops);
  863. if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
  864. IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
  865. debugfs_create_file("testmode", 0644, root, dwc,
  866. &dwc3_testmode_fops);
  867. debugfs_create_file("link_state", 0644, root, dwc,
  868. &dwc3_link_state_fops);
  869. }
  870. }
  871. void dwc3_debugfs_exit(struct dwc3 *dwc)
  872. {
  873. debugfs_lookup_and_remove(dev_name(dwc->dev), usb_debug_root);
  874. kfree(dwc->regset);
  875. }