lkml.org 
[lkml]   [2016]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/3] usb: dwc3: add debugfs node to dump FIFO/Queue available space
    Date
    From: "Du, Changbin" <changbin.du@intel.com>

    For DWC3 USB controller, the Global Debug Queue/FIFO Space Available
    Register(GDBGFIFOSPACE) can be used to dump FIFO/Queue available space.
    This can be used to check some special issues, like whether data is
    successfully copied from memory to fifo when a trb is blocked.

    Signed-off-by: Du, Changbin <changbin.du@intel.com>
    ---
    drivers/usb/dwc3/core.h | 5 +++++
    drivers/usb/dwc3/debugfs.c | 40 ++++++++++++++++++++++++++++++++++++++++
    2 files changed, 45 insertions(+)

    diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
    index 6254b2f..899cf76 100644
    --- a/drivers/usb/dwc3/core.h
    +++ b/drivers/usb/dwc3/core.h
    @@ -348,6 +348,11 @@
    #define DWC3_DSTS_LOWSPEED (2 << 0)
    #define DWC3_DSTS_FULLSPEED1 (3 << 0)

    +/* Global Debug Queue/FIFO Space Available Register */
    +#define DWC3_GDBGFIFOSPACE_NUM(x) (((x) << 0) & 0x1F)
    +#define DWC3_GDBGFIFOSPACE_TYPE(x) (((x) << 5) & 0xE0)
    +#define DWC3_GDBGFIFOSPACE_GET_SPACE(x) (((x) >> 16) & 0xFFFF)
    +
    /* Device Generic Command Register */
    #define DWC3_DGCMD_SET_LMP 0x01
    #define DWC3_DGCMD_SET_PERIODIC_PAR 0x02
    diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c
    index 2d4f397..bb608e0 100644
    --- a/drivers/usb/dwc3/debugfs.c
    +++ b/drivers/usb/dwc3/debugfs.c
    @@ -426,6 +426,45 @@ static const struct file_operations dwc3_mode_fops = {
    .release = single_release,
    };

    +static int dwc3_fifo_show(struct seq_file *s, void *unused)
    +{
    + struct dwc3 *dwc = s->private;
    + unsigned long flags;
    + unsigned int type, index;
    + const char *name;
    + u32 reg;
    +
    + static const char * const fifo_names[] = {
    + "TxFIFO", "RxFIFO", "TxReqQ", "RxReqQ", "RxInfoQ",
    + "DescFetchQ", "EventQ", "ProtocolStatusQ"};
    + spin_lock_irqsave(&dwc->lock, flags);
    + for (type = 0; type < 8; type++) {
    + name = fifo_names[type];
    + for (index = 0; index < 32; index++) {
    + dwc3_writel(dwc->regs, DWC3_GDBGFIFOSPACE,
    + DWC3_GDBGFIFOSPACE_NUM(index) |
    + DWC3_GDBGFIFOSPACE_TYPE(type));
    + reg = dwc3_readl(dwc->regs, DWC3_GDBGFIFOSPACE);
    + seq_printf(s, "%s%02d = %d\n", name, index,
    + DWC3_GDBGFIFOSPACE_GET_SPACE(reg));
    + }
    + }
    + spin_unlock_irqrestore(&dwc->lock, flags);
    + return 0;
    +}
    +
    +static int dwc3_fifo_open(struct inode *inode, struct file *file)
    +{
    + return single_open(file, dwc3_fifo_show, inode->i_private);
    +}
    +
    +static const struct file_operations dwc3_fifo_fops = {
    + .open = dwc3_fifo_open,
    + .read = seq_read,
    + .llseek = seq_lseek,
    + .release = single_release,
    +};
    +
    static int dwc3_testmode_show(struct seq_file *s, void *unused)
    {
    struct dwc3 *dwc = s->private;
    @@ -639,6 +678,7 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
    dwc->regset->base = dwc->regs;

    debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
    + debugfs_create_file("fifo", S_IRUGO, root, dwc, &dwc3_fifo_fops);

    if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE))
    debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
    --
    2.5.0
    \
     
     \ /
      Last update: 2016-04-06 18:21    [W:3.567 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site