platform.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  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) 2015. 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 <stdlib.h>
  33. #include <string.h>
  34. #include <video.h>
  35. #include <dev/uart.h>
  36. #include <arch/arm.h>
  37. #include <arch/arm/mmu.h>
  38. #include <arch/ops.h>
  39. #include <target/board.h>
  40. #include <platform/mt_reg_base.h>
  41. #include <platform/mt_disp_drv.h>
  42. #include <platform/disp_drv.h>
  43. #include <platform/boot_mode.h>
  44. #include <platform/mt_logo.h>
  45. #include <platform/partition.h>
  46. #include <env.h>
  47. #include <platform/mt_gpio.h>
  48. #include <platform/mt_pmic.h>
  49. #include <platform/mt_pmic_wrap_init.h>
  50. #include <platform/mt_i2c.h>
  51. #include <platform/mtk_key.h>
  52. #include <platform/mt_rtc.h>
  53. #include <platform/mt_leds.h>
  54. #include <platform/upmu_common.h>
  55. #include <platform/mtk_wdt.h>
  56. #include <platform/boot_mode.h>
  57. #include <platform/disp_drv_platform.h>
  58. #include <plinfo.h> // for plinfo_get_brom_header_block_size()
  59. #include <platform/l2c.h>
  60. #include <platform/verified_boot.h>
  61. #include <load_vfy_boot.h>
  62. #include <pal_log.h>
  63. #include <fdt_op.h>
  64. #ifdef MTK_AB_OTA_UPDATER
  65. #include "bootctrl.h"
  66. #endif
  67. #if defined(MTK_SECURITY_SW_SUPPORT)
  68. #include "oemkey.h"
  69. #endif
  70. #ifdef MTK_SECURITY_SW_SUPPORT
  71. extern u8 g_oemkey[OEM_PUBK_SZ];
  72. #endif
  73. #ifdef LK_DL_CHECK
  74. /*block if check dl fail*/
  75. #undef LK_DL_CHECK_BLOCK_LEVEL
  76. #endif
  77. //#define MT_SRAM_REPAIR_SUPPORT
  78. extern void platform_early_init_timer();
  79. extern void jump_da(u32 addr, u32 arg1, u32 arg2);
  80. extern int i2c_hw_init(void);
  81. extern int mboot_common_load_logo(unsigned long logo_addr, char *filename);
  82. extern int sec_func_init(u64 pl_start_addr);
  83. extern int sec_usbdl_enabled(void);
  84. extern int sec_usbdl_verify_da(unsigned char *, unsigned int, unsigned char *,
  85. unsigned int);
  86. extern void mtk_wdt_disable(void);
  87. extern void platform_deinit_interrupts(void);
  88. extern int mmc_get_dl_info(void);
  89. extern int mmc_legacy_init(int);
  90. #ifdef MT_SRAM_REPAIR_SUPPORT
  91. extern int repair_sram(void);
  92. #endif
  93. extern bool g_boot_menu;
  94. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  95. extern kal_bool is_low_battery(kal_int32 val);
  96. extern int hw_charging_get_charger_type(void);
  97. #endif
  98. void platform_uninit(void);
  99. void config_shared_SRAM_size(void);
  100. extern int dev_info_nr_cpu(void);
  101. BOOT_ARGUMENT *g_boot_arg;
  102. BOOT_ARGUMENT boot_addr;
  103. int g_nr_bank;
  104. BI_DRAM bi_dram[MAX_NR_BANK];
  105. unsigned int g_fb_base;
  106. unsigned int g_fb_size;
  107. static int g_dram_init_ret;
  108. enum {
  109. MD_SYS1 = 0,
  110. MD_SYS2,
  111. MD_SYS3,
  112. MD_SYS4,
  113. };
  114. void dump_boot_arg(void)
  115. {
  116. int i, j;
  117. pal_log_err("==dump boot argument==\n");
  118. pal_log_err("BOOT_REASON: %d\n", g_boot_arg->boot_reason);
  119. pal_log_err("BOOT_MODE: %d\n", g_boot_arg->boot_mode);
  120. pal_log_err("META_COM TYPE: %d\n", g_boot_arg->meta_com_type);
  121. pal_log_err("META_COM ID: %d\n", g_boot_arg->meta_com_id);
  122. pal_log_err("META_COM PORT: %d\n", g_boot_arg->meta_uart_port);
  123. pal_log_err("LOG_COM PORT: %d\n", g_boot_arg->log_port);
  124. pal_log_err("LOG_COM BAUD: %d\n", g_boot_arg->log_baudrate);
  125. pal_log_err("LOG_COM EN: %d\n", g_boot_arg->log_enable);
  126. pal_log_err("MEM_NUM: %d\n", g_boot_arg->dram_rank_num);
  127. if (g_boot_arg->dram_rank_num > 4) {
  128. pal_log_err("MEM_NUM:%d, it's above the expectation. fix it\n",
  129. g_boot_arg->dram_rank_num);
  130. g_boot_arg->dram_rank_num = 4;
  131. }
  132. for (i = 0; i < g_boot_arg->dram_rank_num; i++)
  133. pal_log_err("MEM_SIZE: 0x%x\n", g_boot_arg->dram_rank_size[i]);
  134. pal_log_err("mblock num: 0x%x\n", g_boot_arg->mblock_info.mblock_num);
  135. if (g_boot_arg->mblock_info.mblock_num > 4) {
  136. pal_log_err("mblock_info.mblock_num:%d, it's above the expectation. fix it\n",
  137. g_boot_arg->dram_rank_num);
  138. g_boot_arg->mblock_info.mblock_num = 4;
  139. }
  140. for (i = 0; i < 4; i++) {
  141. pal_log_err("mblock start: 0x%llx\n", g_boot_arg->mblock_info.mblock[i].start);
  142. pal_log_err("mblock size: 0x%llx\n", g_boot_arg->mblock_info.mblock[i].size);
  143. pal_log_err("mblock rank: 0x%x\n", g_boot_arg->mblock_info.mblock[i].rank);
  144. }
  145. pal_log_err("orig_dram num: 0x%x\n", g_boot_arg->orig_dram_info.rank_num);
  146. for (i = 0; i < 4; i++) {
  147. pal_log_err("orig_dram start: 0x%llx\n",
  148. g_boot_arg->orig_dram_info.rank_info[i].start);
  149. pal_log_err("orig_dram size: 0x%llx\n",
  150. g_boot_arg->orig_dram_info.rank_info[i].size);
  151. }
  152. pal_log_err("lca start: 0x%llx\n", g_boot_arg->lca_reserved_mem.start);
  153. pal_log_err("lca size: 0x%llx\n", g_boot_arg->lca_reserved_mem.size);
  154. pal_log_err("tee start: 0x%llx\n", g_boot_arg->tee_reserved_mem.start);
  155. pal_log_err("tee size: 0x%llx\n", g_boot_arg->tee_reserved_mem.size);
  156. for (i = 0; i < 4; i++)
  157. pal_log_err("MD_INFO: 0x%x\n", g_boot_arg->md_type[i]);
  158. pal_log_err("BOOT_TIME: %d\n", g_boot_arg->boot_time);
  159. pal_log_err("DA_INFO: 0x%x\n", g_boot_arg->da_info.addr);
  160. pal_log_err("DA_INFO: 0x%x\n", g_boot_arg->da_info.arg1);
  161. pal_log_err("DA_INFO: 0x%x\n", g_boot_arg->da_info.arg2);
  162. pal_log_err("DA_INFO: 0x%x\n", g_boot_arg->da_info.len);
  163. pal_log_err("DA_INFO: 0x%x\n", g_boot_arg->da_info.sig_len);
  164. pal_log_err("SEC_INFO: 0x%x\n", g_boot_arg->sec_limit.magic_num);
  165. pal_log_err("SEC_INFO: 0x%x\n", g_boot_arg->sec_limit.forbid_mode);
  166. pal_log_err("PART_NUM: %d\n", g_boot_arg->part_num);
  167. pal_log_err("PART_INFO: 0x%x\n", g_boot_arg->part_info);
  168. pal_log_err("EFLAG: %d\n", g_boot_arg->e_flag);
  169. pal_log_err("DDR_RESERVE: %d\n", g_boot_arg->ddr_reserve_enable);
  170. pal_log_err("DDR_RESERVE: %d\n", g_boot_arg->ddr_reserve_success);
  171. pal_log_err("DRAM_BUF: %d\n", g_boot_arg->dram_buf_size);
  172. pal_log_err("SMC: 0x%x\n", g_boot_arg->smc_boot_opt);
  173. pal_log_err("SMC: 0x%x\n", g_boot_arg->lk_boot_opt);
  174. pal_log_err("SMC: 0x%x\n", g_boot_arg->kernel_boot_opt);
  175. pal_log_err("SRAM satrt: 0x%x\n", g_boot_arg->non_secure_sram_addr);
  176. pal_log_err("SRAM size: 0x%x\n", g_boot_arg->non_secure_sram_size);
  177. pal_log_err("==dump boot argument==\n");
  178. }
  179. void check_tag_size(int pl_tag_size, int lk_tag_size, int magic_number)
  180. {
  181. if (pl_tag_size != lk_tag_size) {
  182. pal_log_err("tag size not match, magic number%d,PL tag size:%d, LK tag size:%d\n",
  183. magic_number, pl_tag_size, lk_tag_size);
  184. pal_log_err("Please sync the tag structure with the preloader.\n");
  185. while (1);
  186. }
  187. }
  188. int dram_init(void)
  189. {
  190. int i;
  191. struct boot_tag *tags;
  192. /* Get parameters from pre-loader. Get as early as possible
  193. * The address of BOOT_ARGUMENT_LOCATION will be used by Linux later
  194. * So copy the parameters from BOOT_ARGUMENT_LOCATION to LK's memory region
  195. */
  196. g_boot_arg = &boot_addr;
  197. if (*(unsigned int *)BOOT_ARGUMENT_LOCATION == BOOT_ARGUMENT_MAGIC)
  198. memcpy(g_boot_arg, (void *)BOOT_ARGUMENT_LOCATION, sizeof(BOOT_ARGUMENT));
  199. else {
  200. //
  201. g_boot_arg->maggic_number = BOOT_ARGUMENT_MAGIC;
  202. for (tags = (void *)BOOT_ARGUMENT_LOCATION; tags->hdr.size;
  203. tags = boot_tag_next(tags)) {
  204. switch (tags->hdr.tag) {
  205. case BOOT_TAG_BOOT_REASON:
  206. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_boot_reason),
  207. tags->hdr.tag);
  208. g_boot_arg->boot_reason = tags->u.boot_reason.boot_reason;
  209. break;
  210. case BOOT_TAG_BOOT_MODE:
  211. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_boot_mode),
  212. tags->hdr.tag);
  213. g_boot_arg->boot_mode = tags->u.boot_mode.boot_mode;
  214. break;
  215. case BOOT_TAG_META_COM:
  216. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_meta_com), tags->hdr.tag);
  217. g_boot_arg->meta_com_type = tags->u.meta_com.meta_com_type;
  218. g_boot_arg->meta_com_id = tags->u.meta_com.meta_com_id;
  219. g_boot_arg->meta_uart_port = tags->u.meta_com.meta_uart_port;
  220. break;
  221. case BOOT_TAG_LOG_COM:
  222. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_log_com), tags->hdr.tag);
  223. g_boot_arg->log_port = tags->u.log_com.log_port;
  224. g_boot_arg->log_baudrate = tags->u.log_com.log_baudrate;
  225. g_boot_arg->log_enable = tags->u.log_com.log_enable;
  226. break;
  227. case BOOT_TAG_MEM:
  228. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_mem), tags->hdr.tag);
  229. g_boot_arg->dram_rank_num = tags->u.mem.dram_rank_num;
  230. for (i = 0; i < tags->u.mem.dram_rank_num; i++)
  231. g_boot_arg->dram_rank_size[i] = tags->u.mem.dram_rank_size[i];
  232. g_boot_arg->mblock_info = tags->u.mem.mblock_info;
  233. g_boot_arg->orig_dram_info = tags->u.mem.orig_dram_info;
  234. g_boot_arg->lca_reserved_mem = tags->u.mem.lca_reserved_mem;
  235. g_boot_arg->tee_reserved_mem = tags->u.mem.tee_reserved_mem;
  236. break;
  237. case BOOT_TAG_MD_INFO:
  238. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_md_info), tags->hdr.tag);
  239. for (i = 0; i < 4; i++)
  240. g_boot_arg->md_type[i] = tags->u.md_info.md_type[i];
  241. break;
  242. case BOOT_TAG_BOOT_TIME:
  243. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_boot_time),
  244. tags->hdr.tag);
  245. g_boot_arg->boot_time = tags->u.boot_time.boot_time;
  246. break;
  247. case BOOT_TAG_DA_INFO:
  248. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_da_info), tags->hdr.tag);
  249. memcpy(&g_boot_arg->da_info, &tags->u.da_info.da_info, sizeof(da_info_t));
  250. break;
  251. case BOOT_TAG_SEC_INFO:
  252. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_sec_info), tags->hdr.tag);
  253. memcpy(&g_boot_arg->sec_limit, &tags->u.sec_info.sec_limit, sizeof(SEC_LIMIT));
  254. break;
  255. case BOOT_TAG_PART_NUM:
  256. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_part_num), tags->hdr.tag);
  257. g_boot_arg->part_num = tags->u.part_num.part_num;
  258. break;
  259. case BOOT_TAG_PART_INFO:
  260. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_part_info),
  261. tags->hdr.tag);
  262. g_boot_arg->part_info =
  263. tags->u.part_info.part_info; /* only copy the pointer but the contains*/
  264. break;
  265. case BOOT_TAG_EFLAG:
  266. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_eflag), tags->hdr.tag);
  267. g_boot_arg->e_flag = tags->u.eflag.e_flag;
  268. break;
  269. case BOOT_TAG_DDR_RESERVE:
  270. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_ddr_reserve),
  271. tags->hdr.tag);
  272. g_boot_arg->ddr_reserve_enable = tags->u.ddr_reserve.ddr_reserve_enable;
  273. g_boot_arg->ddr_reserve_success = tags->u.ddr_reserve.ddr_reserve_success;
  274. g_boot_arg->ddr_reserve_ready = tags->u.ddr_reserve.ddr_reserve_ready;
  275. break;
  276. case BOOT_TAG_DRAM_BUF:
  277. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_dram_buf), tags->hdr.tag);
  278. g_boot_arg->dram_buf_size = tags->u.dram_buf.dram_buf_size;
  279. break;
  280. case BOOT_TAG_BOOT_OPT:
  281. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_boot_opt), tags->hdr.tag);
  282. g_boot_arg->smc_boot_opt = tags->u.boot_opt.smc_boot_opt;
  283. g_boot_arg->lk_boot_opt = tags->u.boot_opt.lk_boot_opt;
  284. g_boot_arg->kernel_boot_opt = tags->u.boot_opt.kernel_boot_opt;
  285. break;
  286. case BOOT_TAG_SRAM_INFO:
  287. check_tag_size(tags->hdr.size, boot_tag_size(boot_tag_sram_info),
  288. tags->hdr.tag);
  289. g_boot_arg->non_secure_sram_addr = tags->u.sram_info.non_secure_sram_addr;
  290. g_boot_arg->non_secure_sram_size = tags->u.sram_info.non_secure_sram_size;
  291. break;
  292. case BOOT_TAG_PL_VERSION:
  293. memcpy(&g_boot_arg->pl_version, &tags->u.pl_version.pl_version,
  294. sizeof(tags->u.pl_version.pl_version));
  295. break;
  296. case BOOT_TAG_RAM_CONSOLE_INFO:
  297. g_boot_arg->ram_console_sram_addr = tags->u.ram_console_info.sram_addr;
  298. g_boot_arg->ram_console_sram_size = tags->u.ram_console_info.sram_size;
  299. g_boot_arg->ram_console_def_type = tags->u.ram_console_info.def_type;
  300. g_boot_arg->ram_console_memory_info_offset = tags->u.ram_console_info.memory_info_offset;
  301. break;
  302. default:
  303. break;
  304. }
  305. }
  306. //
  307. }
  308. #ifdef MACH_FPGA
  309. g_nr_bank = 2;
  310. bi_dram[0].start = DRAM_PHY_ADDR + RIL_SIZE;
  311. bi_dram[0].size = (256 * 1024 * 1024) - RIL_SIZE;
  312. bi_dram[1].start = bi_dram[0].start + bi_dram[0].size;
  313. bi_dram[1].size = (256 * 1024 * 1024);
  314. #else
  315. g_nr_bank = g_boot_arg->dram_rank_num;
  316. if (g_nr_bank == 0 || g_nr_bank > MAX_NR_BANK) {
  317. g_dram_init_ret = -1;
  318. //pal_log_err( "[LK ERROR] DRAM bank number is not correct!!!");
  319. //while (1) ;
  320. return -1;
  321. }
  322. #ifndef CUSTOM_CONFIG_MAX_DRAM_SIZE
  323. /* return the actual DRAM info */
  324. bi_dram[0].start = DRAM_PHY_ADDR + RIL_SIZE;
  325. bi_dram[0].size = g_boot_arg->dram_rank_size[0] - RIL_SIZE;
  326. for (i = 1; i < g_nr_bank; i++) {
  327. bi_dram[i].start = bi_dram[i - 1].start + bi_dram[i - 1].size;
  328. bi_dram[i].size = g_boot_arg->dram_rank_size[i];
  329. }
  330. //#elif (CUSTOM_CONFIG_MAX_DRAM_SIZE < 0x10000000)
  331. //#error "DRAM size < 0x10000000" /* DRAM is less than 256MB, trigger build error */
  332. #else
  333. #endif
  334. #endif
  335. return 0;
  336. }
  337. /*******************************************************
  338. * Routine: memory_size
  339. * Description: return DRAM size to LCM driver
  340. ******************************************************/
  341. u64 physical_memory_size(void)
  342. {
  343. int i;
  344. unsigned long long size = 0;
  345. for (i = 0; i < g_boot_arg->orig_dram_info.rank_num; i++)
  346. size += g_boot_arg->orig_dram_info.rank_info[i].size;
  347. return size;
  348. }
  349. u32 memory_size(void)
  350. {
  351. unsigned long long size = physical_memory_size();
  352. while (((unsigned long long)DRAM_PHY_ADDR + size) > 0x100000000ULL)
  353. size -= (unsigned long long)(1024 * 1024 * 1024);
  354. return (unsigned int)size;
  355. }
  356. void sw_env()
  357. {
  358. #ifdef LK_DL_CHECK
  359. #ifdef MTK_EMMC_SUPPORT
  360. int dl_status = 0;
  361. dl_status = mmc_get_dl_info();
  362. pal_log_info("mt65xx_sw_env--dl_status: %d\n", dl_status);
  363. if (dl_status != 0) {
  364. video_printf("=> TOOL DL image Fail!\n");
  365. pal_log_err("TOOL DL image Fail\n");
  366. #ifdef LK_DL_CHECK_BLOCK_LEVEL
  367. pal_log_err("uboot is blocking by dl info\n");
  368. while (1) ;
  369. #endif
  370. }
  371. #endif
  372. #endif
  373. #ifndef USER_BUILD
  374. switch (g_boot_mode) {
  375. case META_BOOT:
  376. video_printf(" => META MODE\n");
  377. break;
  378. case FACTORY_BOOT:
  379. video_printf(" => FACTORY MODE\n");
  380. break;
  381. case RECOVERY_BOOT:
  382. video_printf(" => RECOVERY MODE\n");
  383. break;
  384. case SW_REBOOT:
  385. //video_printf(" => SW RESET\n");
  386. break;
  387. case NORMAL_BOOT:
  388. //if(g_boot_arg->boot_reason != BR_RTC && get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
  389. if (!g_boot_menu && get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
  390. video_printf(" => HIBERNATION BOOT\n");
  391. else
  392. video_printf(" => NORMAL BOOT\n");
  393. break;
  394. case ADVMETA_BOOT:
  395. video_printf(" => ADVANCED META MODE\n");
  396. break;
  397. case ATE_FACTORY_BOOT:
  398. video_printf(" => ATE FACTORY MODE\n");
  399. break;
  400. #ifdef MTK_KERNEL_POWER_OFF_CHARGING
  401. case KERNEL_POWER_OFF_CHARGING_BOOT:
  402. video_printf(" => POWER OFF CHARGING MODE\n");
  403. break;
  404. case LOW_POWER_OFF_CHARGING_BOOT:
  405. video_printf(" => LOW POWER OFF CHARGING MODE\n");
  406. break;
  407. #endif
  408. case ALARM_BOOT:
  409. video_printf(" => ALARM BOOT\n");
  410. break;
  411. case FASTBOOT:
  412. video_printf(" => FASTBOOT mode...\n");
  413. break;
  414. default:
  415. video_printf(" => UNKNOWN BOOT\n");
  416. }
  417. return;
  418. #endif
  419. #ifdef USER_BUILD
  420. if (g_boot_mode == FASTBOOT)
  421. video_printf(" => FASTBOOT mode...\n");
  422. return;
  423. #endif
  424. }
  425. void platform_init_mmu_mappings(void)
  426. {
  427. unsigned int addr;
  428. unsigned int dram_size = 0;
  429. dram_init();
  430. arm_mmu_init();
  431. dram_size = physical_memory_size();
  432. /* map dram region */
  433. for (addr = 0; addr < dram_size; addr += (1024 * 1024)) {
  434. /*virtual to physical 1-1 mapping*/
  435. arm_mmu_map_section(bi_dram[0].start + addr, bi_dram[0].start + addr,
  436. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK_ALLOCATE | MMU_MEMORY_AP_READ_WRITE);
  437. }
  438. /* ummap TEE memory regoin */
  439. if (g_boot_arg->tee_reserved_mem.size != 0) {
  440. u64 j, k;
  441. k = g_boot_arg->tee_reserved_mem.start;
  442. j = ROUNDUP(g_boot_arg->tee_reserved_mem.size, 1024 * 1024);
  443. for (; j > 0; j -= (1024 * 1024)) {
  444. arm_mmu_map_section((uintptr_t)k, (uintptr_t)k,
  445. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK_ALLOCATE | MMU_MEMORY_AP_READ_WRITE |
  446. MMU_MEMORY_XN);
  447. k += (1024 * 1024);
  448. }
  449. }
  450. arch_enable_mmu(); //enable mmu after setup page table to avoid cpu prefetch which may bring on emi violation
  451. }
  452. /******************************************************************************
  453. * VB: verified boot
  454. ******************************************************************************/
  455. static void lk_vb_init(void)
  456. {
  457. #ifdef MTK_SECURITY_SW_SUPPORT
  458. u64 pl_start_addr = 0;
  459. plinfo_get_brom_header_block_size(&pl_start_addr);
  460. #ifdef LK_PROFILING
  461. unsigned int time_vb_init = get_timer(0);
  462. #endif // LK_PROFILING
  463. /* initialize security library */
  464. sec_func_init(pl_start_addr);
  465. seclib_set_oemkey(g_oemkey, OEM_PUBK_SZ);
  466. #ifdef LK_PROFILING
  467. pal_log_err("[PROFILE] vb init takes %d ms\n", (int)get_timer(time_vb_init));
  468. #endif // LK_PROFILING
  469. #endif // MTK_SECURITY_SW_SUPPORT
  470. }
  471. /******************************************************************************
  472. * VB: verified boot
  473. ******************************************************************************/
  474. static void lk_vb_flow(void)
  475. {
  476. #ifdef MTK_SECURITY_SW_SUPPORT
  477. #ifdef LK_PROFILING
  478. unsigned int time_vb_flow = get_timer(0);
  479. #endif // LK_PROFILING
  480. if (0 != img_auth_stor(SBOOT_PART_LOGO_NAME, NULL)) {
  481. pal_log_err("<ASSERT> %s:line %d\n", __FILE__, __LINE__);
  482. while (1);
  483. }
  484. if (DTBO_FROM_STANDALONE == get_dtbo_src()) {
  485. if (0 != img_auth_stor(get_dtbo_part_name(), NULL)) {
  486. pal_log_err("<ASSERT> %s:line %d\n", __FILE__, __LINE__);
  487. while (1);
  488. }
  489. }
  490. #ifdef LK_PROFILING
  491. pal_log_err("[PROFILE] vb flow takes %d ms\n",
  492. (int)get_timer(time_vb_flow));
  493. #endif // LK_PROFILING
  494. #endif // MTK_SECURITY_SW_SUPPORT
  495. }
  496. /******************************************************************************
  497. * DA: Download Agent
  498. ******************************************************************************/
  499. static void lk_verify_da(void)
  500. {
  501. #ifdef MTK_SECURITY_SW_SUPPORT
  502. /* verify da before jumping to da*/
  503. if (sec_usbdl_enabled()) {
  504. u8 *da_addr = (u8 *)g_boot_arg->da_info.addr;
  505. u32 da_len = g_boot_arg->da_info.len;
  506. u32 sig_len = g_boot_arg->da_info.sig_len;
  507. u8 *sig_addr = (unsigned char *)da_addr + (da_len - sig_len);
  508. if (da_len == 0 || sig_len == 0) {
  509. pal_log_info("[LK] da argument is invalid\n");
  510. pal_log_info("da_addr = 0x%x\n", (int)da_addr);
  511. pal_log_info("da_len = 0x%x\n", da_len);
  512. pal_log_info("sig_len = 0x%x\n", sig_len);
  513. }
  514. if (sec_usbdl_verify_da(da_addr, (da_len - sig_len), sig_addr, sig_len)) {
  515. /* da verify fail */
  516. video_printf(" => Not authenticated tool, download stop...\n");
  517. while (1); /* fix me, should not be infinite loop in lk */
  518. }
  519. } else
  520. #endif // MTK_SECURITY_SW_SUPPORT
  521. {
  522. pal_log_info(" DA verification disabled...\n");
  523. }
  524. }
  525. void platform_init_mmu(void)
  526. {
  527. unsigned long long addr;
  528. unsigned int vaddr;
  529. unsigned long long dram_size;
  530. /* configure available RAM banks */
  531. dram_init();
  532. dram_size = physical_memory_size();
  533. if (((unsigned long long)DRAM_PHY_ADDR + dram_size) <= 0x100000000ULL) {
  534. arm_mmu_init();
  535. /* map dram region */
  536. for (addr = 0; addr < dram_size; addr += (1024 * 1024)) {
  537. /*virtual to physical 1-1 mapping*/
  538. arm_mmu_map_section(bi_dram[0].start + addr, bi_dram[0].start + addr,
  539. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK_ALLOCATE | MMU_MEMORY_AP_READ_WRITE);
  540. }
  541. /* ummap TEE memory regoin */
  542. if (g_boot_arg->tee_reserved_mem.size != 0) {
  543. u64 j, k;
  544. k = g_boot_arg->tee_reserved_mem.start;
  545. j = ROUNDUP(g_boot_arg->tee_reserved_mem.size, 1024 * 1024);
  546. for (; j > 0; j -= (1024 * 1024)) {
  547. arm_mmu_map_section((uintptr_t)k, (uintptr_t)k,
  548. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK_ALLOCATE | MMU_MEMORY_AP_READ_WRITE |
  549. MMU_MEMORY_XN);
  550. k += (1024 * 1024);
  551. }
  552. }
  553. } else {
  554. arm_mmu_lpae_init();
  555. /* map dram region */
  556. for (addr = 0; addr < dram_size;
  557. addr += (unsigned long long)(1024 * 1024 * 1024)) {
  558. vaddr = (bi_dram[0].start + addr < 0x100000000ULL) ? (unsigned int)(
  559. bi_dram[0].start + addr) : (0xC0000000);
  560. arm_mmu_map_block(bi_dram[0].start + addr, vaddr,
  561. LPAE_MMU_MEMORY_TYPE_NORMAL_WRITE_BACK);
  562. }
  563. /* ummap TEE memory regoin */
  564. if (g_boot_arg->tee_reserved_mem.size != 0) {
  565. u64 j, k;
  566. k = g_boot_arg->tee_reserved_mem.start;
  567. j = ROUNDUP(g_boot_arg->tee_reserved_mem.size, 0x40000000ULL);
  568. for (; j > 0; j -= 0x40000000ULL) {
  569. arm_mmu_map_block((uintptr_t)k, (uintptr_t)k,
  570. LPAE_MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | LPAE_MMU_MEMORY_XN);
  571. k += 0x40000000ULL;
  572. }
  573. }
  574. }
  575. arch_enable_mmu(); //enable mmu after setup page table to avoid cpu prefetch which may bring on emi violation
  576. }
  577. void platform_k64_check(void)
  578. {
  579. pal_log_err("kernel_boot_opt=%d\n", g_boot_arg->kernel_boot_opt);
  580. switch (g_boot_arg->kernel_boot_opt) {
  581. case BOOT_OPT_64S3:
  582. case BOOT_OPT_64S1:
  583. case BOOT_OPT_64N2:
  584. case BOOT_OPT_64N1:
  585. g_is_64bit_kernel = 1;
  586. pal_log_err("64Bit Kernel\n");
  587. break;
  588. case BOOT_OPT_32S3:
  589. case BOOT_OPT_32S1:
  590. case BOOT_OPT_32N2:
  591. case BOOT_OPT_32N1:
  592. /* maybe need to do something in the feature*/
  593. default:
  594. g_is_64bit_kernel = 0;
  595. pal_log_err("32Bit Kernel\n");
  596. break;
  597. }
  598. }
  599. void platform_early_init(void)
  600. {
  601. #ifdef MT_SRAM_REPAIR_SUPPORT
  602. int repair_ret;
  603. #endif
  604. #ifdef LK_PROFILING
  605. #ifdef MT_SRAM_REPAIR_SUPPORT
  606. unsigned int time_repair_sram;
  607. #endif
  608. unsigned int time_wdt_early_init;
  609. unsigned int time_led_init;
  610. unsigned int time_pmic_init;
  611. unsigned int time_platform_early_init;
  612. time_platform_early_init = get_timer(0);
  613. #endif
  614. platform_init_interrupts();
  615. platform_early_init_timer();
  616. #ifndef MACH_FPGA
  617. mt_gpio_set_default();
  618. #endif
  619. /* initialize the uart */
  620. uart_init_early();
  621. platform_k64_check();
  622. if (g_dram_init_ret < 0) {
  623. pal_log_err("[LK ERROR] DRAM bank number is not correct!!!\n");
  624. while (1) ;
  625. }
  626. //i2c_v1_init();
  627. #ifdef LK_PROFILING
  628. time_wdt_early_init = get_timer(0);
  629. #endif
  630. mtk_wdt_init();
  631. #ifdef LK_PROFILING
  632. pal_log_info("[PROFILE] ------- WDT Init takes %d ms -------- \n",
  633. (int)get_timer(time_wdt_early_init));
  634. #endif
  635. #ifdef MT_SRAM_REPAIR_SUPPORT
  636. #ifdef LK_PROFILING
  637. time_repair_sram = get_timer(0);
  638. #endif
  639. repair_ret = repair_sram();
  640. if (repair_ret != 0) {
  641. pal_log_err("Sram repair failed %d\n", repair_ret);
  642. while (1);
  643. }
  644. #ifdef LK_PROFILING
  645. pal_log_info("[PROFILE] ------- Repair SRAM takes %d ms -------- \n",
  646. (int)get_timer(time_repair_sram));
  647. #endif
  648. #endif
  649. //i2c init
  650. i2c_hw_init();
  651. #ifdef MACH_FPGA
  652. mtk_timer_init(); // GPT4 will be initialized at PL after
  653. mtk_wdt_disable(); // WDT will be triggered when uncompressing linux image on FPGA
  654. #endif
  655. #ifndef MACH_FPGA
  656. #ifdef LK_PROFILING
  657. time_led_init = get_timer(0);
  658. #endif
  659. leds_init();
  660. #ifdef LK_PROFILING
  661. pal_log_info("[PROFILE] ------- led init takes %d ms -------- \n",
  662. (int)get_timer(time_led_init));
  663. #endif
  664. #endif
  665. // Workaround by Peng
  666. //pwrap_init_lk();
  667. //pwrap_init_for_early_porting();
  668. #ifdef LK_PROFILING
  669. time_pmic_init = get_timer(0);
  670. #endif
  671. pmic_init();
  672. /*
  673. // Workaround by Weiqi
  674. mt6331_upmu_set_rg_vgp1_en(1);
  675. mt6331_upmu_set_rg_vcam_io_en(1);
  676. */
  677. #ifdef LK_PROFILING
  678. pal_log_info("[PROFILE] ------- pmic_init takes %d ms -------- \n",
  679. (int)get_timer(time_pmic_init));
  680. #endif
  681. #ifdef LK_PROFILING
  682. pal_log_info("[PROFILE] ------- platform_early_init takes %d ms -------- \n",
  683. (int)get_timer(time_platform_early_init));
  684. #endif
  685. }
  686. extern void mt65xx_bat_init(void);
  687. #if defined (MTK_KERNEL_POWER_OFF_CHARGING)
  688. int kernel_charging_boot(void)
  689. {
  690. if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT ||
  691. g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) && upmu_is_chr_det() == KAL_TRUE) {
  692. pal_log_info("[%s] Kernel Power Off Charging with Charger/Usb \n", __func__);
  693. return 1;
  694. } else if ((g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT ||
  695. g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) && upmu_is_chr_det() == KAL_FALSE) {
  696. pal_log_info("[%s] Kernel Power Off Charging without Charger/Usb \n", __func__);
  697. return -1;
  698. } else
  699. return 0;
  700. }
  701. #endif
  702. void platform_init(void)
  703. {
  704. #ifdef MTK_SECURITY_SW_SUPPORT
  705. unsigned int time_security_init;
  706. u64 pl_start_addr = 0;
  707. #endif
  708. #ifdef LK_PROFILING
  709. unsigned int time_nand_emmc;
  710. unsigned int time_env;
  711. unsigned int time_disp_init;
  712. unsigned int time_load_logo;
  713. unsigned int time_backlight;
  714. unsigned int time_boot_mode;
  715. unsigned int time_bat_init;
  716. unsigned int time_RTC_boot_Check;
  717. unsigned int time_show_logo;
  718. unsigned int time_sw_env;
  719. unsigned int time_platform_init;
  720. time_platform_init = get_timer(0);
  721. #endif
  722. pal_log_err(" ==LK info ==\n");
  723. pal_log_err(" Build time:%s, %s\n", __DATE__, __TIME__);
  724. pal_log_err(" chip_code[0x%x]\n", mt_get_chip_hw_code());
  725. pal_log_err(" chip_ver[0x%x]\n", mt_get_chip_sw_ver());
  726. pal_log_err(" ==LK info ==\n");
  727. dump_boot_arg();
  728. pal_log_err("platform_init()\n");
  729. #ifdef DUMMY_AP
  730. dummy_ap_entry();
  731. #endif
  732. #ifdef LK_PROFILING
  733. time_nand_emmc = get_timer(0);
  734. #endif
  735. #ifdef MTK_EMMC_SUPPORT
  736. mmc_legacy_init(1);
  737. #else
  738. nand_init();
  739. nand_driver_test();
  740. #endif
  741. #ifdef LK_PROFILING
  742. pal_log_info("[PROFILE] ------- NAND/EMMC init takes %d ms -------- \n",
  743. (int)get_timer(time_nand_emmc));
  744. #endif
  745. #ifdef MTK_AB_OTA_UPDATER
  746. /* get A/B system parameter */
  747. get_AB_OTA_param();
  748. #endif
  749. /* The device tree should be loaded as early as possible. */
  750. load_device_tree();
  751. #ifdef MTK_KERNEL_POWER_OFF_CHARGING
  752. if ((g_boot_arg->boot_reason == BR_USB) && (upmu_is_chr_det() == KAL_FALSE)) {
  753. pal_log_info("[%s] Unplugged Charger/Usb between Pre-loader and Uboot in Kernel Charging Mode, Power Off \n",
  754. __func__);
  755. mt6575_power_off();
  756. }
  757. #endif
  758. #ifdef LK_PROFILING
  759. time_env = get_timer(0);
  760. #endif
  761. env_init();
  762. print_env();
  763. #ifdef LK_PROFILING
  764. pal_log_info("[PROFILE] ------- ENV init takes %d ms -------- \n",
  765. (int)get_timer(time_env));
  766. #endif
  767. #ifdef LK_PROFILING
  768. time_disp_init = get_timer(0);
  769. #endif
  770. /* initialize the frame buffet information */
  771. #ifndef MACH_FPGA_NO_DISPLAY
  772. g_fb_size = mt_disp_get_vram_size();
  773. #else
  774. g_fb_size = 0x1000000;
  775. #endif
  776. #if 0
  777. g_fb_base = memory_size() - g_fb_size + DRAM_PHY_ADDR;
  778. #else
  779. #if 0
  780. if (g_is_64bit_kernel) {
  781. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x200000,
  782. 0x100000000, RANKMAX);
  783. g_fb_base = ALIGN_TO(g_fb_base, 0x200000); // size 2MB align
  784. } else
  785. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x100000,
  786. 0x100000000, RANKMAX);
  787. #else
  788. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x10000,
  789. 0x100000000, RANKMAX);
  790. #endif
  791. if (!g_fb_base) {
  792. /* ERROR */
  793. }
  794. #endif
  795. pal_log_err("FB base = 0x%x, FB size = %d\n", g_fb_base, g_fb_size);
  796. #ifndef MACH_FPGA_NO_DISPLAY
  797. mt_disp_init((void *)g_fb_base);
  798. /* show black picture fisrtly in case of backlight is on before nothing is drawed*/
  799. mt_disp_fill_rect(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, 0x0);
  800. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  801. #ifdef LK_PROFILING
  802. pal_log_info("[PROFILE] ------- disp init takes %d ms -------- \n",
  803. (int)get_timer(time_disp_init));
  804. #endif
  805. drv_video_init();
  806. #endif
  807. /*for kpd pmic mode setting*/
  808. set_kpd_pmic_mode();
  809. #ifndef MACH_FPGA
  810. #ifdef LK_PROFILING
  811. time_boot_mode = get_timer(0);
  812. #endif
  813. boot_mode_select();
  814. #ifdef LK_PROFILING
  815. pal_log_info("[PROFILE] ------- boot mode select takes %d ms -------- \n",
  816. (int)get_timer(time_boot_mode));
  817. #endif
  818. #endif
  819. #ifdef CFG_DTB_EARLY_LOADER_SUPPORT
  820. /* reload dtb when boot mode = recovery */
  821. if ((g_boot_mode == RECOVERY_BOOT) && (get_recovery_dtbo_loaded() != 1)){
  822. if (bldr_load_dtb("recovery") < 0)
  823. dprintf(CRITICAL, "bldr_load_dtb fail\n");
  824. }
  825. #endif // CFG_DTB_EARLY_LOADER_SUPPORT
  826. #ifndef MACH_FPGA_NO_DISPLAY
  827. #ifdef LK_PROFILING
  828. time_load_logo = get_timer(0);
  829. #endif
  830. mboot_common_load_logo((unsigned long)mt_get_logo_db_addr_pa(), "logo");
  831. #ifdef LK_PROFILING
  832. pal_log_info("[PROFILE] ------- load_logo takes %d ms -------- \n",
  833. (int)get_timer(time_load_logo));
  834. #endif
  835. #endif
  836. lk_vb_init();
  837. lk_vb_flow();
  838. /*Show download logo & message on screen */
  839. if (g_boot_arg->boot_mode == DOWNLOAD_BOOT) {
  840. pal_log_err("[LK] boot mode is DOWNLOAD_BOOT\n");
  841. lk_verify_da();
  842. #ifndef MACH_FPGA_NO_DISPLAY
  843. mt_disp_show_boot_logo();
  844. #endif
  845. video_printf(" => Downloading...\n");
  846. pal_log_err("enable backlight after show bootlogo!\n");
  847. mt65xx_backlight_on();
  848. mtk_wdt_disable(); //Disable wdt before jump to DA
  849. platform_uninit();
  850. #ifdef HAVE_CACHE_PL310
  851. l2_disable();
  852. #endif
  853. arch_disable_cache(UCACHE);
  854. arch_disable_mmu();
  855. #ifdef ENABLE_L2_SHARING
  856. config_shared_SRAM_size();
  857. #endif
  858. jump_da(g_boot_arg->da_info.addr, g_boot_arg->da_info.arg1,
  859. g_boot_arg->da_info.arg2);
  860. }
  861. #ifdef LK_PROFILING
  862. time_bat_init = get_timer(0);
  863. #endif
  864. mt65xx_bat_init();
  865. #ifdef LK_PROFILING
  866. pal_log_info("[PROFILE] ------- battery init takes %d ms -------- \n",
  867. (int)get_timer(time_bat_init));
  868. #endif
  869. #ifndef CFG_POWER_CHARGING
  870. #ifdef LK_PROFILING
  871. time_RTC_boot_Check = get_timer(0);
  872. #endif
  873. /* NOTE: if define CFG_POWER_CHARGING, will rtc_boot_check() in mt65xx_bat_init() */
  874. rtc_boot_check(false);
  875. #ifdef LK_PROFILING
  876. pal_log_info("[PROFILE] ------- RTC boot check Init takes %d ms -------- \n",
  877. (int)get_timer(time_RTC_boot_Check));
  878. #endif
  879. #endif
  880. #ifdef LK_PROFILING
  881. time_show_logo = get_timer(0);
  882. #endif
  883. #ifdef MTK_KERNEL_POWER_OFF_CHARGING
  884. if (kernel_charging_boot() == 1) {
  885. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  886. CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
  887. CHR_Type_num = hw_charging_get_charger_type();
  888. if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
  889. ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER))) {
  890. #endif
  891. mt_disp_power(TRUE);
  892. mt_disp_show_low_battery();
  893. mt65xx_leds_brightness_set(6, 110);
  894. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  895. }
  896. #endif
  897. } else if (g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT &&
  898. g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) {
  899. if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) {
  900. #ifndef MACH_FPGA_NO_DISPLAY
  901. mt_disp_show_boot_logo();
  902. #endif
  903. }
  904. }
  905. #else
  906. if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) {
  907. #ifndef MACH_FPGA_NO_DISPLAY
  908. mt_disp_show_boot_logo();
  909. #endif
  910. }
  911. #endif
  912. #ifdef LK_PROFILING
  913. time_backlight = get_timer(0);
  914. #endif
  915. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  916. if (!is_low_battery(0)) {
  917. #endif
  918. mt65xx_backlight_on();
  919. #ifndef MACH_FPGA_NO_DISPLAY
  920. //pwm need display sof
  921. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  922. #endif
  923. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  924. }
  925. #endif
  926. #ifdef LK_PROFILING
  927. pal_log_info("[PROFILE] ------- backlight takes %d ms -------- \n",
  928. (int)get_timer(time_backlight));
  929. #endif
  930. #ifdef LK_PROFILING
  931. pal_log_info("[PROFILE] ------- show logo takes %d ms -------- \n",
  932. (int)get_timer(time_show_logo));
  933. #endif
  934. #ifndef MACH_FPGA
  935. #ifdef LK_PROFILING
  936. time_sw_env = get_timer(0);
  937. #endif
  938. sw_env();
  939. #ifdef LK_PROFILING
  940. pal_log_info("[PROFILE] ------- sw_env takes %d ms -------- \n",
  941. (int)get_timer(time_sw_env));
  942. #endif
  943. #endif
  944. #ifdef LK_PROFILING
  945. pal_log_info("[PROFILE] ------- platform_init takes %d ms -------- \n",
  946. (int)get_timer(time_platform_init));
  947. #endif
  948. }
  949. void platform_uninit(void)
  950. {
  951. #ifndef MACH_FPGA
  952. leds_deinit();
  953. #endif
  954. platform_deinit_interrupts();
  955. return;
  956. }
  957. int platform_skip_hibernation(void)
  958. {
  959. if (g_boot_menu == true)
  960. return 1;
  961. switch (g_boot_arg->boot_reason) {
  962. #if 0 // let schedule power on to go hiberantion bootup process
  963. case BR_RTC:
  964. #endif
  965. case BR_WDT:
  966. case BR_WDT_BY_PASS_PWK:
  967. case BR_WDT_SW:
  968. case BR_WDT_HW:
  969. return 1;
  970. }
  971. return 0;
  972. }
  973. static int md1_version_rdy = 0;
  974. static char md1_version[65];
  975. static int md3_version_rdy = 0;
  976. static char md3_version[65];
  977. int ccci_get_md_version(int md_id, char buf[], int size)
  978. {
  979. int ret;
  980. if ((md_id == MD_SYS1) && md1_version_rdy)
  981. return snprintf(buf, size, "%s", md1_version);
  982. else if ((md_id == MD_SYS3) && md3_version_rdy)
  983. return snprintf(md3_version, 65, "%s", md3_version);
  984. return -1;
  985. }