mtk_dcm.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2018. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #ifndef __MTK_DCM_H__
  32. #define __MTK_DCM_H__
  33. /* #define DCM_DEFAULT_ALL_OFF */
  34. /* #define DCM_BRINGUP */
  35. #define DCM_OFF (0)
  36. #define DCM_ON (1)
  37. /* Note: ENABLE_DCM_IN_LK is used in kernel if DCM is enabled in LK */
  38. #define ENABLE_DCM_IN_LK
  39. #ifdef ENABLE_DCM_IN_LK
  40. #define INIT_DCM_TYPE_BY_K 0
  41. #endif
  42. /* MT6785 big core DCM in AO domain. */
  43. /* #define CTRL_BIGCORE_DCM_IN_KERNEL */
  44. typedef enum {
  45. ARMCORE_DCM_OFF = DCM_OFF,
  46. ARMCORE_DCM_MODE1 = DCM_ON,
  47. ARMCORE_DCM_MODE2 = DCM_ON+1,
  48. } ENUM_ARMCORE_DCM;
  49. typedef enum {
  50. INFRA_DCM_OFF = DCM_OFF,
  51. INFRA_DCM_ON = DCM_ON,
  52. } ENUM_INFRA_DCM;
  53. typedef enum {
  54. PERI_DCM_OFF = DCM_OFF,
  55. PERI_DCM_ON = DCM_ON,
  56. } ENUM_PERI_DCM;
  57. typedef enum {
  58. MCUSYS_DCM_OFF = DCM_OFF,
  59. MCUSYS_DCM_ON = DCM_ON,
  60. } ENUM_MCUSYS_DCM;
  61. typedef enum {
  62. DRAMC_AO_DCM_OFF = DCM_OFF,
  63. DRAMC_AO_DCM_ON = DCM_ON,
  64. } ENUM_DRAMC_AO_DCM;
  65. typedef enum {
  66. DDRPHY_DCM_OFF = DCM_OFF,
  67. DDRPHY_DCM_ON = DCM_ON,
  68. } ENUM_DDRPHY_DCM;
  69. typedef enum {
  70. EMI_DCM_OFF = DCM_OFF,
  71. EMI_DCM_ON = DCM_ON,
  72. } ENUM_EMI_DCM;
  73. typedef enum {
  74. STALL_DCM_OFF = DCM_OFF,
  75. STALL_DCM_ON = DCM_ON,
  76. } ENUM_STALL_DCM;
  77. typedef enum {
  78. BIG_CORE_DCM_OFF = DCM_OFF,
  79. BIG_CORE_DCM_ON = DCM_ON,
  80. } ENUM_BIG_CORE_DCM;
  81. typedef enum {
  82. GIC_SYNC_DCM_OFF = DCM_OFF,
  83. GIC_SYNC_DCM_ON = DCM_ON,
  84. } ENUM_GIC_SYNC_DCM;
  85. typedef enum {
  86. LAST_CORE_DCM_OFF = DCM_OFF,
  87. LAST_CORE_DCM_ON = DCM_ON,
  88. } ENUM_LAST_CORE_DCM;
  89. typedef enum {
  90. RGU_DCM_OFF = DCM_OFF,
  91. RGU_DCM_ON = DCM_ON,
  92. } ENUM_RGU_DCM;
  93. typedef enum {
  94. TOPCKG_DCM_OFF = DCM_OFF,
  95. TOPCKG_DCM_ON = DCM_ON,
  96. } ENUM_TOPCKG_DCM;
  97. typedef enum {
  98. LPDMA_DCM_OFF = DCM_OFF,
  99. LPDMA_DCM_ON = DCM_ON,
  100. } ENUM_LPDMA_DCM;
  101. typedef enum {
  102. PWRAP_DCM_OFF = DCM_OFF,
  103. PWRAP_DCM_ON = DCM_ON,
  104. } ENUM_PWRAP_DCM;
  105. typedef enum {
  106. MCSI_DCM_OFF = DCM_OFF,
  107. MCSI_DCM_ON = DCM_ON,
  108. } ENUM_MCSI_DCM;
  109. enum {
  110. ARMCORE_DCM = 0,
  111. MCUSYS_DCM,
  112. INFRA_DCM,
  113. PERI_DCM,
  114. EMI_DCM,
  115. DRAMC_DCM,
  116. DDRPHY_DCM,
  117. STALL_DCM,
  118. BIG_CORE_DCM,
  119. GIC_SYNC_DCM,
  120. LAST_CORE_DCM,
  121. RGU_DCM,
  122. TOPCKG_DCM,
  123. LPDMA_DCM,
  124. MCSI_DCM,
  125. NR_DCM,
  126. };
  127. enum {
  128. ARMCORE_DCM_TYPE = (1U << ARMCORE_DCM),
  129. MCUSYS_DCM_TYPE = (1U << MCUSYS_DCM),
  130. INFRA_DCM_TYPE = (1U << INFRA_DCM),
  131. PERI_DCM_TYPE = (1U << PERI_DCM),
  132. EMI_DCM_TYPE = (1U << EMI_DCM),
  133. DRAMC_DCM_TYPE = (1U << DRAMC_DCM),
  134. DDRPHY_DCM_TYPE = (1U << DDRPHY_DCM),
  135. STALL_DCM_TYPE = (1U << STALL_DCM),
  136. BIG_CORE_DCM_TYPE = (1U << BIG_CORE_DCM),
  137. GIC_SYNC_DCM_TYPE = (1U << GIC_SYNC_DCM),
  138. LAST_CORE_DCM_TYPE = (1U << LAST_CORE_DCM),
  139. RGU_DCM_TYPE = (1U << RGU_DCM),
  140. TOPCKG_DCM_TYPE = (1U << TOPCKG_DCM),
  141. LPDMA_DCM_TYPE = (1U << LPDMA_DCM),
  142. MCSI_DCM_TYPE = (1U << MCSI_DCM),
  143. NR_DCM_TYPE = NR_DCM,
  144. };
  145. enum {
  146. DCM_CPU_CLUSTER_LL = (1U << 0),
  147. DCM_CPU_CLUSTER_L = (1U << 1),
  148. DCM_CPU_CLUSTER_B = (1U << 2),
  149. };
  150. #define SYNC_DCM_CLK_MIN_FREQ 52
  151. #define SYNC_DCM_MAX_DIV_VAL 127
  152. #define MCUCFG_SYNC_DCM_MP0_REG SYNC_DCM_CONFIG
  153. #define MCUCFG_SYNC_DCM_MP2_REG MP2_CA15M_SYNC_DCM
  154. #define MCUCFG_SYNC_DCM_CCI_REG SYNC_DCM_CONFIG
  155. #define MCUCFG_SYNC_DCM_CCI (1)
  156. #define MCUCFG_SYNC_DCM_MP0 (11)
  157. #define MCUCFG_SYNC_DCM_MP2 (1)
  158. #define MCUCFG_SYNC_DCM_CCI_TOGMASK (0x1 << MCUCFG_SYNC_DCM_CCI)
  159. #define MCUCFG_SYNC_DCM_MP0_TOGMASK (0x1 << MCUCFG_SYNC_DCM_MP0)
  160. #define MCUCFG_SYNC_DCM_MP2_TOGMASK (0x1 << MCUCFG_SYNC_DCM_MP2)
  161. #define MCUCFG_SYNC_DCM_TOGMASK (MCUCFG_SYNC_DCM_CCI_TOGMASK | \
  162. MCUCFG_SYNC_DCM_MP0_TOGMASK
  163. #define MCUCFG_SYNC_DCM_TOG1 MCUCFG_SYNC_DCM_TOGMASK
  164. #define MCUCFG_SYNC_DCM_CCI_TOG1 MCUCFG_SYNC_DCM_CCI_TOGMASK
  165. #define MCUCFG_SYNC_DCM_MP0_TOG1 MCUCFG_SYNC_DCM_MP0_TOGMASK
  166. #define MCUCFG_SYNC_DCM_MP2_TOG1 MCUCFG_SYNC_DCM_MP2_TOGMASK
  167. #define MCUCFG_SYNC_DCM_CCI_TOG0 (0x0 << MCUCFG_SYNC_DCM_CCI)
  168. #define MCUCFG_SYNC_DCM_MP0_TOG0 (0x0 << MCUCFG_SYNC_DCM_MP0)
  169. #define MCUCFG_SYNC_DCM_MP2_TOG0 (0x0 << MCUCFG_SYNC_DCM_MP2)
  170. #define MCUCFG_SYNC_DCM_TOG0 (MCUCFG_SYNC_DCM_CCI_TOG0 | \
  171. MCUCFG_SYNC_DCM_MP0_TOG0
  172. #define MCUCFG_SYNC_DCM_SEL_CCI (2)
  173. #define MCUCFG_SYNC_DCM_SEL_MP0 (12)
  174. #define MCUCFG_SYNC_DCM_SEL_MP2 (2)
  175. #define MCUCFG_SYNC_DCM_SEL_CCI_MASK (0x7F << MCUCFG_SYNC_DCM_SEL_CCI)
  176. #define MCUCFG_SYNC_DCM_SEL_MP0_MASK (0x7F << MCUCFG_SYNC_DCM_SEL_MP0)
  177. #define MCUCFG_SYNC_DCM_SEL_MP2_MASK (0x7F << MCUCFG_SYNC_DCM_SEL_MP2)
  178. #define MCUCFG_SYNC_DCM_SEL_MASK (MCUCFG_SYNC_DCM_SEL_CCI_MASK | \
  179. MCUCFG_SYNC_DCM_SEL_MP0_MASK)
  180. int dcm_armcore(ENUM_ARMCORE_DCM mode);
  181. int dcm_infra(ENUM_INFRA_DCM on);
  182. int dcm_peri(ENUM_PERI_DCM on);
  183. int dcm_mcusys(ENUM_MCUSYS_DCM on);
  184. int dcm_dramc_ao(ENUM_DRAMC_AO_DCM on);
  185. int dcm_emi(ENUM_EMI_DCM on);
  186. int dcm_ddrphy(ENUM_DDRPHY_DCM on);
  187. int dcm_stall(ENUM_STALL_DCM on);
  188. int dcm_big_core(ENUM_BIG_CORE_DCM on);
  189. int dcm_gic_sync(ENUM_GIC_SYNC_DCM on);
  190. int dcm_last_core(ENUM_LAST_CORE_DCM on);
  191. int dcm_rgu(ENUM_RGU_DCM on);
  192. int dcm_topckg(ENUM_TOPCKG_DCM on);
  193. int dcm_lpdma(ENUM_LPDMA_DCM on);
  194. void dcm_infracfg_ao_emi_indiv(int on);
  195. int mt_dcm_init(void);
  196. void mt_dcm_disable(void);
  197. void mt_dcm_restore(void);
  198. /* unit of frequency is MHz */
  199. int sync_dcm_set_cpu_freq(unsigned int cci, unsigned int mp0, unsigned int mp1, unsigned int mp2);
  200. int sync_dcm_set_cpu_div(unsigned int cci, unsigned int mp0, unsigned int mp1, unsigned int mp2);
  201. extern int sync_dcm_set_cci_freq(unsigned int cci);
  202. extern int sync_dcm_set_mp0_freq(unsigned int mp0);
  203. extern int sync_dcm_set_mp1_freq(unsigned int mp1);
  204. extern int sync_dcm_set_mp2_freq(unsigned int mp2);
  205. #endif /* #ifndef __MTK_DCM_H__ */