Blame view

drivers/scsi/ufs/ufs-qcom.h 7.52 KB
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 and
   * only version 2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   */
  
  #ifndef UFS_QCOM_H_
  #define UFS_QCOM_H_
  
  #define MAX_UFS_QCOM_HOSTS	1
  #define MAX_U32                 (~(u32)0)
  #define MPHY_TX_FSM_STATE       0x41
  #define TX_FSM_HIBERN8          0x1
  #define HBRN8_POLL_TOUT_MS      100
  #define DEFAULT_CLK_RATE_HZ     1000000
  #define BUS_VECTOR_NAME_LEN     32
  
  #define UFS_HW_VER_MAJOR_SHFT	(28)
  #define UFS_HW_VER_MAJOR_MASK	(0x000F << UFS_HW_VER_MAJOR_SHFT)
  #define UFS_HW_VER_MINOR_SHFT	(16)
  #define UFS_HW_VER_MINOR_MASK	(0x0FFF << UFS_HW_VER_MINOR_SHFT)
  #define UFS_HW_VER_STEP_SHFT	(0)
  #define UFS_HW_VER_STEP_MASK	(0xFFFF << UFS_HW_VER_STEP_SHFT)
  
  /* vendor specific pre-defined parameters */
  #define SLOW 1
  #define FAST 2
  
  #define UFS_QCOM_LIMIT_NUM_LANES_RX	2
  #define UFS_QCOM_LIMIT_NUM_LANES_TX	2
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
38
39
  #define UFS_QCOM_LIMIT_HSGEAR_RX	UFS_HS_G3
  #define UFS_QCOM_LIMIT_HSGEAR_TX	UFS_HS_G3
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  #define UFS_QCOM_LIMIT_PWMGEAR_RX	UFS_PWM_G4
  #define UFS_QCOM_LIMIT_PWMGEAR_TX	UFS_PWM_G4
  #define UFS_QCOM_LIMIT_RX_PWR_PWM	SLOW_MODE
  #define UFS_QCOM_LIMIT_TX_PWR_PWM	SLOW_MODE
  #define UFS_QCOM_LIMIT_RX_PWR_HS	FAST_MODE
  #define UFS_QCOM_LIMIT_TX_PWR_HS	FAST_MODE
  #define UFS_QCOM_LIMIT_HS_RATE		PA_HS_MODE_B
  #define UFS_QCOM_LIMIT_DESIRED_MODE	FAST
  
  /* QCOM UFS host controller vendor specific registers */
  enum {
  	REG_UFS_SYS1CLK_1US                 = 0xC0,
  	REG_UFS_TX_SYMBOL_CLK_NS_US         = 0xC4,
  	REG_UFS_LOCAL_PORT_ID_REG           = 0xC8,
  	REG_UFS_PA_ERR_CODE                 = 0xCC,
  	REG_UFS_RETRY_TIMER_REG             = 0xD0,
  	REG_UFS_PA_LINK_STARTUP_TIMER       = 0xD8,
  	REG_UFS_CFG1                        = 0xDC,
  	REG_UFS_CFG2                        = 0xE0,
  	REG_UFS_HW_VERSION                  = 0xE4,
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
60
61
62
63
64
  	UFS_TEST_BUS				= 0xE8,
  	UFS_TEST_BUS_CTRL_0			= 0xEC,
  	UFS_TEST_BUS_CTRL_1			= 0xF0,
  	UFS_TEST_BUS_CTRL_2			= 0xF4,
  	UFS_UNIPRO_CFG				= 0xF8,
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
65
66
67
68
69
  	/*
  	 * QCOM UFS host controller vendor specific registers
  	 * added in HW Version 3.0.0
  	 */
  	UFS_AH8_CFG				= 0xFC,
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
70
71
72
73
  };
  
  /* QCOM UFS host controller vendor specific debug registers */
  enum {
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  	UFS_DBG_RD_REG_UAWM			= 0x100,
  	UFS_DBG_RD_REG_UARM			= 0x200,
  	UFS_DBG_RD_REG_TXUC			= 0x300,
  	UFS_DBG_RD_REG_RXUC			= 0x400,
  	UFS_DBG_RD_REG_DFC			= 0x500,
  	UFS_DBG_RD_REG_TRLUT			= 0x600,
  	UFS_DBG_RD_REG_TMRLUT			= 0x700,
  	UFS_UFS_DBG_RD_REG_OCSC			= 0x800,
  
  	UFS_UFS_DBG_RD_DESC_RAM			= 0x1500,
  	UFS_UFS_DBG_RD_PRDT_RAM			= 0x1700,
  	UFS_UFS_DBG_RD_RESP_RAM			= 0x1800,
  	UFS_UFS_DBG_RD_EDTL_RAM			= 0x1900,
  };
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
88
89
90
91
92
  #define UFS_CNTLR_2_x_x_VEN_REGS_OFFSET(x)	(0x000 + x)
  #define UFS_CNTLR_3_x_x_VEN_REGS_OFFSET(x)	(0x400 + x)
  
  /* bit definitions for REG_UFS_CFG1 register */
  #define QUNIPRO_SEL	UFS_BIT(0)
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
93
94
  #define TEST_BUS_EN		BIT(18)
  #define TEST_BUS_SEL		GENMASK(22, 19)
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
95
96
97
98
99
100
101
102
103
  /* bit definitions for REG_UFS_CFG2 register */
  #define UAWM_HW_CGC_EN		(1 << 0)
  #define UARM_HW_CGC_EN		(1 << 1)
  #define TXUC_HW_CGC_EN		(1 << 2)
  #define RXUC_HW_CGC_EN		(1 << 3)
  #define DFC_HW_CGC_EN		(1 << 4)
  #define TRLUT_HW_CGC_EN		(1 << 5)
  #define TMRLUT_HW_CGC_EN	(1 << 6)
  #define OCSC_HW_CGC_EN		(1 << 7)
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
104
105
  /* bit definition for UFS_UFS_TEST_BUS_CTRL_n */
  #define TEST_BUS_SUB_SEL_MASK	0x1F  /* All XXX_SEL fields are 5 bits wide */
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  #define REG_UFS_CFG2_CGC_EN_ALL (UAWM_HW_CGC_EN | UARM_HW_CGC_EN |\
  				 TXUC_HW_CGC_EN | RXUC_HW_CGC_EN |\
  				 DFC_HW_CGC_EN | TRLUT_HW_CGC_EN |\
  				 TMRLUT_HW_CGC_EN | OCSC_HW_CGC_EN)
  
  /* bit offset */
  enum {
  	OFFSET_UFS_PHY_SOFT_RESET           = 1,
  	OFFSET_CLK_NS_REG                   = 10,
  };
  
  /* bit masks */
  enum {
  	MASK_UFS_PHY_SOFT_RESET             = 0x2,
  	MASK_TX_SYMBOL_CLK_1US_REG          = 0x3FF,
  	MASK_CLK_NS_REG                     = 0xFFFC00,
  };
  
  enum ufs_qcom_phy_init_type {
  	UFS_PHY_INIT_FULL,
  	UFS_PHY_INIT_CFG_RESTORE,
  };
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
128
129
130
131
132
133
134
135
  /* QCOM UFS debug print bit mask */
  #define UFS_QCOM_DBG_PRINT_REGS_EN	BIT(0)
  #define UFS_QCOM_DBG_PRINT_ICE_REGS_EN	BIT(1)
  #define UFS_QCOM_DBG_PRINT_TEST_BUS_EN	BIT(2)
  
  #define UFS_QCOM_DBG_PRINT_ALL	\
  	(UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_ICE_REGS_EN | \
  	 UFS_QCOM_DBG_PRINT_TEST_BUS_EN)
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
136
137
138
139
140
  /* QUniPro Vendor specific attributes */
  #define DME_VS_CORE_CLK_CTRL	0xD002
  /* bit and mask definitions for DME_VS_CORE_CLK_CTRL attribute */
  #define DME_VS_CORE_CLK_CTRL_CORE_CLK_DIV_EN_BIT		BIT(8)
  #define DME_VS_CORE_CLK_CTRL_MAX_CORE_CLK_1US_CYCLES_MASK	0xFF
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  static inline void
  ufs_qcom_get_controller_revision(struct ufs_hba *hba,
  				 u8 *major, u16 *minor, u16 *step)
  {
  	u32 ver = ufshcd_readl(hba, REG_UFS_HW_VERSION);
  
  	*major = (ver & UFS_HW_VER_MAJOR_MASK) >> UFS_HW_VER_MAJOR_SHFT;
  	*minor = (ver & UFS_HW_VER_MINOR_MASK) >> UFS_HW_VER_MINOR_SHFT;
  	*step = (ver & UFS_HW_VER_STEP_MASK) >> UFS_HW_VER_STEP_SHFT;
  };
  
  static inline void ufs_qcom_assert_reset(struct ufs_hba *hba)
  {
  	ufshcd_rmwl(hba, MASK_UFS_PHY_SOFT_RESET,
  			1 << OFFSET_UFS_PHY_SOFT_RESET, REG_UFS_CFG1);
  
  	/*
  	 * Make sure assertion of ufs phy reset is written to
  	 * register before returning
  	 */
  	mb();
  }
  
  static inline void ufs_qcom_deassert_reset(struct ufs_hba *hba)
  {
  	ufshcd_rmwl(hba, MASK_UFS_PHY_SOFT_RESET,
  			0 << OFFSET_UFS_PHY_SOFT_RESET, REG_UFS_CFG1);
  
  	/*
  	 * Make sure de-assertion of ufs phy reset is written to
  	 * register before returning
  	 */
  	mb();
  }
  
  struct ufs_qcom_bus_vote {
  	uint32_t client_handle;
  	uint32_t curr_vote;
  	int min_bw_vote;
  	int max_bw_vote;
  	int saved_vote;
  	bool is_max_bw_needed;
  	struct device_attribute max_bus_bw;
  };
bfdbe8ba2   Yaniv Gardi   ufs-qcom: save co...
185
186
187
188
189
190
  /* Host controller hardware version: major.minor.step */
  struct ufs_hw_version {
  	u16 step;
  	u16 minor;
  	u8 major;
  };
cad2e03d8   Yaniv Gardi   ufs: add support ...
191

6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
192
193
194
195
196
197
  struct ufs_qcom_testbus {
  	u8 select_major;
  	u8 select_minor;
  };
  
  struct ufs_qcom_host {
cad2e03d8   Yaniv Gardi   ufs: add support ...
198
199
200
201
202
203
204
  	/*
  	 * Set this capability if host controller supports the QUniPro mode
  	 * and if driver wants the Host controller to operate in QUniPro mode.
  	 * Note: By default this capability will be kept enabled if host
  	 * controller supports the QUniPro mode.
  	 */
  	#define UFS_QCOM_CAP_QUNIPRO	UFS_BIT(0)
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
205
206
207
208
209
210
  
  	/*
  	 * Set this capability if host controller can retain the secure
  	 * configuration even after UFS controller core power collapse.
  	 */
  	#define UFS_QCOM_CAP_RETAIN_SEC_CFG_AFTER_PWR_COLLAPSE	UFS_BIT(1)
cad2e03d8   Yaniv Gardi   ufs: add support ...
211
  	u32 caps;
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
212
213
214
215
216
217
218
219
220
  	struct phy *generic_phy;
  	struct ufs_hba *hba;
  	struct ufs_qcom_bus_vote bus_vote;
  	struct ufs_pa_layer_attr dev_req_params;
  	struct clk *rx_l0_sync_clk;
  	struct clk *tx_l0_sync_clk;
  	struct clk *rx_l1_sync_clk;
  	struct clk *tx_l1_sync_clk;
  	bool is_lane_clks_enabled;
bfdbe8ba2   Yaniv Gardi   ufs-qcom: save co...
221

f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
222
223
  	void __iomem *dev_ref_clk_ctrl_mmio;
  	bool is_dev_ref_clk_enabled;
bfdbe8ba2   Yaniv Gardi   ufs-qcom: save co...
224
  	struct ufs_hw_version hw_ver;
f06fcc715   Yaniv Gardi   scsi: ufs-qcom: a...
225
226
  
  	u32 dev_ref_clk_en_mask;
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
227
228
229
  	/* Bitmask for enabling debug prints */
  	u32 dbg_print_en;
  	struct ufs_qcom_testbus testbus;
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
230
  };
eba5ed353   Yaniv Gardi   scsi: ufs-qcom: a...
231
232
233
234
235
236
237
238
  static inline u32
  ufs_qcom_get_debug_reg_offset(struct ufs_qcom_host *host, u32 reg)
  {
  	if (host->hw_ver.major <= 0x02)
  		return UFS_CNTLR_2_x_x_VEN_REGS_OFFSET(reg);
  
  	return UFS_CNTLR_3_x_x_VEN_REGS_OFFSET(reg);
  };
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
239
240
241
  #define ufs_qcom_is_link_off(hba) ufshcd_is_link_off(hba)
  #define ufs_qcom_is_link_active(hba) ufshcd_is_link_active(hba)
  #define ufs_qcom_is_link_hibern8(hba) ufshcd_is_link_hibern8(hba)
6e3fd44d7   Yaniv Gardi   scsi: ufs-qcom: a...
242
  int ufs_qcom_testbus_config(struct ufs_qcom_host *host);
cad2e03d8   Yaniv Gardi   ufs: add support ...
243
244
245
246
247
248
249
  static inline bool ufs_qcom_cap_qunipro(struct ufs_qcom_host *host)
  {
  	if (host->caps & UFS_QCOM_CAP_QUNIPRO)
  		return true;
  	else
  		return false;
  }
81c0fc51b   Yaniv Gardi   ufs-qcom: add sup...
250
  #endif /* UFS_QCOM_H_ */