162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * xhci-debugfs.h - xHCI debugfs interface
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2017 Intel Corporation
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Lu Baolu <baolu.lu@linux.intel.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __LINUX_XHCI_DEBUGFS_H
1162306a36Sopenharmony_ci#define __LINUX_XHCI_DEBUGFS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/debugfs.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define DEBUGFS_NAMELEN 32
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define REG_CAPLENGTH					0x00
1862306a36Sopenharmony_ci#define REG_HCSPARAMS1					0x04
1962306a36Sopenharmony_ci#define REG_HCSPARAMS2					0x08
2062306a36Sopenharmony_ci#define REG_HCSPARAMS3					0x0c
2162306a36Sopenharmony_ci#define REG_HCCPARAMS1					0x10
2262306a36Sopenharmony_ci#define REG_DOORBELLOFF					0x14
2362306a36Sopenharmony_ci#define REG_RUNTIMEOFF					0x18
2462306a36Sopenharmony_ci#define REG_HCCPARAMS2					0x1c
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define	REG_USBCMD					0x00
2762306a36Sopenharmony_ci#define REG_USBSTS					0x04
2862306a36Sopenharmony_ci#define REG_PAGESIZE					0x08
2962306a36Sopenharmony_ci#define REG_DNCTRL					0x14
3062306a36Sopenharmony_ci#define REG_CRCR					0x18
3162306a36Sopenharmony_ci#define REG_DCBAAP_LOW					0x30
3262306a36Sopenharmony_ci#define REG_DCBAAP_HIGH					0x34
3362306a36Sopenharmony_ci#define REG_CONFIG					0x38
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define REG_MFINDEX					0x00
3662306a36Sopenharmony_ci#define REG_IR0_IMAN					0x20
3762306a36Sopenharmony_ci#define REG_IR0_IMOD					0x24
3862306a36Sopenharmony_ci#define REG_IR0_ERSTSZ					0x28
3962306a36Sopenharmony_ci#define REG_IR0_ERSTBA_LOW				0x30
4062306a36Sopenharmony_ci#define REG_IR0_ERSTBA_HIGH				0x34
4162306a36Sopenharmony_ci#define REG_IR0_ERDP_LOW				0x38
4262306a36Sopenharmony_ci#define REG_IR0_ERDP_HIGH				0x3c
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define REG_EXTCAP_USBLEGSUP				0x00
4562306a36Sopenharmony_ci#define REG_EXTCAP_USBLEGCTLSTS				0x04
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define REG_EXTCAP_REVISION				0x00
4862306a36Sopenharmony_ci#define REG_EXTCAP_NAME					0x04
4962306a36Sopenharmony_ci#define REG_EXTCAP_PORTINFO				0x08
5062306a36Sopenharmony_ci#define REG_EXTCAP_PORTTYPE				0x0c
5162306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA1				0x10
5262306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA2				0x14
5362306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA3				0x18
5462306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA4				0x1c
5562306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA5				0x20
5662306a36Sopenharmony_ci#define REG_EXTCAP_MANTISSA6				0x24
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define REG_EXTCAP_DBC_CAPABILITY			0x00
5962306a36Sopenharmony_ci#define REG_EXTCAP_DBC_DOORBELL				0x04
6062306a36Sopenharmony_ci#define REG_EXTCAP_DBC_ERSTSIZE				0x08
6162306a36Sopenharmony_ci#define REG_EXTCAP_DBC_ERST_LOW				0x10
6262306a36Sopenharmony_ci#define REG_EXTCAP_DBC_ERST_HIGH			0x14
6362306a36Sopenharmony_ci#define REG_EXTCAP_DBC_ERDP_LOW				0x18
6462306a36Sopenharmony_ci#define REG_EXTCAP_DBC_ERDP_HIGH			0x1c
6562306a36Sopenharmony_ci#define REG_EXTCAP_DBC_CONTROL				0x20
6662306a36Sopenharmony_ci#define REG_EXTCAP_DBC_STATUS				0x24
6762306a36Sopenharmony_ci#define REG_EXTCAP_DBC_PORTSC				0x28
6862306a36Sopenharmony_ci#define REG_EXTCAP_DBC_CONT_LOW				0x30
6962306a36Sopenharmony_ci#define REG_EXTCAP_DBC_CONT_HIGH			0x34
7062306a36Sopenharmony_ci#define REG_EXTCAP_DBC_DEVINFO1				0x38
7162306a36Sopenharmony_ci#define REG_EXTCAP_DBC_DEVINFO2				0x3c
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define dump_register(nm)				\
7462306a36Sopenharmony_ci{							\
7562306a36Sopenharmony_ci	.name	= __stringify(nm),			\
7662306a36Sopenharmony_ci	.offset	= REG_ ##nm,				\
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct xhci_regset {
8062306a36Sopenharmony_ci	char			name[DEBUGFS_NAMELEN];
8162306a36Sopenharmony_ci	struct debugfs_regset32	regset;
8262306a36Sopenharmony_ci	size_t			nregs;
8362306a36Sopenharmony_ci	struct list_head	list;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct xhci_file_map {
8762306a36Sopenharmony_ci	const char		*name;
8862306a36Sopenharmony_ci	int			(*show)(struct seq_file *s, void *unused);
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistruct xhci_ep_priv {
9262306a36Sopenharmony_ci	char			name[DEBUGFS_NAMELEN];
9362306a36Sopenharmony_ci	struct dentry		*root;
9462306a36Sopenharmony_ci	struct xhci_stream_info *stream_info;
9562306a36Sopenharmony_ci	struct xhci_ring	*show_ring;
9662306a36Sopenharmony_ci	unsigned int		stream_id;
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistruct xhci_slot_priv {
10062306a36Sopenharmony_ci	char			name[DEBUGFS_NAMELEN];
10162306a36Sopenharmony_ci	struct dentry		*root;
10262306a36Sopenharmony_ci	struct xhci_ep_priv	*eps[31];
10362306a36Sopenharmony_ci	struct xhci_virt_device	*dev;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
10762306a36Sopenharmony_civoid xhci_debugfs_init(struct xhci_hcd *xhci);
10862306a36Sopenharmony_civoid xhci_debugfs_exit(struct xhci_hcd *xhci);
10962306a36Sopenharmony_civoid __init xhci_debugfs_create_root(void);
11062306a36Sopenharmony_civoid __exit xhci_debugfs_remove_root(void);
11162306a36Sopenharmony_civoid xhci_debugfs_create_slot(struct xhci_hcd *xhci, int slot_id);
11262306a36Sopenharmony_civoid xhci_debugfs_remove_slot(struct xhci_hcd *xhci, int slot_id);
11362306a36Sopenharmony_civoid xhci_debugfs_create_endpoint(struct xhci_hcd *xhci,
11462306a36Sopenharmony_ci				  struct xhci_virt_device *virt_dev,
11562306a36Sopenharmony_ci				  int ep_index);
11662306a36Sopenharmony_civoid xhci_debugfs_remove_endpoint(struct xhci_hcd *xhci,
11762306a36Sopenharmony_ci				  struct xhci_virt_device *virt_dev,
11862306a36Sopenharmony_ci				  int ep_index);
11962306a36Sopenharmony_civoid xhci_debugfs_create_stream_files(struct xhci_hcd *xhci,
12062306a36Sopenharmony_ci				      struct xhci_virt_device *virt_dev,
12162306a36Sopenharmony_ci				      int ep_index);
12262306a36Sopenharmony_ci#else
12362306a36Sopenharmony_cistatic inline void xhci_debugfs_init(struct xhci_hcd *xhci) { }
12462306a36Sopenharmony_cistatic inline void xhci_debugfs_exit(struct xhci_hcd *xhci) { }
12562306a36Sopenharmony_cistatic inline void __init xhci_debugfs_create_root(void) { }
12662306a36Sopenharmony_cistatic inline void __exit xhci_debugfs_remove_root(void) { }
12762306a36Sopenharmony_cistatic inline void xhci_debugfs_create_slot(struct xhci_hcd *x, int s) { }
12862306a36Sopenharmony_cistatic inline void xhci_debugfs_remove_slot(struct xhci_hcd *x, int s) { }
12962306a36Sopenharmony_cistatic inline void
13062306a36Sopenharmony_cixhci_debugfs_create_endpoint(struct xhci_hcd *xhci,
13162306a36Sopenharmony_ci			     struct xhci_virt_device *virt_dev,
13262306a36Sopenharmony_ci			     int ep_index) { }
13362306a36Sopenharmony_cistatic inline void
13462306a36Sopenharmony_cixhci_debugfs_remove_endpoint(struct xhci_hcd *xhci,
13562306a36Sopenharmony_ci			     struct xhci_virt_device *virt_dev,
13662306a36Sopenharmony_ci			     int ep_index) { }
13762306a36Sopenharmony_cistatic inline void
13862306a36Sopenharmony_cixhci_debugfs_create_stream_files(struct xhci_hcd *xhci,
13962306a36Sopenharmony_ci				 struct xhci_virt_device *virt_dev,
14062306a36Sopenharmony_ci				 int ep_index) { }
14162306a36Sopenharmony_ci#endif /* CONFIG_DEBUG_FS */
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#endif /* __LINUX_XHCI_DEBUGFS_H */
144