mt_spm_internal.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #ifndef _MT_SPM_INTERNAL_
  2. #define _MT_SPM_INTERNAL_
  3. #include <linux/kernel.h>
  4. #include <linux/spinlock.h>
  5. #include <linux/atomic.h>
  6. #include <linux/io.h>
  7. #include <mt-plat/aee.h>
  8. #include "mt_spm.h"
  9. #include "mt_lpae.h"
  10. #include "mt_vcore_dvfs.h"
  11. /*
  12. * Config and Parameter
  13. */
  14. #ifdef MTK_FORCE_CLUSTER1
  15. #define SPM_CTRL_BIG_CPU 1
  16. #else
  17. #define SPM_CTRL_BIG_CPU 0
  18. #endif
  19. #define POWER_ON_VAL1_DEF 0x60015830 /* mt6735 */
  20. #define PCM_FSM_STA_DEF 0x48490
  21. #define PCM_WDT_TIMEOUT (30 * 32768) /* 30s */
  22. #define PCM_TIMER_MAX (0xffffffff - PCM_WDT_TIMEOUT)
  23. /*
  24. * Define and Declare
  25. */
  26. #define CON0_PCM_KICK (1U << 0)
  27. #define CON0_IM_KICK (1U << 1)
  28. #define CON0_IM_SLEEP_DVS (1U << 3)
  29. #define CON0_PCM_SW_RESET (1U << 15)
  30. #define CON0_CFG_KEY (SPM_PROJECT_CODE << 16)
  31. #define CON1_IM_SLAVE (1U << 0)
  32. #define CON1_MIF_APBEN (1U << 3)
  33. #define CON1_PCM_TIMER_EN (1U << 5)
  34. #define CON1_IM_NONRP_EN (1U << 6)
  35. #define CON1_PCM_WDT_EN (1U << 8)
  36. #define CON1_PCM_WDT_WAKE_MODE (1U << 9)
  37. #define CON1_SPM_SRAM_SLP_B (1U << 10)
  38. #define CON1_SPM_SRAM_ISO_B (1U << 11)
  39. #define CON1_EVENT_LOCK_EN (1U << 12)
  40. #define CON1_SRCCLKEN_FAST_RESP (1U << 13)
  41. #define CON1_MD32_APB_INTERNAL_EN (1U << 14)
  42. #define CON1_CFG_KEY (SPM_PROJECT_CODE << 16)
  43. #define PCM_PWRIO_EN_R0 (1U << 0)
  44. #define PCM_PWRIO_EN_R7 (1U << 7)
  45. #define PCM_RF_SYNC_R0 (1U << 16)
  46. #define PCM_RF_SYNC_R2 (1U << 18)
  47. #define PCM_RF_SYNC_R6 (1U << 22)
  48. #define PCM_RF_SYNC_R7 (1U << 23)
  49. #define R7_AP_MDSRC_REQ (1U << 17)
  50. #define R13_EXT_SRCLKENA_0 (1U << 0)
  51. #define R13_EXT_SRCLKENA_1 (1U << 1)
  52. #define R13_MD1_SRCLKENA (1U << 3)
  53. #define R13_MD1_APSRC_REQ (1U << 4)
  54. #define R13_AP_MD1SRC_ACK (1U << 5)
  55. #define R13_MD2_SRCLKENA (1U << 6)
  56. #define R13_MD2_APSRC_REQ (1U << 7)
  57. #define R13_AP_MD2SRC_ACK (1U << 8)
  58. #define R13_MD_DDR_EN (1U << 12)
  59. #define R13_CONN_SRCLKENA (1U << 14)
  60. #define R13_CONN_APSRC_REQ (1U << 15)
  61. #define PCM_SW_INT0 (1U << 0)
  62. #define PCM_SW_INT1 (1U << 1)
  63. #define PCM_SW_INT2 (1U << 2)
  64. #define PCM_SW_INT3 (1U << 3)
  65. #define PCM_SW_INT4 (1U << 4)
  66. #define PCM_SW_INT5 (1U << 5)
  67. #define PCM_SW_INT6 (1U << 6)
  68. #define PCM_SW_INT7 (1U << 7)
  69. #define PCM_SW_INT_ALL (PCM_SW_INT7 | PCM_SW_INT6 | PCM_SW_INT5 | \
  70. PCM_SW_INT4 | PCM_SW_INT3 | PCM_SW_INT2 | \
  71. PCM_SW_INT1 | PCM_SW_INT0)
  72. #define CC_SYSCLK0_EN_0 (1U << 0)
  73. #define CC_SYSCLK0_EN_1 (1U << 1)
  74. #define CC_SYSCLK1_EN_0 (1U << 2)
  75. #define CC_SYSCLK1_EN_1 (1U << 3)
  76. #define CC_SYSSETTLE_SEL (1U << 4)
  77. #define CC_LOCK_INFRA_DCM (1U << 5)
  78. #define CC_SRCLKENA_MASK_0 (1U << 6)
  79. #define CC_CXO32K_RM_EN_MD1 (1U << 9)
  80. #define CC_CXO32K_RM_EN_MD2 (1U << 10)
  81. #define CC_CLKSQ1_SEL (1U << 12)
  82. #define CC_DISABLE_DORM_PWR (1U << 14)
  83. #define CC_MD32_DCM_EN (1U << 18)
  84. #define ASC_MD_DDR_EN_SEL (1U << 22)
  85. #define ASC_SRCCLKENI_MASK (1U << 25)
  86. #define WFI_OP_AND 1
  87. #define WFI_OP_OR 0
  88. #define SEL_MD_DDR_EN 1
  89. #define SEL_MD_APSRC_REQ 0
  90. #define TWAM_CON_EN (1U << 0)
  91. #define TWAM_CON_SPEED_EN (1U << 1)
  92. #define TWAM_MON_TYPE_RISE 0
  93. #define TWAM_MON_TYPE_FALL 1
  94. #define TWAM_MON_TYPE_HIGH 2
  95. #define TWAM_MON_TYPE_LOW 3
  96. #define PCM_MD32_IRQ_SEL (1U << 4)
  97. #define ISRM_TWAM (1U << 2)
  98. #define ISRM_PCM_RETURN (1U << 3)
  99. #define ISRM_RET_IRQ0 (1U << 8)
  100. #define ISRM_RET_IRQ1 (1U << 9)
  101. #define ISRM_RET_IRQ2 (1U << 10)
  102. #define ISRM_RET_IRQ3 (1U << 11)
  103. #define ISRM_RET_IRQ4 (1U << 12)
  104. #define ISRM_RET_IRQ5 (1U << 13)
  105. #define ISRM_RET_IRQ6 (1U << 14)
  106. #define ISRM_RET_IRQ7 (1U << 15)
  107. #define ISRM_RET_IRQ_AUX (ISRM_RET_IRQ7 | ISRM_RET_IRQ6 | \
  108. ISRM_RET_IRQ5 | ISRM_RET_IRQ4 | \
  109. ISRM_RET_IRQ3 | ISRM_RET_IRQ2 | \
  110. ISRM_RET_IRQ1)
  111. #define ISRM_ALL_EXC_TWAM (ISRM_RET_IRQ_AUX | ISRM_RET_IRQ0 | ISRM_PCM_RETURN)
  112. #define ISRM_ALL (ISRM_ALL_EXC_TWAM | ISRM_TWAM)
  113. #define ISRS_TWAM (1U << 2)
  114. #define ISRS_PCM_RETURN (1U << 3)
  115. #define ISRS_SW_INT0 (1U << 4)
  116. #define ISRC_TWAM ISRS_TWAM
  117. #define ISRC_ALL_EXC_TWAM ISRS_PCM_RETURN
  118. #define ISRC_ALL (ISRC_ALL_EXC_TWAM | ISRC_TWAM)
  119. #define WAKE_MISC_TWAM (1U << 16)
  120. #define WAKE_MISC_PCM_TIMER (1U << 17)
  121. #define WAKE_MISC_CPU_WAKE (1U << 18)
  122. #define SR_PCM_APSRC_REQ (1U << 0)
  123. #define SR_PCM_F26M_REQ (1U << 1)
  124. #define SR_CCIF0_TO_MD_MASK_B (1U << 2)
  125. #define SR_CCIF0_TO_AP_MASK_B (1U << 3)
  126. #define SR_CCIF1_TO_MD_MASK_B (1U << 4)
  127. #define SR_CCIF1_TO_AP_MASK_B (1U << 5)
  128. #ifndef CONFIG_MTK_FPGA
  129. #if defined(CONFIG_ARCH_MT6735) || defined(CONFIG_ARCH_MT6735M) || defined(CONFIG_ARCH_MT6753)
  130. #define SPM_VCORE_EN
  131. #endif
  132. #endif
  133. #define SPM_SLEEP_DVFS_STA SPM_MFG_ASYNC_PWR_CON
  134. #define VCORE_STA_0 (1U << 0)
  135. #define VCORE_STA_1 (1U << 1)
  136. #define VRF18_0_STA (1U << 8)
  137. #define HPM_REQ_STA (1U << 9)
  138. #define UHPM_REQ_STA (1U << 10)
  139. #if defined(CONFIG_OF)
  140. extern void __iomem *i2c4_base;
  141. #endif
  142. struct pcm_desc {
  143. const char *version; /* PCM code version */
  144. const u32 *base; /* binary array base */
  145. const u16 size; /* binary array size */
  146. const u8 sess; /* session number */
  147. const u8 replace; /* replace mode */
  148. u32 vec0; /* event vector 0 config */
  149. u32 vec1; /* event vector 1 config */
  150. u32 vec2; /* event vector 2 config */
  151. u32 vec3; /* event vector 3 config */
  152. u32 vec4; /* event vector 4 config */
  153. u32 vec5; /* event vector 5 config */
  154. u32 vec6; /* event vector 6 config */
  155. u32 vec7; /* event vector 7 config */
  156. };
  157. struct pwr_ctrl {
  158. /* for SPM */
  159. u32 pcm_flags;
  160. u32 pcm_flags_cust; /* can override pcm_flags */
  161. u32 pcm_reserve;
  162. u32 timer_val; /* @ 1T 32K */
  163. u32 timer_val_cust; /* @ 1T 32K, can override timer_val */
  164. u32 wake_src;
  165. u32 wake_src_cust; /* can override wake_src */
  166. u32 wake_src_md32;
  167. u8 r0_ctrl_en;
  168. u8 r7_ctrl_en;
  169. u8 infra_dcm_lock;
  170. u8 pcm_apsrc_req;
  171. u8 pcm_f26m_req;
  172. /* for AP */
  173. u8 mcusys_idle_mask;
  174. u8 ca15top_idle_mask;
  175. u8 ca7top_idle_mask;
  176. u8 wfi_op; /* 1:WFI_OP_AND, 0:WFI_OP_OR */
  177. u8 ca15_wfi0_en;
  178. u8 ca15_wfi1_en;
  179. u8 ca15_wfi2_en;
  180. u8 ca15_wfi3_en;
  181. u8 ca7_wfi0_en;
  182. u8 ca7_wfi1_en;
  183. u8 ca7_wfi2_en;
  184. u8 ca7_wfi3_en;
  185. /* for MD */
  186. u8 md1_req_mask;
  187. u8 md2_req_mask;
  188. u8 md_apsrc_sel; /* 1:SEL_MD_DDR_EN, 0:SEL_MD_APSRC_REQ */
  189. u8 md2_apsrc_sel; /* 1:SEL_MD2_DDR_EN, 0:SEL_MD2_APSRC_REQ */
  190. u8 ccif0_to_ap_mask;
  191. u8 ccif0_to_md_mask;
  192. u8 ccif1_to_ap_mask;
  193. u8 ccif1_to_md_mask;
  194. u8 lte_mask;
  195. u8 ccifmd_md1_event_mask;
  196. u8 ccifmd_md2_event_mask;
  197. u8 md_vrf18_req_mask_b;
  198. /* for CONN */
  199. u8 conn_mask;
  200. /* for MM */
  201. u8 gce_req_mask;
  202. u8 disp_req_mask;
  203. u8 mfg_req_mask;
  204. u8 dsi0_ddr_en_mask; /* E2 */
  205. u8 dsi1_ddr_en_mask; /* E2 */
  206. u8 dpi_ddr_en_mask; /* E2 */
  207. u8 isp0_ddr_en_mask; /* E2 */
  208. u8 isp1_ddr_en_mask; /* E2 */
  209. /* for other SYS */
  210. u8 md32_req_mask;
  211. u8 syspwreq_mask; /* make 26M off when attach ICE */
  212. u8 srclkenai_mask;
  213. /* for scenario */
  214. u32 param1;
  215. u32 param2;
  216. u32 param3;
  217. };
  218. struct wake_status {
  219. u32 assert_pc; /* PCM_REG_DATA_INI */
  220. u32 r12; /* PCM_REG12_DATA */
  221. u32 raw_sta; /* SLEEP_ISR_RAW_STA */
  222. u32 wake_misc; /* SLEEP_WAKEUP_MISC */
  223. u32 timer_out; /* PCM_TIMER_OUT */
  224. u32 r13; /* PCM_REG13_DATA */
  225. u32 idle_sta; /* SLEEP_SUBSYS_IDLE_STA */
  226. u32 debug_flag; /* PCM_PASR_DPD_3 */
  227. u32 event_reg; /* PCM_EVENT_REG_STA */
  228. u32 isr; /* SLEEP_ISR_STATUS */
  229. u32 r9; /* PCM_REG9_DATA */
  230. u32 log_index;
  231. };
  232. struct spm_lp_scen {
  233. struct pcm_desc *pcmdesc;
  234. struct pwr_ctrl *pwrctrl;
  235. struct wake_status *wakestatus;
  236. };
  237. extern spinlock_t __spm_lock;
  238. extern atomic_t __spm_mainpll_req;
  239. extern struct spm_lp_scen __spm_suspend;
  240. extern struct spm_lp_scen __spm_dpidle;
  241. extern struct spm_lp_scen __spm_sodi;
  242. extern struct spm_lp_scen __spm_mcdi;
  243. extern struct spm_lp_scen __spm_talking;
  244. extern struct spm_lp_scen __spm_ddrdfs;
  245. extern struct spm_lp_scen __spm_vcore_dvfs;
  246. extern void __spm_reset_and_init_pcm(const struct pcm_desc *pcmdesc);
  247. extern void __spm_kick_im_to_fetch(const struct pcm_desc *pcmdesc);
  248. extern void __spm_init_pcm_register(void); /* init r0 and r7 */
  249. extern void __spm_init_event_vector(const struct pcm_desc *pcmdesc);
  250. extern void __spm_set_power_control(const struct pwr_ctrl *pwrctrl);
  251. extern void __spm_set_wakeup_event(const struct pwr_ctrl *pwrctrl);
  252. extern void __spm_kick_pcm_to_run(const struct pwr_ctrl *pwrctrl);
  253. extern void __spm_get_wakeup_status(struct wake_status *wakesta);
  254. extern void __spm_clean_after_wakeup(void);
  255. extern wake_reason_t __spm_output_wake_reason(const struct wake_status *wakesta,
  256. const struct pcm_desc *pcmdesc, bool suspend);
  257. extern void __spm_dbgout_md_ddr_en(bool enable);
  258. extern u32 __spm_dpidle_sodi_set_pmic_setting(void);
  259. extern void __spm_dpidle_sodi_restore_pmic_setting(u32 vsram_vosel_on_lb);
  260. extern int spm_fs_init(void);
  261. #ifndef CONFIG_MTK_FPGA
  262. extern int is_ext_buck_exist(void);
  263. #endif
  264. extern int spm_golden_setting_cmp(bool en);
  265. extern bool spm_set_pcm_init_flag(void);
  266. extern void spm_set_dram_bank_info_pcm_flag(u32 *pcm_flags);
  267. /*
  268. * if in talking, modify @spm_flags based on @lpscen and return __spm_talking,
  269. * otherwise, do nothing and return @lpscen
  270. */
  271. extern struct spm_lp_scen *spm_check_talking_get_lpscen(struct spm_lp_scen *lpscen,
  272. u32 *spm_flags);
  273. extern void __spm_enable_i2c4_clk(void);
  274. extern void __spm_disable_i2c4_clk(void);
  275. /**************************************
  276. * Macro and Inline
  277. **************************************/
  278. #define EVENT_VEC(event, resume, imme, pc) \
  279. (((pc) << 16) | \
  280. (!!(imme) << 6) | \
  281. (!!(resume) << 5) | \
  282. ((event) & 0x1f))
  283. #define spm_emerg(fmt, args...) pr_warn("[SPM] " fmt, ##args)
  284. #define spm_alert(fmt, args...) pr_warn("[SPM] " fmt, ##args)
  285. #define spm_crit(fmt, args...) pr_warn("[SPM] " fmt, ##args)
  286. #define spm_err(fmt, args...) pr_warn("[SPM] " fmt, ##args)
  287. #define spm_warn(fmt, args...) pr_warn("[SPM] " fmt, ##args)
  288. #define spm_notice(fmt, args...) pr_debug("[SPM] " fmt, ##args)
  289. #define spm_info(fmt, args...) pr_debug("[SPM] " fmt, ##args)
  290. #define spm_debug(fmt, args...) pr_debug("[SPM] " fmt, ##args)
  291. /* just use in suspend flow for important log due to console suspend */
  292. #define spm_crit2(fmt, args...) \
  293. do { \
  294. aee_sram_printk(fmt, ##args); \
  295. spm_debug(fmt, ##args); \
  296. } while (0)
  297. #define wfi_with_sync() \
  298. do { \
  299. isb(); \
  300. mb(); /* for WFI */ \
  301. __asm__ __volatile__("wfi" : : : "memory"); \
  302. } while (0)
  303. static inline u32 base_va_to_pa(const u32 *base)
  304. {
  305. phys_addr_t pa = virt_to_phys(base);
  306. MAPPING_DRAM_ACCESS_ADDR(pa); /* for 4GB mode */
  307. return (u32) pa;
  308. }
  309. static inline void set_pwrctrl_pcm_flags(struct pwr_ctrl *pwrctrl, u32 flags)
  310. {
  311. #ifndef CONFIG_MTK_FPGA
  312. #if defined(CONFIG_ARCH_MT6735)
  313. #elif defined(CONFIG_ARCH_MT6735M)
  314. #elif defined(CONFIG_ARCH_MT6753)
  315. if (is_ext_buck_exist())
  316. flags |= SPM_BUCK_SEL;
  317. else
  318. flags &= ~SPM_BUCK_SEL;
  319. #else
  320. /* ERROR */
  321. #endif
  322. #endif
  323. spm_set_dram_bank_info_pcm_flag(&flags);
  324. #ifdef SPM_VCORE_EN
  325. if (is_vcorefs_can_work())
  326. flags |= SPM_VCORE_DVFS_EN;
  327. #endif
  328. if (pwrctrl->pcm_flags_cust == 0)
  329. pwrctrl->pcm_flags = flags;
  330. else
  331. pwrctrl->pcm_flags = pwrctrl->pcm_flags_cust;
  332. }
  333. static inline void set_pwrctrl_pcm_data(struct pwr_ctrl *pwrctrl, u32 data)
  334. {
  335. pwrctrl->pcm_reserve = data;
  336. }
  337. static inline void set_flags_for_mainpll(u32 *flags)
  338. {
  339. }
  340. #endif