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 <ssm_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