gz_init.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
  6. * the prior written permission of MediaTek inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of MediaTek Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * MediaTek Inc. (C) 2016. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  15. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
  25. * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
  30. * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  32. *
  33. * The following software/firmware and/or related documentation ("MediaTek
  34. * Software") have been modified by MediaTek Inc. All revisions are subject to
  35. * any receiver's applicable license agreements with MediaTek Inc.
  36. */
  37. #include "typedefs.h"
  38. #include "platform.h"
  39. #include "download.h"
  40. #include "meta.h"
  41. #include "sec.h"
  42. #include "partition_api.h"
  43. #include "dram_buffer.h"
  44. #include "wdt.h"
  45. #include "emi_mpu_mt.h"
  46. #if CFG_ATF_SUPPORT
  47. #include "tz_init.h"
  48. #endif
  49. #include "sec_devinfo.h"
  50. #include <partition_active.h>
  51. #include <gz_init.h>
  52. #include <gz_atag.h>
  53. #if CFG_GZ_REMAP
  54. #include <gz_remap.h>
  55. #endif
  56. #include <gz_remap_mt.h>
  57. #include "mt_rtc_hw.h"
  58. #if CFG_GZ_PWRAP_ENABLE
  59. #include "pmic_wrap_init.h"
  60. #include "reg_PMIC_WRAP.h"
  61. #endif
  62. #include "log_store_pl.h"
  63. /*============================================================================*/
  64. /* DEBUG MACROS */
  65. /*============================================================================*/
  66. #define GZ_DEBUG
  67. #ifdef GZ_DEBUG
  68. #define DBG_MSG(str, ...) do {pal_log_debug(str, ##__VA_ARGS__);} while(0)
  69. #define DBG_INFO(str, ...) do {pal_log_info(str, ##__VA_ARGS__);} while(0)
  70. #define DBG_ERR(str, ...) do {pal_log_err(str, ##__VA_ARGS__);} while(0)
  71. #else
  72. #define DBG_MSG(str, ...) do {} while(0)
  73. #define DBG_INFO(str, ...) do {pal_log_info(str, ##__VA_ARGS__);} while(0)
  74. #define DBG_ERR(str, ...) do {pal_log_err(str, ##__VA_ARGS__);} while(0)
  75. #endif
  76. /*============================================================================*/
  77. /* CONSTAND DEFINITIONS */
  78. /*============================================================================*/
  79. #define MOD "GZINIT"
  80. #define MBLOCK_RELEASE mblock_create
  81. /*============================================================================*/
  82. /* GLOBAL VARIABLES */
  83. /*============================================================================*/
  84. #define bootarg g_dram_buf->bootarg
  85. extern unsigned int g_uart;
  86. /*============================================================================*/
  87. /* INTERNAL VARIABLES */
  88. /*============================================================================*/
  89. u32 gz_start_addr = 0;
  90. u32 build_variant = 0; /* 1:user; 2:userdebug; 3:eng */
  91. static u32 gz_tee_static_shm_entry_cnt = 0;
  92. static u64 gz_tee_static_shm_current_pa = 0;
  93. u32 is_nebula_enabled = 0;
  94. /*============================================================================*/
  95. /* ENUMERATIONS */
  96. /*============================================================================*/
  97. typedef enum {
  98. GZ_OK = 0,
  99. GZ_PART_LOAD_FAIL = 1,
  100. GZ_PART_INVALID_ADDR = 2,
  101. GZ_PART_INVALID_SIZE = 3,
  102. GZ_PART_DECRYPT_FAIL = 4,
  103. GZ_PART_NOT_FOUND = 5,
  104. GZ_PART_HEADER_NOT_FOUND = 6,
  105. GZ_BOOT_DISABLE = 7,
  106. GZ_BOOT_DEV_NOT_FOUND = 8,
  107. GZ_RESERVE_MEM_FAIL = 9,
  108. GZ_GET_ACTIVE_PART_FAIL = 10,
  109. } E_GZ_FUNC_RET;
  110. /*============================================================================*/
  111. /* GZ reserved memory */
  112. /*============================================================================*/
  113. enum gz_mblock_id {
  114. MEM_GZ_MAIN = 0,
  115. MEM_TEE_STATIC_SHM,
  116. MEM_SDSP2_FW,
  117. MEM_SDSP1_FW,
  118. MEM_SAPU_MTEE_SHM,
  119. MEM_GZ_LOG,
  120. MEM_MD_SHM,
  121. MEM_END,
  122. };
  123. static void set_start_addr(u64 reserved_addr, u64 reserved_size)
  124. {
  125. gz_start_addr = (u32)reserved_addr;
  126. }
  127. static void set_gz_tee_static_shm(u64 reserved_addr, u64 reserved_size)
  128. {
  129. u32 start_addr = (u32)reserved_addr;
  130. gz_tee_static_shm_current_pa = start_addr + GZ_TEE_STATIC_SHM_HEADER_SIZE;
  131. /* just clear for header */
  132. memset((void *)start_addr, 0x0, GZ_TEE_STATIC_SHM_HEADER_SIZE);
  133. }
  134. static void set_gz_sdsp2_fw(u64 reserved_addr, u64 reserved_size)
  135. {
  136. if ((reserved_addr & 0x40000000) !=
  137. ((reserved_addr + (u64)reserved_size) & 0x40000000)) {
  138. DBG_ERR("[%s] gz-sdsp2-fw range fatal error...\n", MOD);
  139. ASSERT(0);
  140. }
  141. }
  142. static void set_gz_sdsp1_fw(u64 reserved_addr, u64 reserved_size)
  143. {
  144. if ((reserved_addr & 0x40000000) !=
  145. ((reserved_addr + (u64)reserved_size) & 0x40000000)) {
  146. DBG_ERR("[%s] gz-sdsp1-fw range fatal error...\n", MOD);
  147. ASSERT(0);
  148. }
  149. }
  150. static void set_gz_log_addr(u64 reserved_addr, u64 reserved_size)
  151. {
  152. ((struct sram_log_header *)SRAM_LOG_ADDR)->gz_log_addr = reserved_addr;
  153. ((struct sram_log_header *)SRAM_LOG_ADDR)->gz_log_len = reserved_size;
  154. }
  155. static struct gz_mblock_info gz_mbinfo[] = {
  156. /* 2MB alignment */
  157. [MEM_GZ_MAIN] = {
  158. .addr = 0,
  159. .size = GZ_DRAM_SIZE,
  160. .align = GZ_ALIGNMENT,
  161. .limit = GZ_ADDR_MAX,
  162. .post_process = set_start_addr,
  163. .name = "gz",
  164. },
  165. [MEM_TEE_STATIC_SHM] ={
  166. .addr = 0,
  167. #if defined(CFG_GZ_TEE_STATIC_SHM) && CFG_GZ_TEE_STATIC_SHM
  168. .size = GZ_TEE_STATIC_SHM_SIZE,
  169. #else
  170. .size = 0,
  171. #endif
  172. .align = GZ_TEE_STATIC_SHM_ALIGNMENT,
  173. .limit = GZ_TEE_STATIC_SHM_ADDR_MAX,
  174. .post_process = set_gz_tee_static_shm,
  175. .name = "gz-tee-static-shm",
  176. },
  177. [MEM_SDSP2_FW] = {
  178. .addr = 0,
  179. #if defined(CFG_GZ_SECURE_DSP) && CFG_GZ_SECURE_DSP
  180. .size = GZ_SDSP_FW_SIZE,
  181. #else
  182. .size = 0,
  183. #endif
  184. .align = GZ_SDSP_FW_ALIGNMENT,
  185. .limit = GZ_SDSP_FW_ADDR_MAX,
  186. .post_process = set_gz_sdsp2_fw,
  187. .name = "gz-sdsp2-fw",
  188. },
  189. [MEM_SDSP1_FW] = {
  190. .addr = 0,
  191. #if defined(CFG_GZ_SECURE_DSP) && CFG_GZ_SECURE_DSP
  192. .size = GZ_SDSP_FW_SIZE,
  193. #else
  194. .size = 0,
  195. #endif
  196. .align = GZ_SDSP_FW_ALIGNMENT,
  197. .limit = GZ_SDSP_FW_ADDR_MAX,
  198. .post_process = set_gz_sdsp1_fw,
  199. .name = "gz-sdsp1-fw",
  200. },
  201. [MEM_SAPU_MTEE_SHM] = {
  202. .addr = 0,
  203. #if defined(CFG_GZ_SAPU_MTEE_SHM) && CFG_GZ_SAPU_MTEE_SHM
  204. .size = SAPU_MTEE_SHM_SIZE,
  205. #else
  206. .size = 0,
  207. #endif
  208. .align = SAPU_MTEE_SHM_ALIGNMENT,
  209. .limit = SAPU_MTEE_SHM_ADDR_MAX,
  210. .post_process = NULL,
  211. .name = "sapu-mtee-shm",
  212. },
  213. [MEM_GZ_LOG] = {
  214. .addr = 0,
  215. .size = GZ_LOG_BUFFER_SIZE,
  216. .align = GZ_ALIGNMENT,
  217. .limit = GZ_ADDR_MAX,
  218. .post_process = set_gz_log_addr,
  219. .name = "gz-log",
  220. },
  221. /* 64MB alignment */
  222. [MEM_MD_SHM] = {
  223. .addr = 0,
  224. .size = GZ_MD_SHM_SIZE,
  225. .align = GZ_MD_SHM_ALIGNMENT,
  226. .limit = GZ_MD_SHM_ADDR_MAX,
  227. .post_process = NULL,
  228. .name = "gz-md-shm",
  229. },
  230. };
  231. static int gz_mblock_create(void)
  232. {
  233. int i = 0;
  234. u64 reserved_addr, max_addr = 0;
  235. struct gz_mblock_info *mbinfo;
  236. for (i = 0; i < ARRAY_SIZE(gz_mbinfo); i++) {
  237. mbinfo = &gz_mbinfo[i];
  238. if (!mbinfo->size) {
  239. DBG_MSG("[%s] %s: Skip reserve %s mblock\n",
  240. MOD, __func__, mbinfo->name);
  241. continue;
  242. }
  243. if (gz_start_addr != 0 && gz_start_addr != EL2_BOOTING_DISABLED)
  244. max_addr = gz_start_addr;
  245. else
  246. max_addr = mbinfo->limit;
  247. reserved_addr = mblock_reserve_ext(&bootarg.mblock_info,
  248. mbinfo->size, mbinfo->align, max_addr, 0, mbinfo->name);
  249. if (!reserved_addr) {
  250. DBG_ERR("[%s] %s: %s memory 0x%llx, size 0x%llx fatal error\n",
  251. MOD, __func__, mbinfo->name, mbinfo->addr, mbinfo->size);
  252. return GZ_RESERVE_MEM_FAIL;
  253. }
  254. mbinfo->addr = reserved_addr;
  255. if (mbinfo->post_process != NULL)
  256. mbinfo->post_process(reserved_addr, mbinfo->size);
  257. DBG_INFO("[%s] %s: allocate %s memory 0x%llx, size 0x%llx\n",
  258. MOD, __func__, mbinfo->name, mbinfo->addr, mbinfo->size);
  259. }
  260. return GZ_OK;
  261. }
  262. static int gz_mblock_release(void)
  263. {
  264. int i = 0, ret;
  265. struct gz_mblock_info *mbinfo;
  266. for (i = ARRAY_SIZE(gz_mbinfo) - 1; i >= 0; i--) {
  267. mbinfo = &gz_mbinfo[i];
  268. if (!mbinfo->addr)
  269. continue;
  270. ret = MBLOCK_RELEASE(&bootarg.mblock_info, &bootarg.orig_dram_info,
  271. (u64)mbinfo->addr, (u64)mbinfo->size);
  272. if (ret) {
  273. DBG_ERR("[%s] %s: %s release 0x%llx, size 0x%llx fatal error\n",
  274. MOD, __func__, mbinfo->name, mbinfo->addr, mbinfo->size);
  275. return GZ_RESERVE_MEM_FAIL;
  276. }
  277. DBG_INFO("[%s] %s: release %s 0x%llx, size 0x%llx\n",
  278. MOD, __func__, mbinfo->name, mbinfo->addr, mbinfo->size);
  279. mbinfo->addr = 0;
  280. }
  281. return GZ_OK;
  282. }
  283. /*============================================================================*/
  284. /* GZ export functions */
  285. /*============================================================================*/
  286. u32 gz_get_sdsp_mem_info(u32 *pa, u32 *size)
  287. {
  288. *pa = gz_mbinfo[MEM_SDSP1_FW].addr;
  289. *size = (gz_mbinfo[MEM_SDSP1_FW].size + gz_mbinfo[MEM_SDSP2_FW].size);
  290. return 0;
  291. }
  292. u32 gz_get_sapu_shm_info(u32 *pa, u32 *size)
  293. {
  294. *pa = gz_mbinfo[MEM_SAPU_MTEE_SHM].addr;
  295. *size = gz_mbinfo[MEM_SAPU_MTEE_SHM].size;
  296. return 0;
  297. }
  298. u32 get_gz_tee_static_shm_info(u32 *pa, u32 *size)
  299. {
  300. *pa = gz_mbinfo[MEM_TEE_STATIC_SHM].addr;
  301. *size = gz_mbinfo[MEM_TEE_STATIC_SHM].size;
  302. return 0;
  303. }
  304. static u64 get_ddr_remap_offset(void)
  305. {
  306. #if CFG_GZ_REMAP
  307. u64 offset = gz_remap_ddr_get_offset(GZ_REMAP_VMID_GZ);
  308. return (offset & 0x8000000000000000ULL) ? 0x0LL : offset;
  309. #else
  310. return 0x0LL;
  311. #endif
  312. }
  313. u64 gz_get_jump_addr(void)
  314. {
  315. u64 addr64;
  316. addr64 = gz_start_addr;
  317. #if CFG_GZ_REMAP
  318. addr64 += get_ddr_remap_offset();
  319. #endif
  320. return addr64;
  321. }
  322. /*============================================================================*/
  323. /* GZ Initial Flow */
  324. /*============================================================================*/
  325. /* Vendor customization.
  326. * 1: disable gz booting
  327. * 0: enable gz booting
  328. */
  329. static int gz_booting_disable_cfg(void)
  330. {
  331. /* default is to enable EL2 booting */
  332. return 0;
  333. }
  334. static void gz_set_boot_disabled(void)
  335. {
  336. int i;
  337. gz_start_addr = EL2_BOOTING_DISABLED;
  338. gz_tee_static_shm_current_pa = 0;
  339. for (i = 0; i < ARRAY_SIZE(gz_mbinfo); i++)
  340. gz_mbinfo[i].addr = 0;
  341. }
  342. unsigned int is_booting_el2(void)
  343. {
  344. if (gz_start_addr == EL2_BOOTING_DISABLED)
  345. return 0;
  346. return 1; /* booting el2 */
  347. }
  348. #define img_hdr_buf (g_dram_buf->img_hdr_buf)
  349. #define CMP_EQ(a,b) ((a) == (b))
  350. static int gz_part_existence_check(void)
  351. {
  352. ssize_t read_len;
  353. ssize_t try_len = sizeof(part_hdr_t);
  354. read_len = partition_read("gz", 0, (uint8_t *)img_hdr_buf, try_len);
  355. if (CMP_EQ(read_len, try_len))
  356. return GZ_OK;
  357. DBG_ERR("[%s] invalid 'gz' part length: %d\n", MOD, read_len);
  358. gz_set_boot_disabled();
  359. return GZ_PART_HEADER_NOT_FOUND;
  360. }
  361. static u32 get_build_variant(void)
  362. {
  363. /* default treat it as user load */
  364. u32 variant = 1;
  365. #ifdef TARGET_BUILD_VARIANT_USER
  366. variant = 1;
  367. #endif
  368. #ifdef TARGET_BUILD_VARIANT_USERDEBUG
  369. variant = 2;
  370. #endif
  371. #ifdef TARGET_BUILD_VARIANT_ENG
  372. variant = 3;
  373. #endif
  374. return variant;
  375. }
  376. void gz_pre_init()
  377. {
  378. int ret;
  379. build_variant = get_build_variant();
  380. ret = gz_part_existence_check();
  381. if (ret) {
  382. DBG_ERR("[%s] gz part check failed: %d!\n", MOD, ret);
  383. return;
  384. }
  385. ret = gz_mblock_create();
  386. if (ret) {
  387. DBG_ERR("[%s] GZ fatal error...\n", MOD);
  388. ASSERT(0);
  389. }
  390. #if defined(CFG_GZ_SECURE_DSP) && CFG_GZ_SECURE_DSP
  391. ASSERT(gz_mbinfo[MEM_SDSP2_FW].addr ==
  392. (gz_mbinfo[MEM_SDSP1_FW].addr + gz_mbinfo[MEM_SDSP1_FW].size));
  393. #endif
  394. }
  395. static void gz_release_all(void)
  396. {
  397. int ret;
  398. DBG_INFO("[%s] skip load gz(%s)\n", MOD, __func__);
  399. ret = gz_mblock_release();
  400. if (ret) {
  401. DBG_ERR("[%s] GZ fatal error...\n", MOD);
  402. ASSERT(0);
  403. }
  404. gz_set_boot_disabled();
  405. }
  406. int gz_de_init(void)
  407. {
  408. if (gz_booting_disable_cfg()) {
  409. gz_release_all();
  410. return 1;
  411. }
  412. return 0;
  413. }
  414. #if defined(CFG_GZ_TEE_STATIC_SHM) && CFG_GZ_TEE_STATIC_SHM
  415. static int gz_alloc_gz_tee_static_shm(const char *name, u32 sz)
  416. {
  417. gz_tee_static_shm_t *ptr;
  418. u32 sz_page_align = (sz + GZ_PAGE_SIZE - 1) & (~(GZ_PAGE_SIZE - 1));
  419. if (!gz_tee_static_shm_current_pa)
  420. return -1;
  421. if ((gz_tee_static_shm_current_pa + sz_page_align) >
  422. (gz_mbinfo[MEM_TEE_STATIC_SHM].addr + gz_mbinfo[MEM_TEE_STATIC_SHM].size))
  423. return -1;
  424. if (strlen(name)>=MAX_GZ_TEE_STATIC_SHM_NAME)
  425. return -1;
  426. DBG_INFO("%s %s %u\n", __func__, name, strlen(name));
  427. ptr = (gz_tee_static_shm_t *)((u32)gz_mbinfo[MEM_TEE_STATIC_SHM].addr +
  428. sizeof(gz_tee_static_shm_t) * gz_tee_static_shm_entry_cnt);
  429. if (gz_tee_static_shm_entry_cnt < MAX_GZ_TEE_STATIC_SHM_ENTRY) {
  430. ptr->magic = MAGIC_NUMBER;
  431. sz_page_align = (sz + GZ_PAGE_SIZE - 1) & (~(GZ_PAGE_SIZE - 1));
  432. ptr->sz = sz_page_align;
  433. ptr->pa = gz_tee_static_shm_current_pa;
  434. memcpy(&ptr->name, name, strlen(name));
  435. gz_tee_static_shm_current_pa = gz_tee_static_shm_current_pa + sz_page_align;
  436. gz_tee_static_shm_entry_cnt++;
  437. return 0;
  438. }
  439. return -1;
  440. }
  441. #endif
  442. void gz_post_init(void)
  443. {
  444. int rc;
  445. if (!is_booting_el2())
  446. return;
  447. #if CFG_GZ_REMAP
  448. if (gz_remap_init() != GZ_REMAP_SUCCESS) {
  449. DBG_ERR("[%s] GZ remap initialization fatal error ...\n", MOD);
  450. ASSERT(0);
  451. }
  452. gz_remap_dump_config();
  453. #endif
  454. #if defined(CFG_GZ_TEE_STATIC_SHM) && CFG_GZ_TEE_STATIC_SHM
  455. #ifdef GZ_TEE_STATIC_SHM_UT_TEST //UT disable
  456. rc = gz_alloc_gz_tee_static_shm("for-ut-test1", 4095);
  457. ASSERT(!rc);
  458. rc = gz_alloc_gz_tee_static_shm("for-ut-test2", 8191);
  459. ASSERT(!rc);
  460. #endif
  461. #endif
  462. }
  463. /*============================================================================*/
  464. /* GZ Image Loading */
  465. /*============================================================================*/
  466. u32 gz_get_load_addr(u32 maddr)
  467. {
  468. DBG_INFO("[%s] GZ load start: 0x%x (maddr: 0x%x)\n", MOD, gz_start_addr, maddr);
  469. return gz_start_addr;
  470. }
  471. static inline u32 get_vm_load_addr(void)
  472. {
  473. return gz_start_addr + (GZ_DRAM_SIZE - VM_DRAM_SIZE);
  474. }
  475. #if CFG_NEBULA_LOAD_IN_PART2
  476. static int load_vm_from_part2(blkdev_t *bdev, const char *active_part_name)
  477. {
  478. u32 offset = 0;
  479. int ret;
  480. u32 size;
  481. part_t *part;
  482. u32 vm_load_addr = get_vm_load_addr();
  483. DBG_INFO("[%s] load VM to addr=0x%x from part=%s (p2)\n", MOD,
  484. vm_load_addr, active_part_name);
  485. part = part_get((char *)active_part_name);
  486. if (!part) {
  487. DBG_ERR("[%s] load part %s failed!\n", MOD, active_part_name);
  488. return GZ_GET_ACTIVE_PART_FAIL;
  489. }
  490. ret = part_load(bdev, part, &vm_load_addr, offset, &size);
  491. if (ret) {
  492. DBG_ERR("[%s] load VM failed at part=%s, ret=%d (p2)\n", MOD,
  493. part->info->name, ret);
  494. return ret;
  495. }
  496. #if CFG_GZ_NEED_DESCRAMBLE
  497. ret = descramble(vm_load_addr, size);
  498. if (ret) {
  499. DBG_ERR("%s descramble VM failed, ret=%d (p2)\n", MOD, ret);
  500. return ret;
  501. }
  502. #endif
  503. return ret;
  504. }
  505. #endif
  506. static int bldr_load_vm_part(blkdev_t *bdev, part_t *part, u32 part_offset)
  507. {
  508. u32 size;
  509. int ret;
  510. u32 vm_load_addr = get_vm_load_addr();
  511. if (VM_DRAM_SIZE == 0)
  512. return GZ_PART_LOAD_FAIL;
  513. #if CFG_NEBULA_LOAD_IN_PART2
  514. char gz2_part_name[PART_NAME_BUF_SZ] = {0};
  515. memset(gz2_part_name, 0x0, PART_NAME_BUF_SZ);
  516. memcpy(gz2_part_name, "gz", strlen("gz"));
  517. ret = partition_get_active(gz2_part_name, PART_NAME_BUF_SZ, GET_INACTIVE);
  518. if (ret) {
  519. DBG_ERR("[%s] get inactive part name failed!\n", MOD);
  520. return GZ_PART_LOAD_FAIL;
  521. }
  522. return load_vm_from_part2(bdev, gz2_part_name);
  523. #endif
  524. DBG_INFO("[%s] load VM to addr=0x%x (p1)\n", MOD, vm_load_addr);
  525. ret = part_load(bdev, part, &vm_load_addr, part_offset, &size);
  526. if (ret) {
  527. DBG_ERR("[%s] load VM failed at part=%s, ret=%d (p1)\n", MOD,
  528. part->info->name);
  529. return ret;
  530. }
  531. #if CFG_GZ_NEED_DESCRAMBLE
  532. ret = descramble(vm_load_addr, size);
  533. if (ret) {
  534. DBG_ERR("[%s] descramble VM failed, ret=%d (p1)\n", MOD, ret);
  535. return ret;
  536. }
  537. #endif
  538. return GZ_OK;
  539. }
  540. int bldr_load_gz_part(blkdev_t *bdev, const char *part_name)
  541. {
  542. static u32 offset = 0;
  543. u32 size;
  544. int ret;
  545. part_t *part = part_get((char *)part_name);
  546. u32 addr = gz_get_load_addr(0);
  547. if (!is_booting_el2()) {
  548. DBG_INFO("[%s] EL2_BOOTING_DISABLED, skip load gz %s\n", MOD, __func__);
  549. return GZ_OK;
  550. }
  551. if (!part) {
  552. DBG_ERR("[%s] get part %s failed!\n", MOD, part_name);
  553. return GZ_PART_LOAD_FAIL;
  554. }
  555. ret = part_load(bdev, part, &addr, offset, &size);
  556. if (ret) {
  557. DBG_ERR("[%s] %s part. ATF load fail\n", MOD, part_name);
  558. return GZ_PART_LOAD_FAIL;
  559. }
  560. /* check if target address defined by image is the same as mblock reserved address */
  561. if (addr != gz_start_addr) {
  562. DBG_ERR("[%s] %s part. error: target addr = 0x%x but reserved addr = 0x%x\n",
  563. MOD, part_name, addr, gz_start_addr);
  564. return GZ_PART_INVALID_ADDR;
  565. }
  566. /* check if the size of GZ image loaded exceeds the reserved size */
  567. if (size > GZ_DRAM_SIZE) {
  568. DBG_ERR("[%s] %s part. error: image size = 0x%x but reserved size = 0x%x\n",
  569. MOD, part_name, size, GZ_DRAM_SIZE);
  570. return GZ_PART_INVALID_SIZE;
  571. }
  572. #if CFG_GZ_NEED_DESCRAMBLE
  573. ret = descramble(gz_start_addr, size);
  574. if (ret) {
  575. DBG_ERR("[%s] error descramble: ret = %d\n", MOD, ret);
  576. return GZ_PART_DECRYPT_FAIL;
  577. }
  578. #endif
  579. ret = bldr_load_vm_part(bdev, part, (sizeof(part_hdr_t) + size));
  580. if (ret == GZ_OK) {
  581. DBG_INFO("[%s] load nebula succeeded\n", MOD);
  582. is_nebula_enabled= 1;
  583. } else {
  584. is_nebula_enabled = 0;
  585. DBG_ERR("[%s] load nebula failed, DISABLE mtee nebula\n",MOD);
  586. if (VM_DRAM_SIZE != 0) {
  587. ret = MBLOCK_RELEASE(&bootarg.mblock_info, &bootarg.orig_dram_info,
  588. (u64)(gz_start_addr + EL2_DRAM_SIZE), (u64)VM_DRAM_SIZE);
  589. if (ret)
  590. DBG_ERR("[%s] GZ MD release nebula memory fatal error\n", MOD);
  591. }
  592. }
  593. return GZ_OK;
  594. }
  595. /*============================================================================*/
  596. /* GZ ATAG Passing */
  597. /*============================================================================*/
  598. static u32 get_boot_configs(void)
  599. {
  600. u32 val = 0;
  601. if (!is_booting_el2())
  602. val |= EL2_BOOT_DISABLE;
  603. #if CFG_GZ_REMAP
  604. val |= EL2_REMAP_ENABLE;
  605. #endif
  606. DBG_INFO("[%s] GZ CONFIGS = 0x%x\n", MOD, val);
  607. return val;
  608. }
  609. static u32 get_remap_domain(void)
  610. {
  611. #if CFG_GZ_REMAP
  612. return GZ_REMAP_VMDOMAIN_GZ;
  613. #else
  614. return 0x0;
  615. #endif
  616. }
  617. static u64 get_io_remap_offset(void)
  618. {
  619. #if CFG_GZ_REMAP
  620. u64 offset = gz_remap_io_get_offset(GZ_REMAP_VMID_GZ);
  621. return (offset & 0x8000000000000000ULL) ? 0x0LL : offset;
  622. #else
  623. return 0x0LL;
  624. #endif
  625. }
  626. static u64 get_sec_io_remap_offset(void)
  627. {
  628. #if CFG_GZ_REMAP
  629. u64 offset = gz_remap_sec_io_get_offset(GZ_REMAP_VMID_GZ);
  630. return (offset & 0x8000000000000000ULL) ? 0x0LL : offset;
  631. #else
  632. return 0x0LL;
  633. #endif
  634. }
  635. static u32 get_load_offset_without_remap(void)
  636. {
  637. u32 gz_load_offset = (gz_start_addr - GZ_KERNEL_LOAD_OFFSET);
  638. DBG_INFO("[%s] GZ exec load offset: 0x%x\n", MOD, gz_load_offset);
  639. return gz_load_offset;
  640. }
  641. u32 gz_config_info_atag(boot_tag *tags)
  642. {
  643. if (!is_booting_el2())
  644. return (u32)tags;
  645. tags->hdr.size = boot_tag_size(boot_tag_gz_info);
  646. tags->hdr.tag = BOOT_TAG_GZ_INFO;
  647. tags->u.gz_info.gz_configs = get_boot_configs();
  648. tags->u.gz_info.lk_addr = CFG_UBOOT_MEMADDR;
  649. tags->u.gz_info.build_variant= build_variant;
  650. return (u32)boot_tag_next(tags);
  651. }
  652. u32 gz_config_boot_atag(boot_tag *tags)
  653. {
  654. blkdev_t *bootdev;
  655. u32 rpmb_total_size;
  656. int ret;
  657. if (!is_booting_el2())
  658. return (u32)tags;
  659. tags->hdr.size = boot_tag_size(boot_tag_gz_param);
  660. tags->hdr.tag = BOOT_TAG_GZ_PARAM;
  661. tags->u.gz_param.modemMteeShareMemPA = gz_mbinfo[MEM_MD_SHM].addr;
  662. tags->u.gz_param.modemMteeShareMemSize = gz_mbinfo[MEM_MD_SHM].size;
  663. ret = tee_get_hwuid(tags->u.gz_param.hwuid, ME_IDENTITY_LEN);
  664. if (ret != 0) {
  665. DBG_ERR("[%s] gz hwuid fail, ret=%d\n", MOD, ret);
  666. }
  667. #if 0
  668. pal_log_info("gz hwuid done\n");
  669. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  670. tags->u.gz_param.hwuid[0], tags->u.gz_param.hwuid[1],
  671. tags->u.gz_param.hwuid[2], tags->u.gz_param.hwuid[3]);
  672. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  673. tags->u.gz_param.hwuid[4], tags->u.gz_param.hwuid[5],
  674. tags->u.gz_param.hwuid[6], tags->u.gz_param.hwuid[7]);
  675. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  676. tags->u.gz_param.hwuid[8], tags->u.gz_param.hwuid[9],
  677. tags->u.gz_param.hwuid[10], tags->u.gz_param.hwuid[11]);
  678. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  679. tags->u.gz_param.hwuid[12], tags->u.gz_param.hwuid[13],
  680. tags->u.gz_param.hwuid[14], tags->u.gz_param.hwuid[15]);
  681. #endif
  682. ret = rpmb_get_key(tags->u.gz_param.rpmb_key, RPMB_KEY_SIZE);
  683. if (ret != 0) {
  684. DBG_ERR("[%s] gz rpmb_key fail, ret=%d\n", MOD, ret);
  685. }
  686. #if !defined(BOOTDEV_SDMMC_UFS_COMBO)
  687. #if (CFG_BOOT_DEV == BOOTDEV_UFS)
  688. rpmb_total_size = (u32)ufs_rpmb_get_lu_size();
  689. #elif (CFG_BOOT_DEV == BOOTDEV_SDMMC)
  690. rpmb_total_size = (u32)mmc_rpmb_get_size();
  691. #endif /* CFG_BOOT_DEV */
  692. #else
  693. #if (CFG_BOOT_DEV == BOOTDEV_SDMMC) || (CFG_BOOT_DEV == BOOTDEV_UFS)
  694. bootdev = blkdev_get(CFG_BOOT_DEV);
  695. rpmb_total_size =
  696. (bootdev == NULL) ? 0 :
  697. (bootdev->type == BOOTDEV_UFS) ? ufs_rpmb_get_lu_size() :
  698. (bootdev->type == BOOTDEV_SDMMC) ? mmc_rpmb_get_size() : 0;
  699. #endif /* CFG_BOOT_DEV */
  700. #endif /* BOOTDEV_SDMMC_UFS_COMBO */
  701. /* By-default the bottom part of RPMB is reserved for GZ */
  702. if (rpmb_total_size == 0 || rpmb_total_size < GZ_RPMB_SIZE) {
  703. DBG_ERR("[%s] gz insufficient RPMB size, need %u but total=%u\n",
  704. GZ_RPMB_SIZE, rpmb_total_size);
  705. } else {
  706. tags->u.gz_param.rpmb_base = rpmb_total_size - GZ_RPMB_SIZE;
  707. tags->u.gz_param.rpmb_size = GZ_RPMB_SIZE;
  708. }
  709. #if 0
  710. pal_log_info("gz rpmb_key done(partial value)\n");
  711. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  712. tags->u.gz_param.rpmb_key[0], tags->u.gz_param.rpmb_key[1],
  713. tags->u.gz_param.rpmb_key[2], tags->u.gz_param.rpmb_key[3]);
  714. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  715. tags->u.gz_param.rpmb_key[4], tags->u.gz_param.rpmb_key[5],
  716. tags->u.gz_param.rpmb_key[6], tags->u.gz_param.rpmb_key[7]);
  717. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  718. tags->u.gz_param.rpmb_key[8], tags->u.gz_param.rpmb_key[9],
  719. tags->u.gz_param.rpmb_key[10], tags->u.gz_param.rpmb_key[11]);
  720. pal_log_info("0x%x 0x%x 0x%x 0x%x\n",
  721. tags->u.gz_param.rpmb_key[12], tags->u.gz_param.rpmb_key[13],
  722. tags->u.gz_param.rpmb_key[14], tags->u.gz_param.rpmb_key[15]);
  723. #endif
  724. return (u32)boot_tag_next(tags);
  725. }
  726. u32 gz_config_platform_atag(boot_tag *tags)
  727. {
  728. int ret;
  729. COMPILE_ASSERT(GZ_PLAT_TAG_SIZE == sizeof(struct boot_tag_gz_platform));
  730. if (!is_booting_el2())
  731. return (u32)tags;
  732. tags->hdr.size = boot_tag_size(boot_tag_gz_platform);
  733. tags->hdr.tag = BOOT_TAG_GZ_PLAT;
  734. tags->u.gz_plat.reg_base.uart = g_uart;
  735. /* Switch log port to UART2 while uart meta connected */
  736. if (g_boot_mode == META_BOOT && g_meta_com_type == META_UART_COM)
  737. tags->u.gz_plat.reg_base.uart = UART2;
  738. tags->u.gz_plat.reg_base.cpuxgpt = CPUXGPT_BASE;
  739. tags->u.gz_plat.reg_base.gicd = GICD_BASE;
  740. tags->u.gz_plat.reg_base.gicr = GICR_BASE;
  741. #if CFG_GZ_PWRAP_ENABLE && defined(PWRAP_BASE)
  742. tags->u.gz_plat.reg_base.pwrap = PWRAP_BASE;
  743. #else
  744. tags->u.gz_plat.reg_base.pwrap = 0x0;
  745. #endif
  746. #if CFG_GZ_PWRAP_ENABLE && defined(RTC_SEC_BASE)
  747. tags->u.gz_plat.reg_base.rtc = RTC_SEC_BASE;
  748. #else
  749. tags->u.gz_plat.reg_base.rtc = 0x0;
  750. #endif
  751. tags->u.gz_plat.reg_base.mcucfg = MCUCFG_BASE;
  752. tags->u.gz_plat.reserve_mem_size = (GZ_DRAM_SIZE - VM_DRAM_SIZE);
  753. if (is_nebula_enabled)
  754. tags->u.gz_plat.vm_mem_size = VM_DRAM_SIZE;
  755. else
  756. tags->u.gz_plat.vm_mem_size = 0;
  757. tags->u.gz_plat.remap.offset_ddr = get_ddr_remap_offset();
  758. tags->u.gz_plat.remap.offset_io = get_io_remap_offset();
  759. tags->u.gz_plat.remap.offset_sec_io = get_sec_io_remap_offset();
  760. tags->u.gz_plat.exec_start_offset = get_ddr_remap_offset();
  761. tags->u.gz_plat.exec_start_offset += get_load_offset_without_remap();
  762. tags->u.gz_plat.flags = 0x0LL;
  763. tags->u.gz_plat.flags |= GZ_PLAT_FLAGS_ERASE_ATAG;
  764. #if CFG_GZ_REMAP
  765. tags->u.gz_plat.flags |= GZ_PLAT_FLAGS_REMAP_ENABLE;
  766. #endif
  767. tags->u.gz_plat.flags |= GZ_PLAT_FLAGS_GIC_V3;
  768. #if CFG_GZ_PWRAP_ENABLE
  769. tags->u.gz_plat.flags |= GZ_PLAT_FLAGS_PWRAP_EN;
  770. #endif
  771. if (is_nebula_enabled)
  772. tags->u.gz_plat.flags |= GZ_PLAT_FLAGS_NEBULA_ENABLED;
  773. tags->u.gz_plat.plat_ver.hw_code = (u16)DRV_Reg32(APHW_CODE);
  774. tags->u.gz_plat.plat_ver.hw_sub_code = (u16)DRV_Reg32(APHW_SUBCODE);
  775. tags->u.gz_plat.dev_info_area30 = seclib_get_devinfo_with_index(E_AREA30);
  776. tags->u.gz_plat.dram_size_1mb_cnt = (u32)(platform_memory_size() >> 20);
  777. tags->u.gz_plat.log_addr = gz_mbinfo[MEM_GZ_LOG].addr;
  778. tags->u.gz_plat.log_size =
  779. (gz_mbinfo[MEM_GZ_LOG].addr != 0) ? gz_mbinfo[MEM_GZ_LOG].size : 0;
  780. tags->u.gz_plat.sys_timer_irq = SYS_TIMER_IRQ;
  781. DBG_INFO("[%s] gz nebula enabled: 0x%x\n", MOD, is_nebula_enabled);
  782. DBG_INFO("[%s] gz uart: 0x%x\n", MOD, tags->u.gz_plat.reg_base.uart);
  783. DBG_INFO("[%s] gz dram size: 0x%x\n", MOD, tags->u.gz_plat.dram_size_1mb_cnt);
  784. DBG_INFO("[%s] gz devinfo area30: 0x%x\n", MOD, tags->u.gz_plat.dev_info_area30);
  785. DBG_INFO("[%s] gz platform flags: 0x%llx\n", MOD, tags->u.gz_plat.flags);
  786. return (u32)boot_tag_next(tags);
  787. }
  788. #if CFG_GZ_PWRAP_ENABLE
  789. u32 gz_config_pwrap_atag(boot_tag *tags)
  790. {
  791. int ret;
  792. unsigned int x;
  793. COMPILE_ASSERT(GZ_PWRAP_TAG_SIZE == sizeof(struct boot_tag_gz_pwrap));
  794. if (!is_booting_el2())
  795. return (u32)tags;
  796. tags->hdr.size = boot_tag_size(boot_tag_gz_pwrap);
  797. tags->hdr.tag = BOOT_TAG_GZ_PWRAP;
  798. tags->u.gz_pwrap.wacs1_init_done = PMIC_WRAP_INIT_DONE1;
  799. tags->u.gz_pwrap.wacs1_cmd = PMIC_WRAP_WACS1_CMD;
  800. tags->u.gz_pwrap.wacs1_rdata = PMIC_WRAP_WACS1_RDATA;
  801. tags->u.gz_pwrap.wacs1_vldclr = PMIC_WRAP_WACS1_VLDCLR;
  802. tags->u.gz_pwrap.get_wacs1_init_done1_shift = GET_WACS1_INIT_DONE1_SHIFT;
  803. tags->u.gz_pwrap.get_sys_idle1_shift = GET_SYS_IDLE1_SHIFT;
  804. DBG_INFO("[%s] pwrap wacs1_init_done: 0x%x\n", MOD, tags->u.gz_pwrap.wacs1_init_done);
  805. DBG_INFO("[%s] pwrap wacs1_cmd: 0x%x\n", MOD, tags->u.gz_pwrap.wacs1_cmd);
  806. DBG_INFO("[%s] pwrap wacs1_rdata: 0x%x\n", MOD, tags->u.gz_pwrap.wacs1_rdata);
  807. DBG_INFO("[%s] pwrap wacs1_vldclr: 0x%x\n", MOD, tags->u.gz_pwrap.wacs1_vldclr);
  808. DBG_INFO("[%s] pwrap get_wacs1_init_done1_shift: %d\n", MOD, tags->u.gz_pwrap.get_wacs1_init_done1_shift);
  809. DBG_INFO("[%s] pwrap get_sys_idle1_shift: %d\n", MOD, tags->u.gz_pwrap.get_sys_idle1_shift);
  810. return (u32)boot_tag_next(tags);
  811. }
  812. #endif