diff options
Diffstat (limited to 'drivers/scsi/ufs/ufs-qcom.h')
-rw-r--r-- | drivers/scsi/ufs/ufs-qcom.h | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/drivers/scsi/ufs/ufs-qcom.h b/drivers/scsi/ufs/ufs-qcom.h index db2c0a00e846..36249b35f858 100644 --- a/drivers/scsi/ufs/ufs-qcom.h +++ b/drivers/scsi/ufs/ufs-qcom.h | |||
@@ -35,8 +35,8 @@ | |||
35 | 35 | ||
36 | #define UFS_QCOM_LIMIT_NUM_LANES_RX 2 | 36 | #define UFS_QCOM_LIMIT_NUM_LANES_RX 2 |
37 | #define UFS_QCOM_LIMIT_NUM_LANES_TX 2 | 37 | #define UFS_QCOM_LIMIT_NUM_LANES_TX 2 |
38 | #define UFS_QCOM_LIMIT_HSGEAR_RX UFS_HS_G2 | 38 | #define UFS_QCOM_LIMIT_HSGEAR_RX UFS_HS_G3 |
39 | #define UFS_QCOM_LIMIT_HSGEAR_TX UFS_HS_G2 | 39 | #define UFS_QCOM_LIMIT_HSGEAR_TX UFS_HS_G3 |
40 | #define UFS_QCOM_LIMIT_PWMGEAR_RX UFS_PWM_G4 | 40 | #define UFS_QCOM_LIMIT_PWMGEAR_RX UFS_PWM_G4 |
41 | #define UFS_QCOM_LIMIT_PWMGEAR_TX UFS_PWM_G4 | 41 | #define UFS_QCOM_LIMIT_PWMGEAR_TX UFS_PWM_G4 |
42 | #define UFS_QCOM_LIMIT_RX_PWR_PWM SLOW_MODE | 42 | #define UFS_QCOM_LIMIT_RX_PWR_PWM SLOW_MODE |
@@ -58,6 +58,21 @@ enum { | |||
58 | REG_UFS_CFG2 = 0xE0, | 58 | REG_UFS_CFG2 = 0xE0, |
59 | REG_UFS_HW_VERSION = 0xE4, | 59 | REG_UFS_HW_VERSION = 0xE4, |
60 | 60 | ||
61 | UFS_TEST_BUS = 0xE8, | ||
62 | UFS_TEST_BUS_CTRL_0 = 0xEC, | ||
63 | UFS_TEST_BUS_CTRL_1 = 0xF0, | ||
64 | UFS_TEST_BUS_CTRL_2 = 0xF4, | ||
65 | UFS_UNIPRO_CFG = 0xF8, | ||
66 | |||
67 | /* | ||
68 | * QCOM UFS host controller vendor specific registers | ||
69 | * added in HW Version 3.0.0 | ||
70 | */ | ||
71 | UFS_AH8_CFG = 0xFC, | ||
72 | }; | ||
73 | |||
74 | /* QCOM UFS host controller vendor specific debug registers */ | ||
75 | enum { | ||
61 | UFS_DBG_RD_REG_UAWM = 0x100, | 76 | UFS_DBG_RD_REG_UAWM = 0x100, |
62 | UFS_DBG_RD_REG_UARM = 0x200, | 77 | UFS_DBG_RD_REG_UARM = 0x200, |
63 | UFS_DBG_RD_REG_TXUC = 0x300, | 78 | UFS_DBG_RD_REG_TXUC = 0x300, |
@@ -73,6 +88,14 @@ enum { | |||
73 | UFS_UFS_DBG_RD_EDTL_RAM = 0x1900, | 88 | UFS_UFS_DBG_RD_EDTL_RAM = 0x1900, |
74 | }; | 89 | }; |
75 | 90 | ||
91 | #define UFS_CNTLR_2_x_x_VEN_REGS_OFFSET(x) (0x000 + x) | ||
92 | #define UFS_CNTLR_3_x_x_VEN_REGS_OFFSET(x) (0x400 + x) | ||
93 | |||
94 | /* bit definitions for REG_UFS_CFG1 register */ | ||
95 | #define QUNIPRO_SEL UFS_BIT(0) | ||
96 | #define TEST_BUS_EN BIT(18) | ||
97 | #define TEST_BUS_SEL GENMASK(22, 19) | ||
98 | |||
76 | /* bit definitions for REG_UFS_CFG2 register */ | 99 | /* bit definitions for REG_UFS_CFG2 register */ |
77 | #define UAWM_HW_CGC_EN (1 << 0) | 100 | #define UAWM_HW_CGC_EN (1 << 0) |
78 | #define UARM_HW_CGC_EN (1 << 1) | 101 | #define UARM_HW_CGC_EN (1 << 1) |
@@ -83,6 +106,9 @@ enum { | |||
83 | #define TMRLUT_HW_CGC_EN (1 << 6) | 106 | #define TMRLUT_HW_CGC_EN (1 << 6) |
84 | #define OCSC_HW_CGC_EN (1 << 7) | 107 | #define OCSC_HW_CGC_EN (1 << 7) |
85 | 108 | ||
109 | /* bit definition for UFS_UFS_TEST_BUS_CTRL_n */ | ||
110 | #define TEST_BUS_SUB_SEL_MASK 0x1F /* All XXX_SEL fields are 5 bits wide */ | ||
111 | |||
86 | #define REG_UFS_CFG2_CGC_EN_ALL (UAWM_HW_CGC_EN | UARM_HW_CGC_EN |\ | 112 | #define REG_UFS_CFG2_CGC_EN_ALL (UAWM_HW_CGC_EN | UARM_HW_CGC_EN |\ |
87 | TXUC_HW_CGC_EN | RXUC_HW_CGC_EN |\ | 113 | TXUC_HW_CGC_EN | RXUC_HW_CGC_EN |\ |
88 | DFC_HW_CGC_EN | TRLUT_HW_CGC_EN |\ | 114 | DFC_HW_CGC_EN | TRLUT_HW_CGC_EN |\ |
@@ -106,6 +132,21 @@ enum ufs_qcom_phy_init_type { | |||
106 | UFS_PHY_INIT_CFG_RESTORE, | 132 | UFS_PHY_INIT_CFG_RESTORE, |
107 | }; | 133 | }; |
108 | 134 | ||
135 | /* QCOM UFS debug print bit mask */ | ||
136 | #define UFS_QCOM_DBG_PRINT_REGS_EN BIT(0) | ||
137 | #define UFS_QCOM_DBG_PRINT_ICE_REGS_EN BIT(1) | ||
138 | #define UFS_QCOM_DBG_PRINT_TEST_BUS_EN BIT(2) | ||
139 | |||
140 | #define UFS_QCOM_DBG_PRINT_ALL \ | ||
141 | (UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_ICE_REGS_EN | \ | ||
142 | UFS_QCOM_DBG_PRINT_TEST_BUS_EN) | ||
143 | |||
144 | /* QUniPro Vendor specific attributes */ | ||
145 | #define DME_VS_CORE_CLK_CTRL 0xD002 | ||
146 | /* bit and mask definitions for DME_VS_CORE_CLK_CTRL attribute */ | ||
147 | #define DME_VS_CORE_CLK_CTRL_CORE_CLK_DIV_EN_BIT BIT(8) | ||
148 | #define DME_VS_CORE_CLK_CTRL_MAX_CORE_CLK_1US_CYCLES_MASK 0xFF | ||
149 | |||
109 | static inline void | 150 | static inline void |
110 | ufs_qcom_get_controller_revision(struct ufs_hba *hba, | 151 | ufs_qcom_get_controller_revision(struct ufs_hba *hba, |
111 | u8 *major, u16 *minor, u16 *step) | 152 | u8 *major, u16 *minor, u16 *step) |
@@ -157,8 +198,13 @@ struct ufs_hw_version { | |||
157 | u16 minor; | 198 | u16 minor; |
158 | u8 major; | 199 | u8 major; |
159 | }; | 200 | }; |
160 | struct ufs_qcom_host { | ||
161 | 201 | ||
202 | struct ufs_qcom_testbus { | ||
203 | u8 select_major; | ||
204 | u8 select_minor; | ||
205 | }; | ||
206 | |||
207 | struct ufs_qcom_host { | ||
162 | /* | 208 | /* |
163 | * Set this capability if host controller supports the QUniPro mode | 209 | * Set this capability if host controller supports the QUniPro mode |
164 | * and if driver wants the Host controller to operate in QUniPro mode. | 210 | * and if driver wants the Host controller to operate in QUniPro mode. |
@@ -166,6 +212,12 @@ struct ufs_qcom_host { | |||
166 | * controller supports the QUniPro mode. | 212 | * controller supports the QUniPro mode. |
167 | */ | 213 | */ |
168 | #define UFS_QCOM_CAP_QUNIPRO UFS_BIT(0) | 214 | #define UFS_QCOM_CAP_QUNIPRO UFS_BIT(0) |
215 | |||
216 | /* | ||
217 | * Set this capability if host controller can retain the secure | ||
218 | * configuration even after UFS controller core power collapse. | ||
219 | */ | ||
220 | #define UFS_QCOM_CAP_RETAIN_SEC_CFG_AFTER_PWR_COLLAPSE UFS_BIT(1) | ||
169 | u32 caps; | 221 | u32 caps; |
170 | 222 | ||
171 | struct phy *generic_phy; | 223 | struct phy *generic_phy; |
@@ -178,13 +230,23 @@ struct ufs_qcom_host { | |||
178 | struct clk *tx_l1_sync_clk; | 230 | struct clk *tx_l1_sync_clk; |
179 | bool is_lane_clks_enabled; | 231 | bool is_lane_clks_enabled; |
180 | 232 | ||
233 | void __iomem *dev_ref_clk_ctrl_mmio; | ||
234 | bool is_dev_ref_clk_enabled; | ||
181 | struct ufs_hw_version hw_ver; | 235 | struct ufs_hw_version hw_ver; |
236 | |||
237 | u32 dev_ref_clk_en_mask; | ||
238 | |||
239 | /* Bitmask for enabling debug prints */ | ||
240 | u32 dbg_print_en; | ||
241 | struct ufs_qcom_testbus testbus; | ||
182 | }; | 242 | }; |
183 | 243 | ||
184 | #define ufs_qcom_is_link_off(hba) ufshcd_is_link_off(hba) | 244 | #define ufs_qcom_is_link_off(hba) ufshcd_is_link_off(hba) |
185 | #define ufs_qcom_is_link_active(hba) ufshcd_is_link_active(hba) | 245 | #define ufs_qcom_is_link_active(hba) ufshcd_is_link_active(hba) |
186 | #define ufs_qcom_is_link_hibern8(hba) ufshcd_is_link_hibern8(hba) | 246 | #define ufs_qcom_is_link_hibern8(hba) ufshcd_is_link_hibern8(hba) |
187 | 247 | ||
248 | int ufs_qcom_testbus_config(struct ufs_qcom_host *host); | ||
249 | |||
188 | static inline bool ufs_qcom_cap_qunipro(struct ufs_qcom_host *host) | 250 | static inline bool ufs_qcom_cap_qunipro(struct ufs_qcom_host *host) |
189 | { | 251 | { |
190 | if (host->caps & UFS_QCOM_CAP_QUNIPRO) | 252 | if (host->caps & UFS_QCOM_CAP_QUNIPRO) |