1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * xhci-debugfs.h - xHCI debugfs interface
4 *
5 * Copyright (C) 2017 Intel Corporation
6 *
7 * Author: Lu Baolu <baolu.lu@linux.intel.com>
8 */
9
10#ifndef __LINUX_XHCI_DEBUGFS_H
11#define __LINUX_XHCI_DEBUGFS_H
12
13#include <linux/debugfs.h>
14
15#define DEBUGFS_NAMELEN 32
16
17#define REG_CAPLENGTH					0x00
18#define REG_HCSPARAMS1					0x04
19#define REG_HCSPARAMS2					0x08
20#define REG_HCSPARAMS3					0x0c
21#define REG_HCCPARAMS1					0x10
22#define REG_DOORBELLOFF					0x14
23#define REG_RUNTIMEOFF					0x18
24#define REG_HCCPARAMS2					0x1c
25
26#define	REG_USBCMD					0x00
27#define REG_USBSTS					0x04
28#define REG_PAGESIZE					0x08
29#define REG_DNCTRL					0x14
30#define REG_CRCR					0x18
31#define REG_DCBAAP_LOW					0x30
32#define REG_DCBAAP_HIGH					0x34
33#define REG_CONFIG					0x38
34
35#define REG_MFINDEX					0x00
36#define REG_IR0_IMAN					0x20
37#define REG_IR0_IMOD					0x24
38#define REG_IR0_ERSTSZ					0x28
39#define REG_IR0_ERSTBA_LOW				0x30
40#define REG_IR0_ERSTBA_HIGH				0x34
41#define REG_IR0_ERDP_LOW				0x38
42#define REG_IR0_ERDP_HIGH				0x3c
43
44#define REG_EXTCAP_USBLEGSUP				0x00
45#define REG_EXTCAP_USBLEGCTLSTS				0x04
46
47#define REG_EXTCAP_REVISION				0x00
48#define REG_EXTCAP_NAME					0x04
49#define REG_EXTCAP_PORTINFO				0x08
50#define REG_EXTCAP_PORTTYPE				0x0c
51#define REG_EXTCAP_MANTISSA1				0x10
52#define REG_EXTCAP_MANTISSA2				0x14
53#define REG_EXTCAP_MANTISSA3				0x18
54#define REG_EXTCAP_MANTISSA4				0x1c
55#define REG_EXTCAP_MANTISSA5				0x20
56#define REG_EXTCAP_MANTISSA6				0x24
57
58#define REG_EXTCAP_DBC_CAPABILITY			0x00
59#define REG_EXTCAP_DBC_DOORBELL				0x04
60#define REG_EXTCAP_DBC_ERSTSIZE				0x08
61#define REG_EXTCAP_DBC_ERST_LOW				0x10
62#define REG_EXTCAP_DBC_ERST_HIGH			0x14
63#define REG_EXTCAP_DBC_ERDP_LOW				0x18
64#define REG_EXTCAP_DBC_ERDP_HIGH			0x1c
65#define REG_EXTCAP_DBC_CONTROL				0x20
66#define REG_EXTCAP_DBC_STATUS				0x24
67#define REG_EXTCAP_DBC_PORTSC				0x28
68#define REG_EXTCAP_DBC_CONT_LOW				0x30
69#define REG_EXTCAP_DBC_CONT_HIGH			0x34
70#define REG_EXTCAP_DBC_DEVINFO1				0x38
71#define REG_EXTCAP_DBC_DEVINFO2				0x3c
72
73#define dump_register(nm)				\
74{							\
75	.name	= __stringify(nm),			\
76	.offset	= REG_ ##nm,				\
77}
78
79struct xhci_regset {
80	char			name[DEBUGFS_NAMELEN];
81	struct debugfs_regset32	regset;
82	size_t			nregs;
83	struct list_head	list;
84};
85
86struct xhci_file_map {
87	const char		*name;
88	int			(*show)(struct seq_file *s, void *unused);
89};
90
91struct xhci_ep_priv {
92	char			name[DEBUGFS_NAMELEN];
93	struct dentry		*root;
94	struct xhci_stream_info *stream_info;
95	struct xhci_ring	*show_ring;
96	unsigned int		stream_id;
97};
98
99struct xhci_slot_priv {
100	char			name[DEBUGFS_NAMELEN];
101	struct dentry		*root;
102	struct xhci_ep_priv	*eps[31];
103	struct xhci_virt_device	*dev;
104};
105
106#ifdef CONFIG_DEBUG_FS
107void xhci_debugfs_init(struct xhci_hcd *xhci);
108void xhci_debugfs_exit(struct xhci_hcd *xhci);
109void __init xhci_debugfs_create_root(void);
110void __exit xhci_debugfs_remove_root(void);
111void xhci_debugfs_create_slot(struct xhci_hcd *xhci, int slot_id);
112void xhci_debugfs_remove_slot(struct xhci_hcd *xhci, int slot_id);
113void xhci_debugfs_create_endpoint(struct xhci_hcd *xhci,
114				  struct xhci_virt_device *virt_dev,
115				  int ep_index);
116void xhci_debugfs_remove_endpoint(struct xhci_hcd *xhci,
117				  struct xhci_virt_device *virt_dev,
118				  int ep_index);
119void xhci_debugfs_create_stream_files(struct xhci_hcd *xhci,
120				      struct xhci_virt_device *virt_dev,
121				      int ep_index);
122#else
123static inline void xhci_debugfs_init(struct xhci_hcd *xhci) { }
124static inline void xhci_debugfs_exit(struct xhci_hcd *xhci) { }
125static inline void __init xhci_debugfs_create_root(void) { }
126static inline void __exit xhci_debugfs_remove_root(void) { }
127static inline void xhci_debugfs_create_slot(struct xhci_hcd *x, int s) { }
128static inline void xhci_debugfs_remove_slot(struct xhci_hcd *x, int s) { }
129static inline void
130xhci_debugfs_create_endpoint(struct xhci_hcd *xhci,
131			     struct xhci_virt_device *virt_dev,
132			     int ep_index) { }
133static inline void
134xhci_debugfs_remove_endpoint(struct xhci_hcd *xhci,
135			     struct xhci_virt_device *virt_dev,
136			     int ep_index) { }
137static inline void
138xhci_debugfs_create_stream_files(struct xhci_hcd *xhci,
139				 struct xhci_virt_device *virt_dev,
140				 int ep_index) { }
141#endif /* CONFIG_DEBUG_FS */
142
143#endif /* __LINUX_XHCI_DEBUGFS_H */
144