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