ufs-exynos.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * UFS Host Controller driver for Exynos specific extensions
  4. *
  5. * Copyright (C) 2014-2015 Samsung Electronics Co., Ltd.
  6. *
  7. */
  8. #ifndef _UFS_EXYNOS_H_
  9. #define _UFS_EXYNOS_H_
  10. /*
  11. * UNIPRO registers
  12. */
  13. #define UNIPRO_DBG_FORCE_DME_CTRL_STATE 0x150
  14. /*
  15. * MIBs for PA debug registers
  16. */
  17. #define PA_DBG_CLK_PERIOD 0x9514
  18. #define PA_DBG_TXPHY_CFGUPDT 0x9518
  19. #define PA_DBG_RXPHY_CFGUPDT 0x9519
  20. #define PA_DBG_MODE 0x9529
  21. #define PA_DBG_SKIP_RESET_PHY 0x9539
  22. #define PA_DBG_AUTOMODE_THLD 0x9536
  23. #define PA_DBG_OV_TM 0x9540
  24. #define PA_DBG_SKIP_LINE_RESET 0x9541
  25. #define PA_DBG_LINE_RESET_REQ 0x9543
  26. #define PA_DBG_OPTION_SUITE 0x9564
  27. #define PA_DBG_OPTION_SUITE_DYN 0x9565
  28. /*
  29. * MIBs for Transport Layer debug registers
  30. */
  31. #define T_DBG_SKIP_INIT_HIBERN8_EXIT 0xc001
  32. /*
  33. * Exynos MPHY attributes
  34. */
  35. #define TX_LINERESET_N_VAL 0x0277
  36. #define TX_LINERESET_N(v) (((v) >> 10) & 0xFF)
  37. #define TX_LINERESET_P_VAL 0x027D
  38. #define TX_LINERESET_P(v) (((v) >> 12) & 0xFF)
  39. #define TX_OV_SLEEP_CNT_TIMER 0x028E
  40. #define TX_OV_H8_ENTER_EN (1 << 7)
  41. #define TX_OV_SLEEP_CNT(v) (((v) >> 5) & 0x7F)
  42. #define TX_HIGH_Z_CNT_11_08 0x028C
  43. #define TX_HIGH_Z_CNT_H(v) (((v) >> 8) & 0xF)
  44. #define TX_HIGH_Z_CNT_07_00 0x028D
  45. #define TX_HIGH_Z_CNT_L(v) ((v) & 0xFF)
  46. #define TX_BASE_NVAL_07_00 0x0293
  47. #define TX_BASE_NVAL_L(v) ((v) & 0xFF)
  48. #define TX_BASE_NVAL_15_08 0x0294
  49. #define TX_BASE_NVAL_H(v) (((v) >> 8) & 0xFF)
  50. #define TX_GRAN_NVAL_07_00 0x0295
  51. #define TX_GRAN_NVAL_L(v) ((v) & 0xFF)
  52. #define TX_GRAN_NVAL_10_08 0x0296
  53. #define TX_GRAN_NVAL_H(v) (((v) >> 8) & 0x3)
  54. #define VND_TX_CLK_PRD 0xAA
  55. #define VND_TX_CLK_PRD_EN 0xA9
  56. #define VND_TX_LINERESET_PVALUE0 0xAD
  57. #define VND_TX_LINERESET_PVALUE1 0xAC
  58. #define VND_TX_LINERESET_PVALUE2 0xAB
  59. #define TX_LINE_RESET_TIME 3200
  60. #define VND_RX_CLK_PRD 0x12
  61. #define VND_RX_CLK_PRD_EN 0x11
  62. #define VND_RX_LINERESET_VALUE0 0x1D
  63. #define VND_RX_LINERESET_VALUE1 0x1C
  64. #define VND_RX_LINERESET_VALUE2 0x1B
  65. #define RX_LINE_RESET_TIME 1000
  66. #define RX_FILLER_ENABLE 0x0316
  67. #define RX_FILLER_EN (1 << 1)
  68. #define RX_LINERESET_VAL 0x0317
  69. #define RX_LINERESET(v) (((v) >> 12) & 0xFF)
  70. #define RX_LCC_IGNORE 0x0318
  71. #define RX_SYNC_MASK_LENGTH 0x0321
  72. #define RX_HIBERN8_WAIT_VAL_BIT_20_16 0x0331
  73. #define RX_HIBERN8_WAIT_VAL_BIT_15_08 0x0332
  74. #define RX_HIBERN8_WAIT_VAL_BIT_07_00 0x0333
  75. #define RX_OV_SLEEP_CNT_TIMER 0x0340
  76. #define RX_OV_SLEEP_CNT(v) (((v) >> 6) & 0x1F)
  77. #define RX_OV_STALL_CNT_TIMER 0x0341
  78. #define RX_OV_STALL_CNT(v) (((v) >> 4) & 0xFF)
  79. #define RX_BASE_NVAL_07_00 0x0355
  80. #define RX_BASE_NVAL_L(v) ((v) & 0xFF)
  81. #define RX_BASE_NVAL_15_08 0x0354
  82. #define RX_BASE_NVAL_H(v) (((v) >> 8) & 0xFF)
  83. #define RX_GRAN_NVAL_07_00 0x0353
  84. #define RX_GRAN_NVAL_L(v) ((v) & 0xFF)
  85. #define RX_GRAN_NVAL_10_08 0x0352
  86. #define RX_GRAN_NVAL_H(v) (((v) >> 8) & 0x3)
  87. #define CMN_PWM_CLK_CTRL 0x0402
  88. #define PWM_CLK_CTRL_MASK 0x3
  89. #define IATOVAL_NSEC 20000 /* unit: ns */
  90. #define UNIPRO_PCLK_PERIOD(ufs) (NSEC_PER_SEC / ufs->pclk_rate)
  91. struct exynos_ufs;
  92. /* vendor specific pre-defined parameters */
  93. #define SLOW 1
  94. #define FAST 2
  95. #define RX_ADV_FINE_GRAN_SUP_EN 0x1
  96. #define RX_ADV_FINE_GRAN_STEP_VAL 0x3
  97. #define RX_ADV_MIN_ACTV_TIME_CAP 0x9
  98. #define PA_GRANULARITY_VAL 0x6
  99. #define PA_TACTIVATE_VAL 0x3
  100. #define PA_HIBERN8TIME_VAL 0x20
  101. #define PCLK_AVAIL_MIN 70000000
  102. #define PCLK_AVAIL_MAX 167000000
  103. struct exynos_ufs_uic_attr {
  104. /* TX Attributes */
  105. unsigned int tx_trailingclks;
  106. unsigned int tx_dif_p_nsec;
  107. unsigned int tx_dif_n_nsec;
  108. unsigned int tx_high_z_cnt_nsec;
  109. unsigned int tx_base_unit_nsec;
  110. unsigned int tx_gran_unit_nsec;
  111. unsigned int tx_sleep_cnt;
  112. unsigned int tx_min_activatetime;
  113. /* RX Attributes */
  114. unsigned int rx_filler_enable;
  115. unsigned int rx_dif_p_nsec;
  116. unsigned int rx_hibern8_wait_nsec;
  117. unsigned int rx_base_unit_nsec;
  118. unsigned int rx_gran_unit_nsec;
  119. unsigned int rx_sleep_cnt;
  120. unsigned int rx_stall_cnt;
  121. unsigned int rx_hs_g1_sync_len_cap;
  122. unsigned int rx_hs_g2_sync_len_cap;
  123. unsigned int rx_hs_g3_sync_len_cap;
  124. unsigned int rx_hs_g1_prep_sync_len_cap;
  125. unsigned int rx_hs_g2_prep_sync_len_cap;
  126. unsigned int rx_hs_g3_prep_sync_len_cap;
  127. /* Common Attributes */
  128. unsigned int cmn_pwm_clk_ctrl;
  129. /* Internal Attributes */
  130. unsigned int pa_dbg_option_suite;
  131. /* Changeable Attributes */
  132. unsigned int rx_adv_fine_gran_sup_en;
  133. unsigned int rx_adv_fine_gran_step;
  134. unsigned int rx_min_actv_time_cap;
  135. unsigned int rx_hibern8_time_cap;
  136. unsigned int rx_adv_min_actv_time_cap;
  137. unsigned int rx_adv_hibern8_time_cap;
  138. unsigned int pa_granularity;
  139. unsigned int pa_tactivate;
  140. unsigned int pa_hibern8time;
  141. };
  142. struct exynos_ufs_drv_data {
  143. const struct ufs_hba_variant_ops *vops;
  144. struct exynos_ufs_uic_attr *uic_attr;
  145. unsigned int quirks;
  146. unsigned int opts;
  147. /* SoC's specific operations */
  148. int (*drv_init)(struct device *dev, struct exynos_ufs *ufs);
  149. int (*pre_link)(struct exynos_ufs *ufs);
  150. int (*post_link)(struct exynos_ufs *ufs);
  151. int (*pre_pwr_change)(struct exynos_ufs *ufs,
  152. struct ufs_pa_layer_attr *pwr);
  153. int (*post_pwr_change)(struct exynos_ufs *ufs,
  154. struct ufs_pa_layer_attr *pwr);
  155. int (*pre_hce_enable)(struct exynos_ufs *ufs);
  156. int (*post_hce_enable)(struct exynos_ufs *ufs);
  157. };
  158. struct ufs_phy_time_cfg {
  159. u32 tx_linereset_p;
  160. u32 tx_linereset_n;
  161. u32 tx_high_z_cnt;
  162. u32 tx_base_n_val;
  163. u32 tx_gran_n_val;
  164. u32 tx_sleep_cnt;
  165. u32 rx_linereset;
  166. u32 rx_hibern8_wait;
  167. u32 rx_base_n_val;
  168. u32 rx_gran_n_val;
  169. u32 rx_sleep_cnt;
  170. u32 rx_stall_cnt;
  171. };
  172. struct exynos_ufs {
  173. struct ufs_hba *hba;
  174. struct phy *phy;
  175. void __iomem *reg_hci;
  176. void __iomem *reg_unipro;
  177. void __iomem *reg_ufsp;
  178. struct clk *clk_hci_core;
  179. struct clk *clk_unipro_main;
  180. struct clk *clk_apb;
  181. u32 pclk_rate;
  182. u32 pclk_div;
  183. u32 pclk_avail_min;
  184. u32 pclk_avail_max;
  185. unsigned long mclk_rate;
  186. int avail_ln_rx;
  187. int avail_ln_tx;
  188. int rx_sel_idx;
  189. struct ufs_pa_layer_attr dev_req_params;
  190. struct ufs_phy_time_cfg t_cfg;
  191. ktime_t entry_hibern8_t;
  192. const struct exynos_ufs_drv_data *drv_data;
  193. struct regmap *sysreg;
  194. u32 shareability_reg_offset;
  195. u32 opts;
  196. #define EXYNOS_UFS_OPT_HAS_APB_CLK_CTRL BIT(0)
  197. #define EXYNOS_UFS_OPT_SKIP_CONNECTION_ESTAB BIT(1)
  198. #define EXYNOS_UFS_OPT_BROKEN_AUTO_CLK_CTRL BIT(2)
  199. #define EXYNOS_UFS_OPT_BROKEN_RX_SEL_IDX BIT(3)
  200. #define EXYNOS_UFS_OPT_USE_SW_HIBERN8_TIMER BIT(4)
  201. #define EXYNOS_UFS_OPT_SKIP_CONFIG_PHY_ATTR BIT(5)
  202. };
  203. #define for_each_ufs_rx_lane(ufs, i) \
  204. for (i = (ufs)->rx_sel_idx; \
  205. i < (ufs)->rx_sel_idx + (ufs)->avail_ln_rx; i++)
  206. #define for_each_ufs_tx_lane(ufs, i) \
  207. for (i = 0; i < (ufs)->avail_ln_tx; i++)
  208. #define EXYNOS_UFS_MMIO_FUNC(name) \
  209. static inline void name##_writel(struct exynos_ufs *ufs, u32 val, u32 reg)\
  210. { \
  211. writel(val, ufs->reg_##name + reg); \
  212. } \
  213. \
  214. static inline u32 name##_readl(struct exynos_ufs *ufs, u32 reg) \
  215. { \
  216. return readl(ufs->reg_##name + reg); \
  217. }
  218. EXYNOS_UFS_MMIO_FUNC(hci);
  219. EXYNOS_UFS_MMIO_FUNC(unipro);
  220. EXYNOS_UFS_MMIO_FUNC(ufsp);
  221. #undef EXYNOS_UFS_MMIO_FUNC
  222. long exynos_ufs_calc_time_cntr(struct exynos_ufs *, long);
  223. static inline void exynos_ufs_enable_ov_tm(struct ufs_hba *hba)
  224. {
  225. ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_OV_TM), true);
  226. }
  227. static inline void exynos_ufs_disable_ov_tm(struct ufs_hba *hba)
  228. {
  229. ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_OV_TM), false);
  230. }
  231. static inline void exynos_ufs_enable_dbg_mode(struct ufs_hba *hba)
  232. {
  233. ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_MODE), true);
  234. }
  235. static inline void exynos_ufs_disable_dbg_mode(struct ufs_hba *hba)
  236. {
  237. ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_MODE), false);
  238. }
  239. #endif /* _UFS_EXYNOS_H_ */