xref: /linux/drivers/ufs/host/ufs-qcom.h (revision 5a738cfe49b2cc0896353c0b33dc5cc81316aabe)
197fb5e8dSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
281c0fc51SYaniv Gardi /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
381c0fc51SYaniv Gardi  */
481c0fc51SYaniv Gardi 
581c0fc51SYaniv Gardi #ifndef UFS_QCOM_H_
681c0fc51SYaniv Gardi #define UFS_QCOM_H_
781c0fc51SYaniv Gardi 
812fd5f25SEvan Green #include <linux/reset-controller.h>
9870b1279SCan Guo #include <linux/reset.h>
1056541c7cSAbel Vesa #include <soc/qcom/ice.h>
11dd11376bSBart Van Assche #include <ufs/ufshcd.h>
1212fd5f25SEvan Green 
1381c0fc51SYaniv Gardi #define MAX_UFS_QCOM_HOSTS	1
1481c0fc51SYaniv Gardi #define MAX_U32                 (~(u32)0)
1581c0fc51SYaniv Gardi #define MPHY_TX_FSM_STATE       0x41
1681c0fc51SYaniv Gardi #define TX_FSM_HIBERN8          0x1
1781c0fc51SYaniv Gardi #define HBRN8_POLL_TOUT_MS      100
1881c0fc51SYaniv Gardi #define DEFAULT_CLK_RATE_HZ     1000000
1981c0fc51SYaniv Gardi #define BUS_VECTOR_NAME_LEN     32
207224c806SAsutosh Das #define MAX_SUPP_MAC		64
2181c0fc51SYaniv Gardi 
2218fe2ab7SManivannan Sadhasivam #define UFS_HW_VER_MAJOR_MASK	GENMASK(31, 28)
2318fe2ab7SManivannan Sadhasivam #define UFS_HW_VER_MINOR_MASK	GENMASK(27, 16)
2418fe2ab7SManivannan Sadhasivam #define UFS_HW_VER_STEP_MASK	GENMASK(15, 0)
2581c0fc51SYaniv Gardi 
2681c0fc51SYaniv Gardi /* vendor specific pre-defined parameters */
2781c0fc51SYaniv Gardi #define SLOW 1
2881c0fc51SYaniv Gardi #define FAST 2
2981c0fc51SYaniv Gardi 
3081c0fc51SYaniv Gardi #define UFS_QCOM_LIMIT_HS_RATE		PA_HS_MODE_B
3181c0fc51SYaniv Gardi 
3281c0fc51SYaniv Gardi /* QCOM UFS host controller vendor specific registers */
3381c0fc51SYaniv Gardi enum {
3481c0fc51SYaniv Gardi 	REG_UFS_SYS1CLK_1US                 = 0xC0,
3581c0fc51SYaniv Gardi 	REG_UFS_TX_SYMBOL_CLK_NS_US         = 0xC4,
3681c0fc51SYaniv Gardi 	REG_UFS_LOCAL_PORT_ID_REG           = 0xC8,
3781c0fc51SYaniv Gardi 	REG_UFS_PA_ERR_CODE                 = 0xCC,
387959587fSManivannan Sadhasivam 	/* On older UFS revisions, this register is called "RETRY_TIMER_REG" */
397959587fSManivannan Sadhasivam 	REG_UFS_PARAM0                      = 0xD0,
409c02aa24SAbel Vesa 	/* On older UFS revisions, this register is called "REG_UFS_PA_LINK_STARTUP_TIMER" */
419c02aa24SAbel Vesa 	REG_UFS_CFG0                        = 0xD8,
4281c0fc51SYaniv Gardi 	REG_UFS_CFG1                        = 0xDC,
4381c0fc51SYaniv Gardi 	REG_UFS_CFG2                        = 0xE0,
4481c0fc51SYaniv Gardi 	REG_UFS_HW_VERSION                  = 0xE4,
4581c0fc51SYaniv Gardi 
466e3fd44dSYaniv Gardi 	UFS_TEST_BUS				= 0xE8,
476e3fd44dSYaniv Gardi 	UFS_TEST_BUS_CTRL_0			= 0xEC,
486e3fd44dSYaniv Gardi 	UFS_TEST_BUS_CTRL_1			= 0xF0,
496e3fd44dSYaniv Gardi 	UFS_TEST_BUS_CTRL_2			= 0xF4,
506e3fd44dSYaniv Gardi 	UFS_UNIPRO_CFG				= 0xF8,
516e3fd44dSYaniv Gardi 
52f06fcc71SYaniv Gardi 	/*
53f06fcc71SYaniv Gardi 	 * QCOM UFS host controller vendor specific registers
54f06fcc71SYaniv Gardi 	 * added in HW Version 3.0.0
55f06fcc71SYaniv Gardi 	 */
56f06fcc71SYaniv Gardi 	UFS_AH8_CFG				= 0xFC,
57519b6274SCan Guo 
58519b6274SCan Guo 	REG_UFS_CFG3				= 0x271C,
596e3fd44dSYaniv Gardi };
606e3fd44dSYaniv Gardi 
616e3fd44dSYaniv Gardi /* QCOM UFS host controller vendor specific debug registers */
626e3fd44dSYaniv Gardi enum {
6381c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_UAWM			= 0x100,
6481c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_UARM			= 0x200,
6581c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_TXUC			= 0x300,
6681c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_RXUC			= 0x400,
6781c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_DFC			= 0x500,
6881c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_TRLUT			= 0x600,
6981c0fc51SYaniv Gardi 	UFS_DBG_RD_REG_TMRLUT			= 0x700,
7081c0fc51SYaniv Gardi 	UFS_UFS_DBG_RD_REG_OCSC			= 0x800,
7181c0fc51SYaniv Gardi 
7281c0fc51SYaniv Gardi 	UFS_UFS_DBG_RD_DESC_RAM			= 0x1500,
7381c0fc51SYaniv Gardi 	UFS_UFS_DBG_RD_PRDT_RAM			= 0x1700,
7481c0fc51SYaniv Gardi 	UFS_UFS_DBG_RD_RESP_RAM			= 0x1800,
7581c0fc51SYaniv Gardi 	UFS_UFS_DBG_RD_EDTL_RAM			= 0x1900,
7681c0fc51SYaniv Gardi };
7781c0fc51SYaniv Gardi 
78f87b2c41SAsutosh Das enum {
79f87b2c41SAsutosh Das 	UFS_MEM_CQIS_VS		= 0x8,
80f87b2c41SAsutosh Das };
81f87b2c41SAsutosh Das 
82f06fcc71SYaniv Gardi #define UFS_CNTLR_2_x_x_VEN_REGS_OFFSET(x)	(0x000 + x)
83f06fcc71SYaniv Gardi #define UFS_CNTLR_3_x_x_VEN_REGS_OFFSET(x)	(0x400 + x)
84f06fcc71SYaniv Gardi 
859c02aa24SAbel Vesa /* bit definitions for REG_UFS_CFG0 register */
869c02aa24SAbel Vesa #define QUNIPRO_G4_SEL		BIT(5)
879c02aa24SAbel Vesa 
88f06fcc71SYaniv Gardi /* bit definitions for REG_UFS_CFG1 register */
8918fe2ab7SManivannan Sadhasivam #define QUNIPRO_SEL		BIT(0)
9018fe2ab7SManivannan Sadhasivam #define UFS_PHY_SOFT_RESET	BIT(1)
9118fe2ab7SManivannan Sadhasivam #define UTP_DBG_RAMS_EN		BIT(17)
926e3fd44dSYaniv Gardi #define TEST_BUS_EN		BIT(18)
936e3fd44dSYaniv Gardi #define TEST_BUS_SEL		GENMASK(22, 19)
949c46b867SVenkat Gopalakrishnan #define UFS_REG_TEST_BUS_EN	BIT(30)
956e3fd44dSYaniv Gardi 
9618fe2ab7SManivannan Sadhasivam #define UFS_PHY_RESET_ENABLE	1
9718fe2ab7SManivannan Sadhasivam #define UFS_PHY_RESET_DISABLE	0
9818fe2ab7SManivannan Sadhasivam 
9981c0fc51SYaniv Gardi /* bit definitions for REG_UFS_CFG2 register */
10018fe2ab7SManivannan Sadhasivam #define UAWM_HW_CGC_EN		BIT(0)
10118fe2ab7SManivannan Sadhasivam #define UARM_HW_CGC_EN		BIT(1)
10218fe2ab7SManivannan Sadhasivam #define TXUC_HW_CGC_EN		BIT(2)
10318fe2ab7SManivannan Sadhasivam #define RXUC_HW_CGC_EN		BIT(3)
10418fe2ab7SManivannan Sadhasivam #define DFC_HW_CGC_EN		BIT(4)
10518fe2ab7SManivannan Sadhasivam #define TRLUT_HW_CGC_EN		BIT(5)
10618fe2ab7SManivannan Sadhasivam #define TMRLUT_HW_CGC_EN	BIT(6)
10718fe2ab7SManivannan Sadhasivam #define OCSC_HW_CGC_EN		BIT(7)
10881c0fc51SYaniv Gardi 
1092c407fe9SManivannan Sadhasivam /* bit definitions for REG_UFS_PARAM0 */
1102c407fe9SManivannan Sadhasivam #define MAX_HS_GEAR_MASK	GENMASK(6, 4)
1112c407fe9SManivannan Sadhasivam #define UFS_QCOM_MAX_GEAR(x)	FIELD_GET(MAX_HS_GEAR_MASK, (x))
1122c407fe9SManivannan Sadhasivam 
1136e3fd44dSYaniv Gardi /* bit definition for UFS_UFS_TEST_BUS_CTRL_n */
11418fe2ab7SManivannan Sadhasivam #define TEST_BUS_SUB_SEL_MASK	GENMASK(4, 0)  /* All XXX_SEL fields are 5 bits wide */
1156e3fd44dSYaniv Gardi 
11681c0fc51SYaniv Gardi #define REG_UFS_CFG2_CGC_EN_ALL (UAWM_HW_CGC_EN | UARM_HW_CGC_EN |\
11781c0fc51SYaniv Gardi 				 TXUC_HW_CGC_EN | RXUC_HW_CGC_EN |\
11881c0fc51SYaniv Gardi 				 DFC_HW_CGC_EN | TRLUT_HW_CGC_EN |\
11981c0fc51SYaniv Gardi 				 TMRLUT_HW_CGC_EN | OCSC_HW_CGC_EN)
12081c0fc51SYaniv Gardi 
12181c0fc51SYaniv Gardi /* bit offset */
12218fe2ab7SManivannan Sadhasivam #define OFFSET_CLK_NS_REG		0xa
12381c0fc51SYaniv Gardi 
12481c0fc51SYaniv Gardi /* bit masks */
12518fe2ab7SManivannan Sadhasivam #define MASK_TX_SYMBOL_CLK_1US_REG	GENMASK(9, 0)
12618fe2ab7SManivannan Sadhasivam #define MASK_CLK_NS_REG			GENMASK(23, 10)
12781c0fc51SYaniv Gardi 
128f06fcc71SYaniv Gardi /* QUniPro Vendor specific attributes */
12956d4a186SSubhash Jadavani #define PA_VS_CONFIG_REG1	0x9000
130f06fcc71SYaniv Gardi #define DME_VS_CORE_CLK_CTRL	0xD002
131f06fcc71SYaniv Gardi /* bit and mask definitions for DME_VS_CORE_CLK_CTRL attribute */
13207d2290fSNitin Rawat #define CLK_1US_CYCLES_MASK_V4				GENMASK(27, 16)
13307d2290fSNitin Rawat #define CLK_1US_CYCLES_MASK				GENMASK(7, 0)
134f06fcc71SYaniv Gardi #define DME_VS_CORE_CLK_CTRL_CORE_CLK_DIV_EN_BIT	BIT(8)
135a53dfc00SNitin Rawat #define PA_VS_CORE_CLK_40NS_CYCLES			0x9007
136a53dfc00SNitin Rawat #define PA_VS_CORE_CLK_40NS_CYCLES_MASK			GENMASK(6, 0)
137a53dfc00SNitin Rawat 
138a53dfc00SNitin Rawat 
139a53dfc00SNitin Rawat /* QCOM UFS host controller core clk frequencies */
140a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_37_5_MHZ          38
141a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_75_MHZ            75
142a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_100_MHZ           100
143a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_150_MHZ           150
144a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_300_MHZ           300
145a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_201_5_MHZ         202
146a53dfc00SNitin Rawat #define UNIPRO_CORE_CLK_FREQ_403_MHZ           403
147f06fcc71SYaniv Gardi 
14881c0fc51SYaniv Gardi static inline void
14981c0fc51SYaniv Gardi ufs_qcom_get_controller_revision(struct ufs_hba *hba,
15081c0fc51SYaniv Gardi 				 u8 *major, u16 *minor, u16 *step)
15181c0fc51SYaniv Gardi {
15281c0fc51SYaniv Gardi 	u32 ver = ufshcd_readl(hba, REG_UFS_HW_VERSION);
15381c0fc51SYaniv Gardi 
15418fe2ab7SManivannan Sadhasivam 	*major = FIELD_GET(UFS_HW_VER_MAJOR_MASK, ver);
15518fe2ab7SManivannan Sadhasivam 	*minor = FIELD_GET(UFS_HW_VER_MINOR_MASK, ver);
15618fe2ab7SManivannan Sadhasivam 	*step = FIELD_GET(UFS_HW_VER_STEP_MASK, ver);
15781c0fc51SYaniv Gardi };
15881c0fc51SYaniv Gardi 
15981c0fc51SYaniv Gardi static inline void ufs_qcom_assert_reset(struct ufs_hba *hba)
16081c0fc51SYaniv Gardi {
16118fe2ab7SManivannan Sadhasivam 	ufshcd_rmwl(hba, UFS_PHY_SOFT_RESET, FIELD_PREP(UFS_PHY_SOFT_RESET, UFS_PHY_RESET_ENABLE),
16218fe2ab7SManivannan Sadhasivam 		    REG_UFS_CFG1);
16381c0fc51SYaniv Gardi 
16481c0fc51SYaniv Gardi 	/*
16581c0fc51SYaniv Gardi 	 * Make sure assertion of ufs phy reset is written to
16681c0fc51SYaniv Gardi 	 * register before returning
16781c0fc51SYaniv Gardi 	 */
16881c0fc51SYaniv Gardi 	mb();
16981c0fc51SYaniv Gardi }
17081c0fc51SYaniv Gardi 
17181c0fc51SYaniv Gardi static inline void ufs_qcom_deassert_reset(struct ufs_hba *hba)
17281c0fc51SYaniv Gardi {
17318fe2ab7SManivannan Sadhasivam 	ufshcd_rmwl(hba, UFS_PHY_SOFT_RESET, FIELD_PREP(UFS_PHY_SOFT_RESET, UFS_PHY_RESET_DISABLE),
17418fe2ab7SManivannan Sadhasivam 		    REG_UFS_CFG1);
17581c0fc51SYaniv Gardi 
17681c0fc51SYaniv Gardi 	/*
17781c0fc51SYaniv Gardi 	 * Make sure de-assertion of ufs phy reset is written to
17881c0fc51SYaniv Gardi 	 * register before returning
17981c0fc51SYaniv Gardi 	 */
18081c0fc51SYaniv Gardi 	mb();
18181c0fc51SYaniv Gardi }
18281c0fc51SYaniv Gardi 
183bfdbe8baSYaniv Gardi /* Host controller hardware version: major.minor.step */
184bfdbe8baSYaniv Gardi struct ufs_hw_version {
185bfdbe8baSYaniv Gardi 	u16 step;
186bfdbe8baSYaniv Gardi 	u16 minor;
187bfdbe8baSYaniv Gardi 	u8 major;
188bfdbe8baSYaniv Gardi };
189cad2e03dSYaniv Gardi 
1906e3fd44dSYaniv Gardi struct ufs_qcom_testbus {
1916e3fd44dSYaniv Gardi 	u8 select_major;
1926e3fd44dSYaniv Gardi 	u8 select_minor;
1936e3fd44dSYaniv Gardi };
1946e3fd44dSYaniv Gardi 
195b8416b2fSBjorn Andersson struct gpio_desc;
196b8416b2fSBjorn Andersson 
1976e3fd44dSYaniv Gardi struct ufs_qcom_host {
198cad2e03dSYaniv Gardi 	/*
199cad2e03dSYaniv Gardi 	 * Set this capability if host controller supports the QUniPro mode
200cad2e03dSYaniv Gardi 	 * and if driver wants the Host controller to operate in QUniPro mode.
201cad2e03dSYaniv Gardi 	 * Note: By default this capability will be kept enabled if host
202cad2e03dSYaniv Gardi 	 * controller supports the QUniPro mode.
203cad2e03dSYaniv Gardi 	 */
2047e014efdSAlim Akhtar 	#define UFS_QCOM_CAP_QUNIPRO	0x1
205f06fcc71SYaniv Gardi 
206f06fcc71SYaniv Gardi 	/*
207f06fcc71SYaniv Gardi 	 * Set this capability if host controller can retain the secure
208f06fcc71SYaniv Gardi 	 * configuration even after UFS controller core power collapse.
209f06fcc71SYaniv Gardi 	 */
2107e014efdSAlim Akhtar 	#define UFS_QCOM_CAP_RETAIN_SEC_CFG_AFTER_PWR_COLLAPSE	0x2
211cad2e03dSYaniv Gardi 	u32 caps;
212cad2e03dSYaniv Gardi 
21381c0fc51SYaniv Gardi 	struct phy *generic_phy;
21481c0fc51SYaniv Gardi 	struct ufs_hba *hba;
21581c0fc51SYaniv Gardi 	struct ufs_pa_layer_attr dev_req_params;
21681c0fc51SYaniv Gardi 	struct clk *rx_l0_sync_clk;
21781c0fc51SYaniv Gardi 	struct clk *tx_l0_sync_clk;
21881c0fc51SYaniv Gardi 	struct clk *rx_l1_sync_clk;
21981c0fc51SYaniv Gardi 	struct clk *tx_l1_sync_clk;
22081c0fc51SYaniv Gardi 	bool is_lane_clks_enabled;
221bfdbe8baSYaniv Gardi 
22203ce80a1SManivannan Sadhasivam 	struct icc_path *icc_ddr;
22303ce80a1SManivannan Sadhasivam 	struct icc_path *icc_cpu;
22403ce80a1SManivannan Sadhasivam 
22556541c7cSAbel Vesa #ifdef CONFIG_SCSI_UFS_CRYPTO
22656541c7cSAbel Vesa 	struct qcom_ice *ice;
22756541c7cSAbel Vesa #endif
22856541c7cSAbel Vesa 
229f06fcc71SYaniv Gardi 	void __iomem *dev_ref_clk_ctrl_mmio;
230f06fcc71SYaniv Gardi 	bool is_dev_ref_clk_enabled;
231bfdbe8baSYaniv Gardi 	struct ufs_hw_version hw_ver;
232f06fcc71SYaniv Gardi 
233f06fcc71SYaniv Gardi 	u32 dev_ref_clk_en_mask;
234f06fcc71SYaniv Gardi 
2356e3fd44dSYaniv Gardi 	struct ufs_qcom_testbus testbus;
23612fd5f25SEvan Green 
237870b1279SCan Guo 	/* Reset control of HCI */
238870b1279SCan Guo 	struct reset_control *core_reset;
23912fd5f25SEvan Green 	struct reset_controller_dev rcdev;
240b8416b2fSBjorn Andersson 
241b8416b2fSBjorn Andersson 	struct gpio_desc *device_reset;
242baf5ddacSManivannan Sadhasivam 
2435a738cfeSManivannan Sadhasivam 	u32 phy_gear;
244519b6274SCan Guo 
245519b6274SCan Guo 	bool esi_enabled;
24681c0fc51SYaniv Gardi };
24781c0fc51SYaniv Gardi 
248eba5ed35SYaniv Gardi static inline u32
249eba5ed35SYaniv Gardi ufs_qcom_get_debug_reg_offset(struct ufs_qcom_host *host, u32 reg)
250eba5ed35SYaniv Gardi {
251eba5ed35SYaniv Gardi 	if (host->hw_ver.major <= 0x02)
252eba5ed35SYaniv Gardi 		return UFS_CNTLR_2_x_x_VEN_REGS_OFFSET(reg);
253eba5ed35SYaniv Gardi 
254eba5ed35SYaniv Gardi 	return UFS_CNTLR_3_x_x_VEN_REGS_OFFSET(reg);
255eba5ed35SYaniv Gardi };
256eba5ed35SYaniv Gardi 
25781c0fc51SYaniv Gardi #define ufs_qcom_is_link_off(hba) ufshcd_is_link_off(hba)
25881c0fc51SYaniv Gardi #define ufs_qcom_is_link_active(hba) ufshcd_is_link_active(hba)
25981c0fc51SYaniv Gardi #define ufs_qcom_is_link_hibern8(hba) ufshcd_is_link_hibern8(hba)
260b4e13e1aSNitin Rawat #define ceil(freq, div) ((freq) % (div) == 0 ? ((freq)/(div)) : ((freq)/(div) + 1))
26181c0fc51SYaniv Gardi 
2626e3fd44dSYaniv Gardi int ufs_qcom_testbus_config(struct ufs_qcom_host *host);
2636e3fd44dSYaniv Gardi 
264cad2e03dSYaniv Gardi static inline bool ufs_qcom_cap_qunipro(struct ufs_qcom_host *host)
265cad2e03dSYaniv Gardi {
266a858af9aSBart Van Assche 	return host->caps & UFS_QCOM_CAP_QUNIPRO;
267cad2e03dSYaniv Gardi }
268cad2e03dSYaniv Gardi 
26981c0fc51SYaniv Gardi #endif /* UFS_QCOM_H_ */
270