root/drivers/usb/dwc3/debugfs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dwc3_host_lsp
  2. dwc3_gadget_lsp
  3. dwc3_lsp_show
  4. dwc3_lsp_open
  5. dwc3_lsp_write
  6. dwc3_mode_show
  7. dwc3_mode_open
  8. dwc3_mode_write
  9. dwc3_testmode_show
  10. dwc3_testmode_open
  11. dwc3_testmode_write
  12. dwc3_link_state_show
  13. dwc3_link_state_open
  14. dwc3_link_state_write
  15. dwc3_tx_fifo_size_show
  16. dwc3_rx_fifo_size_show
  17. dwc3_tx_request_queue_show
  18. dwc3_rx_request_queue_show
  19. dwc3_rx_info_queue_show
  20. dwc3_descriptor_fetch_queue_show
  21. dwc3_event_queue_show
  22. dwc3_transfer_type_show
  23. dwc3_trb_ring_show
  24. dwc3_ep_info_register_show
  25. dwc3_debugfs_create_endpoint_files
  26. dwc3_debugfs_create_endpoint_dir
  27. dwc3_debugfs_create_endpoint_dirs
  28. dwc3_debugfs_init
  29. dwc3_debugfs_exit

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

/* [<][>][^][v][top][bottom][index][help] */