iothread.c 6.6 KB

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