xref: /linux/drivers/pci/controller/cadence/pcie-cadence-debugfs.c (revision 570f7e331f5febb30f1384817463c7e42b65ca7d)
1ea34744eSHans Zhang // SPDX-License-Identifier: GPL-2.0
2ea34744eSHans Zhang /*
3ea34744eSHans Zhang  * Cadence PCIe controller debugfs driver
4ea34744eSHans Zhang  *
5ea34744eSHans Zhang  * Copyright (C) 2026 Hans Zhang <18255117159@163.com>
6ea34744eSHans Zhang  */
7ea34744eSHans Zhang 
8ea34744eSHans Zhang #include <linux/bitfield.h>
9ea34744eSHans Zhang #include <linux/debugfs.h>
10ea34744eSHans Zhang #include <linux/seq_file.h>
11ea34744eSHans Zhang 
12ea34744eSHans Zhang #include "pcie-cadence.h"
13ea34744eSHans Zhang 
14ea34744eSHans Zhang #define CDNS_DEBUGFS_BUF_MAX		128
15ea34744eSHans Zhang 
16*d70e964dSHans Zhang static const char *cdns_pcie_lga_ltssm_status_string(enum cdns_pcie_lga_ltssm ltssm)
17*d70e964dSHans Zhang {
18*d70e964dSHans Zhang 	const char *str;
19*d70e964dSHans Zhang 
20*d70e964dSHans Zhang 	switch (ltssm) {
21*d70e964dSHans Zhang #define CDNS_PCIE_LGA_LTSSM_NAME(n) case n: str = #n; break
22*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_DETECT_QUIET);
23*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_DETECT_ACTIVE);
24*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_POLLING_ACTIVE);
25*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_POLLING_COMPLIANCE);
26*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_POLLING_CONFIGURATION);
27*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_LINKWIDTH_START);
28*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_LINKWIDTH_ACCEPT);
29*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_LANENUM_ACCEPT);
30*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_LANENUM_WAIT);
31*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_COMPLETE);
32*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_CONFIGURATION_IDLE);
33*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_RCVRLOCK);
34*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_SPEED);
35*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_RCVRCFG);
36*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_IDLE);
37*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_L0);
38*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RX_L0S_ENTRY);
39*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RX_L0S_IDLE);
40*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RX_L0S_FTS);
41*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_TX_L0S_ENTRY);
42*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_TX_L0S_IDLE);
43*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_TX_L0S_FTS);
44*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_L1_ENTRY);
45*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_L1_IDLE);
46*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_L2_IDLE);
47*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_L2_TRANSMITWAKE);
48*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_DISABLED);
49*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_ENTRY_MASTER);
50*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_ACTIVE_MASTER);
51*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_EXIT_MASTER);
52*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_ENTRY_SLAVE);
53*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_ACTIVE_SLAVE);
54*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_LOOPBACK_EXIT_SLAVE);
55*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_HOT_RESET);
56*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_EQUALIZATION_PHASE_0);
57*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_EQUALIZATION_PHASE_1);
58*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_EQUALIZATION_PHASE_2);
59*d70e964dSHans Zhang 	CDNS_PCIE_LGA_LTSSM_NAME(CDNS_PCIE_LGA_LTSSM_RECOVERY_EQUALIZATION_PHASE_3);
60*d70e964dSHans Zhang 	default:
61*d70e964dSHans Zhang 		str = "CDNS_PCIE_LGA_LTSSM_UNKNOWN";
62*d70e964dSHans Zhang 		break;
63*d70e964dSHans Zhang 	}
64*d70e964dSHans Zhang 
65*d70e964dSHans Zhang 	return str + strlen("CDNS_PCIE_LGA_LTSSM_");
66*d70e964dSHans Zhang }
67*d70e964dSHans Zhang 
68ea34744eSHans Zhang static const char *cdns_pcie_hpa_ltssm_status_string(enum cdns_pcie_hpa_ltssm ltssm)
69ea34744eSHans Zhang {
70ea34744eSHans Zhang 	const char *str;
71ea34744eSHans Zhang 
72ea34744eSHans Zhang 	switch (ltssm) {
73ea34744eSHans Zhang #define CDNS_PCIE_HPA_LTSSM_NAME(n) case n: str = #n; break
74ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_QUIET);
75ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_QUIET_ENTRY);
76ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_ACTIVE);
77ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_ACTIVE_1);
78ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_ACTIVE_2);
79ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DETECT_ACTIVE_3);
80ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RCVR_DETECTED_ST);
81ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RCVR_DETECTED_1);
82ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_ACTIVE);
83ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_ACTIVE_1);
84ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_ACTIVE_2);
85ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_ACTIVE_3);
86ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE);
87ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_1);
88ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_CONFIG);
89ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_CONFIG_1);
90ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_CONFIG_2);
91ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_RC);
92ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_RC_1);
93ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_RC_2);
94ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_ACC_RC);
95ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_WAIT_RC);
96ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_WAIT_RC_1);
97ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_ACC_RC);
98ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_EP);
99ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_EP_1);
100ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_START_EP_2);
101ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LW_ACC_EP);
102ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_WAIT_EP);
103ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_WAIT_EP_1);
104ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_ACC_EP);
105ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_LANENUM_ACC_EP_1);
106ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DUMMY_STATE_1);
107ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_COMPLETE);
108ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_COMPLETE_1);
109ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_COMPLETE_2);
110ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_IDLE);
111ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_CONFIG_IDLE_1);
112ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DUMMY_STATE_2);
113ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DUMMY_STATE_3);
114ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DUMMY_STATE_4);
115ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0_STATE);
116ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_RCVR_LOCK);
117ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_RCVR_LOCK_1);
118ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_RCVR_CFG);
119ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_RCVR_CFG_1);
120ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_IDLE);
121ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_IDLE_1);
122ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK);
123ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_1);
124ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_2);
125ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_3);
126ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_4);
127ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_5);
128ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_6);
129ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_DISABLE_LINK_7);
130ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_HOT_RESET);
131ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_HOT_RESET_1);
132ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_HOT_RESET_2);
133ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_HOT_RESET_3);
134ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_ENTRY);
135ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_1);
136ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_2);
137ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_3);
138ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_4);
139ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L0S_5);
140ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_WAIT_FOR_LINK_TX);
141ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_FTS_ENTRY);
142ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_FTS_1);
143ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_FTS_2);
144ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_ELEC_IDLE_ST);
145ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_ELEC_IDLE_1);
146ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_ELEC_IDLE_2);
147ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_TX_ELEC_IDLE_3);
148ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_SPEED);
149ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_SPEED_1);
150ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_SPEED_2);
151ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_SPEED_3);
152ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23);
153ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_1);
154ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_2);
155ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_3);
156ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_4);
157ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_5);
158ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_6);
159ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_7);
160ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_POLLING_COMPLIANCE_GEN23_8);
161ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_ENTRY);
162ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_ENTRY_FROM_RECOVERY);
163ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_EXIT_1);
164ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_EXIT);
165ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_GEN2_1);
166ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_GEN2_2);
167ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_GEN2_3);
168ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_GEN2_4);
169ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_GEN2_5);
170ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_SLAVE_ACTIVE);
171ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_ENTRY);
172ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_1);
173ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_2);
174ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_3);
175ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_4);
176ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_IDLE);
177ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L1_EXIT);
178ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_ENTRY);
179ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_1);
180ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_2);
181ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_3);
182ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_4);
183ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_5);
184ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_L2_IDLE);
185ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY);
186ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_1);
187ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_2);
188ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_3);
189ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_4);
190ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_5);
191ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ENTRY_FROM_RECOVERY);
192ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_ACTIVE);
193ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_EXIT);
194ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_EXIT_1);
195ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_LOOPBACK_MASTER_EXIT_2);
196ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE0);
197ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE1);
198ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE2_1);
199ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE2_2);
200ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE3_1);
201ea34744eSHans Zhang 	CDNS_PCIE_HPA_LTSSM_NAME(CDNS_PCIE_HPA_LTSSM_RECOVERY_EQUALIZATION_PHASE3_2);
202ea34744eSHans Zhang 	default:
203ea34744eSHans Zhang 		str = "CDNS_PCIE_HPA_LTSSM_UNKNOWN";
204ea34744eSHans Zhang 		break;
205ea34744eSHans Zhang 	}
206ea34744eSHans Zhang 
207ea34744eSHans Zhang 	return str + strlen("CDNS_PCIE_HPA_LTSSM_");
208ea34744eSHans Zhang }
209ea34744eSHans Zhang 
210ea34744eSHans Zhang static int ltssm_status_show(struct seq_file *s, void *v)
211ea34744eSHans Zhang {
212ea34744eSHans Zhang 	struct cdns_pcie *pci = s->private;
213*d70e964dSHans Zhang 	enum cdns_pcie_lga_ltssm lga_ltssm;
214ea34744eSHans Zhang 	enum cdns_pcie_hpa_ltssm hpa_ltssm;
215ea34744eSHans Zhang 	const char *str_ltssm;
216ea34744eSHans Zhang 	u32 val;
217ea34744eSHans Zhang 
218ea34744eSHans Zhang 	if (pci->is_hpa) {
219ea34744eSHans Zhang 		val = cdns_pcie_hpa_readl(pci, REG_BANK_IP_REG,
220ea34744eSHans Zhang 					  CDNS_PCIE_HPA_PHY_DBG_STS_REG0);
221ea34744eSHans Zhang 		hpa_ltssm = FIELD_GET(CDNS_PCIE_HPA_LTSSM_STATUS_MASK, val);
222ea34744eSHans Zhang 		str_ltssm = cdns_pcie_hpa_ltssm_status_string(hpa_ltssm);
223ea34744eSHans Zhang 	} else {
224*d70e964dSHans Zhang 		val = cdns_pcie_readl(pci, CDNS_PCIE_LM_BASE);
225*d70e964dSHans Zhang 		lga_ltssm = FIELD_GET(CDNS_PCIE_LGA_LTSSM_STATUS_MASK, val);
226*d70e964dSHans Zhang 		str_ltssm = cdns_pcie_lga_ltssm_status_string(lga_ltssm);
227ea34744eSHans Zhang 	}
228ea34744eSHans Zhang 
229*d70e964dSHans Zhang 	seq_printf(s, "%s (0x%02x)\n", str_ltssm,
230*d70e964dSHans Zhang 		   pci->is_hpa ? hpa_ltssm : lga_ltssm);
231ea34744eSHans Zhang 
232ea34744eSHans Zhang 	return 0;
233ea34744eSHans Zhang }
234ea34744eSHans Zhang 
235ea34744eSHans Zhang DEFINE_SHOW_ATTRIBUTE(ltssm_status);
236ea34744eSHans Zhang 
237ea34744eSHans Zhang static void cdns_pcie_ltssm_debugfs_init(struct cdns_pcie *pci, struct dentry *dir)
238ea34744eSHans Zhang {
239ea34744eSHans Zhang 	debugfs_create_file("ltssm_status", 0444, dir, pci,
240ea34744eSHans Zhang 			    &ltssm_status_fops);
241ea34744eSHans Zhang }
242ea34744eSHans Zhang 
243ea34744eSHans Zhang void cdns_pcie_debugfs_deinit(struct cdns_pcie *pci)
244ea34744eSHans Zhang {
245ea34744eSHans Zhang 	if (!pci->debug_dir)
246ea34744eSHans Zhang 		return;
247ea34744eSHans Zhang 
248ea34744eSHans Zhang 	debugfs_remove_recursive(pci->debug_dir);
249ea34744eSHans Zhang }
250ea34744eSHans Zhang EXPORT_SYMBOL_GPL(cdns_pcie_debugfs_deinit);
251ea34744eSHans Zhang 
252ea34744eSHans Zhang void cdns_pcie_debugfs_init(struct cdns_pcie *pci)
253ea34744eSHans Zhang {
254ea34744eSHans Zhang 	char dirname[CDNS_DEBUGFS_BUF_MAX];
255ea34744eSHans Zhang 	struct device *dev = pci->dev;
256ea34744eSHans Zhang 
257ea34744eSHans Zhang 	/* Create main directory for each platform driver. */
258ea34744eSHans Zhang 	snprintf(dirname, CDNS_DEBUGFS_BUF_MAX, "cdns_pcie_%s", dev_name(dev));
259ea34744eSHans Zhang 	pci->debug_dir = debugfs_create_dir(dirname, NULL);
260ea34744eSHans Zhang 
261ea34744eSHans Zhang 	cdns_pcie_ltssm_debugfs_init(pci, pci->debug_dir);
262ea34744eSHans Zhang }
263ea34744eSHans Zhang EXPORT_SYMBOL_GPL(cdns_pcie_debugfs_init);
264