sysctl_pwr.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* Copyright (c) 2023, Canaan Bright Sight Co., Ltd
  2. *
  3. * Redistribution and use in source and binary forms, with or without
  4. * modification, are permitted provided that the following conditions are met:
  5. * 1. Redistributions of source code must retain the above copyright
  6. * notice, this list of conditions and the following disclaimer.
  7. * 2. Redistributions in binary form must reproduce the above copyright
  8. * notice, this list of conditions and the following disclaimer in the
  9. * documentation and/or other materials provided with the distribution.
  10. *
  11. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  12. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  13. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  15. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  16. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  17. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  18. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  19. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  21. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  22. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #ifndef __SYSCTL_PWR_H__
  26. #define __SYSCTL_PWR_H__
  27. /* created by yangfan */
  28. #include <stdint.h>
  29. #include <stdbool.h>
  30. /* See TRM 2.3.4 Table 2-3-3 */
  31. typedef struct
  32. {
  33. volatile uint32_t cpu0_pwr_tim; /* 0x00 */
  34. volatile uint32_t cpu0_lpi_tim; /* 0x04 */
  35. volatile uint32_t cpu0_pwr_lpi_ctl; /* 0x08 */
  36. volatile uint32_t cpu0_pwr_lpi_state; /* 0x0c */
  37. volatile uint32_t cpu1_pwr_tim; /* 0x10 */
  38. volatile uint32_t cpu1_lpi_tim; /* 0x14 */
  39. volatile uint32_t cpu1_pwr_lpi_ctl; /* 0x18 */
  40. volatile uint32_t cpu1_pwr_lpi_state; /* 0x1c */
  41. volatile uint32_t ai_pwr_tim; /* 0x20 */
  42. volatile uint32_t ai_lpi_tim; /* 0x24 */
  43. volatile uint32_t ai_pwr_lpi_ctl; /* 0x28 */
  44. volatile uint32_t ai_pwr_lpi_state; /* 0x2c */
  45. volatile uint32_t disp_pwr_tim; /* 0x30 */
  46. volatile uint32_t disp_lpi_tim; /* 0x34 */
  47. volatile uint32_t disp_gpu_tim; /* 0x38 */
  48. volatile uint32_t disp_lpi_ctl; /* 0x3c */
  49. volatile uint32_t disp_lpi_state; /* 0x40 */
  50. volatile uint32_t disp_reserved[7]; /* 0x44-0x4c, 0x50-0x5c */
  51. volatile uint32_t shrm_pwr_tim; /* 0x60 */
  52. volatile uint32_t shrm_lpi_tim; /* 0x64 */
  53. volatile uint32_t shrm_pwr_lpi_ctl; /* 0x68 */
  54. volatile uint32_t shrm_pwr_lpi_state; /* 0x6c */
  55. volatile uint32_t vpu_pwr_tim; /* 0x70 */
  56. volatile uint32_t vpu_lpi_tim; /* 0x74 */
  57. volatile uint32_t vpu_qch_tim; /* 0x78 */
  58. volatile uint32_t vpu_pwr_lpi_ctl; /* 0x7c */
  59. volatile uint32_t vpu_lpi_state; /* 0x80 */
  60. volatile uint32_t vpu_reserved[3]; /* 0x84-0x8c */
  61. volatile uint32_t mctl_pwr_tim0; /* 0x90 */
  62. volatile uint32_t mctl_noc_lpi_tim; /* 0x94 */
  63. volatile uint32_t mctl_axi_lpi_tim; /* 0x98 */
  64. volatile uint32_t mctl_pwr_lpi_ctl; /* 0x9c */
  65. volatile uint32_t mctl_clock_switch; /* 0xa0 */
  66. volatile uint32_t mctl_lpi_state; /* 0xa4 */
  67. volatile uint32_t mctl_reserved[22]; /* 0xa8-0xac, 0xb0-0xbc, 0xc0-0xcc, 0xd0-0xdc, 0xe0-0xec, 0xf0-0xfc */
  68. volatile uint32_t dpu_pwr_tim; /* 0x100 */
  69. volatile uint32_t dpu_lpi_tim; /* 0x104 */
  70. volatile uint32_t dpu_pwr_lpi_ctl; /* 0x108 */
  71. volatile uint32_t dpu_pwr_lpi_state; /* 0x10c */
  72. volatile uint32_t hi_pwr_tim; /* 0x110 */
  73. volatile uint32_t hi_lpi_tim; /* 0x114 */
  74. volatile uint32_t hi_pwr_lpi_ctl; /* 0x118 */
  75. volatile uint32_t hi_lpi_state; /* 0x11c */
  76. volatile uint32_t ls_pwr_tim; /* 0x120 */
  77. volatile uint32_t ls_lpi_tim; /* 0x124 */
  78. volatile uint32_t ls_pwr_lpi_ctl; /* 0x128 */
  79. volatile uint32_t ls_lpi_state; /* 0x12c */
  80. volatile uint32_t sec_pwr_tim; /* 0x130 */
  81. volatile uint32_t sec_lpi_tim; /* 0x134 */
  82. volatile uint32_t sec_pwr_lpi_ctl; /* 0x138 */
  83. volatile uint32_t sec_pwr_lpi_state; /* 0x13c */
  84. volatile uint32_t isp_pwr_tim; /* 0x140 */
  85. volatile uint32_t isp_lpi_tim; /* 0x144 */
  86. volatile uint32_t isp_pwr_lpi_ctl; /* 0x148 */
  87. volatile uint32_t isp_pwr_lpi_state; /* 0x14c */
  88. volatile uint32_t pmu_pwr_tim; /* 0x150 */
  89. volatile uint32_t pmu_lpi_tim; /* 0x154 */
  90. volatile uint32_t pmu_pwr_lpi_ctl; /* 0x158 */
  91. volatile uint32_t pmu_pwr_lpi_state; /* 0x15c */
  92. volatile uint32_t repair_status; /* 0x160 */
  93. volatile uint32_t sram0_repair_tim; /* 0x164 */
  94. volatile uint32_t ssys_ctl_gpio_ctl; /* 0x168 */
  95. volatile uint32_t ssys_reserved; /* 0x16c */
  96. volatile uint32_t ssys_ctl_gpio_en0; /* 0x170 */
  97. volatile uint32_t ssys_ctl_gpio_en1; /* 0x174 */
  98. volatile uint32_t cpu_repair_tim; /* 0x178 */
  99. } sysctl_pwr_s;
  100. /* See TRM 2.3.1 Table 2-3-1 */
  101. typedef enum
  102. {
  103. SYSCTL_PD_CPU1,
  104. SYSCTL_PD_AI,
  105. SYSCTL_PD_DISP,
  106. SYSCTL_PD_VPU,
  107. SYSCTL_PD_DPU,
  108. SYSCTL_PD_MAX,
  109. } sysctl_pwr_domain_e;
  110. typedef enum
  111. {
  112. SYSCTL_PWR_ACK_TO_TIM, /* idleReq to idleAck max time */
  113. SYSCTL_PWR_IDLE_TO_TIM, /* idleAck to idle max time */
  114. SYSCTL_PWR_IDLE_HD_TIM, /* idle hold tim, from idle to cancel idleReq min time */
  115. SYSCTL_PWR_ISO_SU_TIM, /* isolation setup tim */
  116. SYSCTL_PWR_PD_HD_TIM, /* power done hardware tim */
  117. SYSCTL_PWR_SU_TIM, /* Power bringup tim */
  118. SYSCTL_PWR_WFI_TIM, /* wait for interrupt tim*/
  119. SYSCTL_PWR_MAX_TIM,
  120. } sysctl_pwr_tim_e;
  121. bool sysctl_pwr_set_iso_su_tim(volatile uint32_t *reg, uint32_t iso_su_tim);
  122. bool sysctl_pwr_set_pd_hd_tim(volatile uint32_t *reg, uint32_t pd_hd_tim);
  123. bool sysctl_pwr_set_pwr_su_tim(volatile uint32_t *reg, uint32_t pwr_su_tim);
  124. bool sysctl_pwr_set_ack_to_tim(volatile uint32_t *reg, uint32_t ack_to_tim);
  125. bool sysctl_pwr_set_idle_to_tim(volatile uint32_t *reg, uint32_t idle_to_tim);
  126. bool sysctl_pwr_set_idle_hd_tim(volatile uint32_t *reg, uint32_t idle_hd_tim);
  127. bool sysctl_pwr_set_wfi_tim(volatile uint32_t *reg, uint32_t wfi_tim);
  128. bool sysctl_pwr_set_tim(sysctl_pwr_domain_e powerdomain, sysctl_pwr_tim_e timtype, uint32_t tim_value);
  129. bool sysctl_pwr_get_iso_su_tim(volatile uint32_t *reg, uint32_t *iso_su_tim);
  130. bool sysctl_pwr_get_pd_hd_tim(volatile uint32_t *reg, uint32_t *pd_hd_tim);
  131. bool sysctl_pwr_get_pwr_su_tim(volatile uint32_t *reg, uint32_t *pwr_su_tim);
  132. bool sysctl_pwr_get_ack_to_tim(volatile uint32_t *reg, uint32_t *ack_to_tim);
  133. bool sysctl_pwr_get_idle_to_tim(volatile uint32_t *reg, uint32_t *idle_to_tim);
  134. bool sysctl_pwr_get_idle_hd_tim(volatile uint32_t *reg, uint32_t *idle_hd_tim);
  135. bool sysctl_pwr_get_wfi_tim(volatile uint32_t *reg, uint32_t *wfi_tim);
  136. bool sysctl_pwr_get_tim(sysctl_pwr_domain_e powerdomain, sysctl_pwr_tim_e timtype, uint32_t *tim_value);
  137. bool sysctl_pwr_set_poweroff_keep_reset(sysctl_pwr_domain_e powerdomain, bool enable);
  138. bool sysctl_pwr_get_poweroff_keep_reset(sysctl_pwr_domain_e powerdomain, bool *enable);
  139. bool sysctl_pwr_set_auto_pwr(sysctl_pwr_domain_e powerdomain, bool enable);
  140. bool sysctl_pwr_get_auto_pwr(sysctl_pwr_domain_e powerdomain, bool *enable);
  141. bool sysctl_pwr_set_repair_enable(sysctl_pwr_domain_e powerdomain);
  142. bool sysctl_pwr_check_repair_done(sysctl_pwr_domain_e powerdomain);
  143. bool sysctl_pwr_set_lpi(sysctl_pwr_domain_e powerdomain, bool enable);
  144. bool sysctl_pwr_set_pwr_reg(volatile uint32_t *regctl, volatile uint32_t *regsta, bool enable);
  145. bool sysctl_pwr_set_power(sysctl_pwr_domain_e powerdomain, bool enable);
  146. /* Following two APIs are used to control the power on and off of the SOC power domain */
  147. bool sysctl_pwr_up(sysctl_pwr_domain_e powerdomain);
  148. bool sysctl_pwr_off(sysctl_pwr_domain_e powerdomain);
  149. #endif