iothread.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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) 2017. 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. #include <debug.h>
  32. #include <iothread.h>
  33. #include <profiling.h>
  34. #include <spm_common.h>
  35. #include <lk_load_md_wrapper.h>
  36. #ifdef MTK_TINYSYS_SCP_SUPPORT
  37. #include <platform/mt_scp.h> // for load_scp() and disable_scp_hw()
  38. #endif // MTK_TINYSYS_SCP_SUPPORT
  39. #ifdef MTK_VPU_SUPPORT
  40. #include <platform/mt_vpu.h>
  41. #endif
  42. #ifdef MTK_AUDIODSP_SUPPORT
  43. #include <platform/mt_adsp.h>
  44. #endif // MTK_AUDIODSP_SUPPORT
  45. #ifdef MTK_DPM_SUPPORT
  46. #include <platform/mt_dpm.h>
  47. #endif
  48. /******************************************************************************
  49. ******************************************************************************/
  50. event_t iothread_start_event;
  51. event_t iothread_end_event;
  52. extern BOOTMODE g_boot_mode;
  53. extern int modem_image_loaded;
  54. extern ulong get_timer (ulong base);
  55. /******************************************************************************
  56. ******************************************************************************/
  57. extern int mcdi_load_mcupm(void);
  58. /******************************************************************************
  59. ******************************************************************************/
  60. static void do_load_spm(BOOTMODE mode)
  61. {
  62. #ifdef SPM_FW_USE_PARTITION
  63. PROFILING_START("load spm");
  64. load_spm();
  65. PROFILING_END();
  66. #endif
  67. }
  68. static void do_load_dpm(BOOTMODE mode)
  69. {
  70. #ifdef MTK_DPM_SUPPORT
  71. PROFILING_START("load dpm");
  72. load_dpm();
  73. PROFILING_END();
  74. #endif
  75. }
  76. static void do_load_scp(BOOTMODE mode)
  77. {
  78. #ifdef MTK_TINYSYS_SCP_SUPPORT
  79. PROFILING_START("load scp");
  80. if (mode != RECOVERY_BOOT) {
  81. if (load_scp() < 0) {
  82. /* if it load scp fail, turn off SCP hw*/
  83. disable_scp_hw();
  84. }
  85. } else {
  86. /* turn off scp in recovery mode*/
  87. disable_scp_hw();
  88. }
  89. PROFILING_END();
  90. #endif
  91. }
  92. static void do_load_adsp(BOOTMODE mode)
  93. {
  94. #ifdef MTK_AUDIODSP_SUPPORT
  95. PROFILING_START("load adsp");
  96. if (mode != RECOVERY_BOOT) {
  97. if (load_adsp() < 0) {
  98. /* if it load adsp fail, turn off ADSP hw*/
  99. disable_adsp_hw();
  100. }
  101. } else {
  102. /* turn off adsp in recovery mode*/
  103. dprintf(CRITICAL,"[adsp] recovery mode, no need to load adsp\n");
  104. disable_adsp_hw();
  105. }
  106. PROFILING_END();
  107. #endif
  108. }
  109. static void do_load_mcupm(BOOTMODE mode)
  110. {
  111. #ifdef MCUPM_FW_USE_PARTITION
  112. PROFILING_START("load mcupm");
  113. mcdi_load_mcupm();
  114. PROFILING_END();
  115. #endif
  116. }
  117. static void do_load_modem(BOOTMODE mode)
  118. {
  119. PROFILING_START("load modem image");
  120. /* NOTE: This MUST before setup_mem_property_use_mblock_info() !!! */
  121. if (modem_image_loaded) { // no need to load modem for "fastboot contiinue"
  122. dprintf(CRITICAL,"[ccci] modem already loaded in fastboot_init. no need load modem here\n");
  123. } else if (mode != RECOVERY_BOOT
  124. #if defined(MTK_KERNEL_POWER_OFF_CHARGING)
  125. && mode != KERNEL_POWER_OFF_CHARGING_BOOT
  126. && mode != LOW_POWER_OFF_CHARGING_BOOT
  127. #endif
  128. ) {
  129. ccci_load_modem_image();
  130. } else {
  131. dprintf(CRITICAL,"[ccci] recovery mode, no need load modem\n");
  132. }
  133. #if !defined(NO_MD_POWER_DOWN)
  134. /* just for 93: SBC on 93, need call power off after load modem image */
  135. extern void md_power_down(void)__attribute__((weak));
  136. if (md_power_down) {
  137. md_power_down();
  138. } else {
  139. dprintf(CRITICAL,"[ccci-off] later power down not needed or not ready!\n");
  140. }
  141. #endif
  142. extern int md_power_control(BOOTMODE mode)__attribute__((weak));
  143. if (md_power_control) {
  144. md_power_control(mode);
  145. } else {
  146. dprintf(CRITICAL,"[ccci-off] later power down not needed or not ready!\n");
  147. }
  148. PROFILING_END();
  149. }
  150. static void do_load_vpu(BOOTMODE mode)
  151. {
  152. #ifdef MTK_VPU_SUPPORT
  153. #ifndef MTK_VPU_LOAD_IMAGE
  154. int ret;
  155. PROFILING_START("load vpu");
  156. if ((ret = mt_load_vpu()) < 0) {
  157. dprintf(CRITICAL, "[LK ERROR] load VPU fail(ret = %d)!!!\n", ret);
  158. }
  159. PROFILING_END();
  160. #endif
  161. #endif
  162. }
  163. static void do_load_images(BOOTMODE mode)
  164. {
  165. /* Don't load fw which not needed in recovery
  166. * This is to ensure recovery can be entered
  167. * even borken images are detected by verify boot
  168. */
  169. if (RECOVERY_BOOT != mode) {
  170. do_load_vpu(mode);
  171. do_load_spm(mode);
  172. do_load_mcupm(mode);
  173. }
  174. /* Actially the md img is not loaded in recovery too.
  175. * Check inside this API, md power down to be decoupled
  176. */
  177. do_load_scp(mode);
  178. do_load_modem(mode);
  179. do_load_adsp(mode);
  180. do_load_dpm(mode);
  181. }
  182. /******************************************************************************
  183. ******************************************************************************/
  184. #if !defined(ENABLE_IO_THREAD)
  185. void load_images(BOOTMODE mode)
  186. {
  187. do_load_images(mode);
  188. }
  189. #else
  190. void load_images(BOOTMODE mode)
  191. {
  192. /* Empty! */
  193. }
  194. #endif // ENABLE_IO_THREAD
  195. /******************************************************************************
  196. ******************************************************************************/
  197. #if defined(ENABLE_IO_THREAD)
  198. static void load_images_in_iothread(BOOTMODE mode)
  199. {
  200. do_load_images(mode);
  201. }
  202. #else
  203. static void load_images_in_iothread(BOOTMODE mode)
  204. {
  205. /* Empty! */
  206. }
  207. #endif // ENABLE_IO_THREAD
  208. /******************************************************************************
  209. ******************************************************************************/
  210. int iothread(void *arg)
  211. {
  212. event_init(&iothread_start_event, false, 0);
  213. event_init(&iothread_end_event, false, 0);
  214. dprintf(INFO, "iothread starts.\n");
  215. wait_for_bootstrap2();
  216. load_images_in_iothread(g_boot_mode);
  217. wake_up_bootstrap2();
  218. return 0;
  219. }