lk_builtin_dtb.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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) 2019. 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. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <stddef.h>
  38. #include <assert.h>
  39. #include <bootargs.h>
  40. #include <platform/errno.h>
  41. #include <string.h>
  42. #include <pal_log.h>
  43. #include <pal_assert.h>
  44. #include <odm_mdtbo.h>
  45. #include <ufdt_overlay.h>
  46. #include <fdt_op.h>
  47. #include <mt_boot.h>
  48. #include <profiling.h>
  49. #include <platform/verified_boot.h>
  50. #include <part_interface.h>
  51. #include <platform/mt_gpt.h>
  52. #include <boot_info.h>
  53. extern int mboot_common_load_part(char *part_name, char *img_name, uint32_t addr);
  54. #define LK_PART_NAME "lk"
  55. #define LK_DTB_IMG_NAME "lk_main_dtb"
  56. #define LK_PARTITION_NAME_SIZE 5
  57. static char lk_part_name[LK_PARTITION_NAME_SIZE] = LK_PART_NAME;
  58. static uint32_t lk_dtb_inited;
  59. static uint8_t lk_overlayed_dtb_addr[DTB_MAX_SIZE];
  60. static void *selected_dtbo_addr;
  61. static char *get_lk_part_name(void)
  62. {
  63. #ifdef MTK_AB_OTA_UPDATER
  64. static uint32_t lk_part_name_inited;
  65. const char *p_AB_suffix;
  66. if (!lk_part_name_inited){
  67. int part_name_len = strlen(lk_part_name);
  68. p_AB_suffix = get_suffix();
  69. if (p_AB_suffix) {
  70. strncpy((char *)&lk_part_name[part_name_len], (char *)p_AB_suffix,
  71. LK_PARTITION_NAME_SIZE - part_name_len);
  72. }
  73. lk_part_name[LK_PARTITION_NAME_SIZE - 1] = '\0';
  74. lk_part_name_inited = 1;
  75. }
  76. #endif
  77. return lk_part_name;
  78. }
  79. static int load_lk_dtb(char *part_name, char *img_name, void *addr)
  80. {
  81. uint32_t sec_ret;
  82. uint32_t vfy_time;
  83. int dtb_img_size;
  84. #ifdef MTK_SECURITY_SW_SUPPORT
  85. unsigned int policy_entry_idx = 0;
  86. unsigned int img_auth_required = 0;
  87. policy_entry_idx = get_policy_entry_idx(part_name);
  88. img_auth_required = get_vfy_policy(policy_entry_idx);
  89. /* verify cert chain of boot img */
  90. if (img_auth_required) {
  91. vfy_time = get_timer(0);
  92. sec_ret = sec_img_auth_init(part_name, img_name, 0);
  93. if (sec_ret)
  94. return -1;
  95. dprintf(CRITICAL, "[SBC] image %s cert vfy pass(%d ms)\n", img_name, (unsigned int)get_timer(vfy_time));
  96. #ifdef MTK_SECURITY_ANTI_ROLLBACK
  97. sec_ret = sec_rollback_check(1);
  98. if (sec_ret) {
  99. dprintf(CRITICAL, "[SBC] image %s ver check fail...(0x%x)\n", img_name, sec_ret);
  100. return -1;
  101. }
  102. #endif
  103. }
  104. #endif
  105. dtb_img_size = mboot_common_load_part(part_name, img_name, (uint32_t)addr);
  106. dprintf(CRITICAL, "%s(): load %s dtb_img_size=%d\n", __func__, img_name, dtb_img_size);
  107. if (dtb_img_size <= 0)
  108. return -1;
  109. #ifdef MTK_SECURITY_SW_SUPPORT
  110. if (img_auth_required) {
  111. vfy_time = get_timer(0);
  112. sec_ret = sec_img_auth(addr, dtb_img_size);
  113. if (sec_ret)
  114. return -1;
  115. dprintf(CRITICAL, "[SBC] %s vfy pass(%d ms)\n", img_name, (unsigned int)get_timer(vfy_time));
  116. }
  117. #endif
  118. return 0;
  119. }
  120. int32_t lk_dtb_init(void)
  121. {
  122. int ret;
  123. void *dtbo_ptr;
  124. void *lk_main_dtb_ptr;
  125. void *lk_dtbo = NULL;
  126. uint32_t dtbo_size;
  127. uint32_t lk_main_dtb_size;
  128. uint32_t lk_overlayed_dtb_size;
  129. void *lk_overlayed_dtb_ptr = NULL;
  130. PROFILING_START("lk_dtb_init");
  131. lk_main_dtb_ptr = lk_overlayed_dtb_addr;
  132. /* search lk self-built-in dtb */
  133. PROFILING_START("load_lk_dtb");
  134. ret = load_lk_dtb(get_lk_part_name(), LK_DTB_IMG_NAME, lk_main_dtb_ptr);
  135. PROFILING_END();
  136. if (ret < 0)
  137. goto end;
  138. /* read dtbo image */
  139. PROFILING_START("load_dtbo_buffer");
  140. ret = load_dtbo_buffer(&dtbo_ptr, &dtbo_size);
  141. PROFILING_END();
  142. if (ret < 0) {
  143. if (dtbo_ptr)
  144. free(dtbo_ptr);
  145. goto end;
  146. }
  147. dprintf(CRITICAL,"dtbo_size : %u\n", dtbo_size);
  148. PROFILING_START("dtb_overlay");
  149. set_dtbo_load_addr((uint32_t)dtbo_ptr);
  150. set_dtbo_img_size(dtbo_size);
  151. lk_dtbo = malloc(dtbo_size);
  152. if (lk_dtbo == NULL) {
  153. ret = -1;
  154. goto end;
  155. }
  156. selected_dtbo_addr = dtbo_ptr;
  157. memcpy(lk_dtbo, dtbo_ptr, dtbo_size);
  158. lk_main_dtb_size = fdt_totalsize(lk_main_dtb_ptr);
  159. ret = dtb_overlay(lk_main_dtb_ptr, lk_main_dtb_size, lk_dtbo, dtbo_size,
  160. &lk_overlayed_dtb_ptr, DTB_MAX_SIZE);
  161. assert(ret == 0);
  162. if (ret < 0)
  163. goto end;
  164. lk_overlayed_dtb_size = fdt_totalsize(lk_overlayed_dtb_ptr);
  165. if (lk_overlayed_dtb_size > DTB_MAX_SIZE) {
  166. panic("lk_overlayed_dtb_size is too large:%u\n", lk_overlayed_dtb_size);
  167. }
  168. memcpy(lk_overlayed_dtb_addr, lk_overlayed_dtb_ptr, lk_overlayed_dtb_size);
  169. if (dtb_dconfig_overlay(lk_overlayed_dtb_addr) == FALSE) {
  170. panic("dconfig DT overlay failed, system not bootable\n");
  171. }
  172. lk_dtb_inited = 1;
  173. PROFILING_END();
  174. end:
  175. if (lk_overlayed_dtb_ptr)
  176. free(lk_overlayed_dtb_ptr);
  177. if (lk_dtbo)
  178. free(lk_dtbo);
  179. PROFILING_END();
  180. return ret;
  181. }
  182. void *get_lk_overlayed_dtb(void)
  183. {
  184. if (lk_dtb_inited == 0)
  185. panic("LK driver's overlayed dtb is not initialized!\n");
  186. return (void *)lk_overlayed_dtb_addr;
  187. }