boot_mode.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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. #ifndef _MT_BOOT_MODE_H_
  32. #define _MT_BOOT_MODE_H_
  33. #include <platform/mt_typedefs.h>
  34. #include <platform/partition.h>
  35. #include <mblock.h>
  36. /******************************************************************************
  37. * FORBIDEN MODE
  38. ******************************************************************************/
  39. typedef enum {
  40. F_FACTORY_MODE = 0x0001,
  41. } FORBIDDEN_MODE;
  42. /******************************************************************************
  43. * LIMITATION
  44. ******************************************************************************/
  45. #define SEC_LIMIT_MAGIC 0x4C4C4C4C // LLLL
  46. typedef struct {
  47. unsigned int magic_num;
  48. FORBIDDEN_MODE forbid_mode;
  49. } SEC_LIMIT;
  50. /* boot type definitions */
  51. typedef enum {
  52. NORMAL_BOOT = 0,
  53. META_BOOT = 1,
  54. RECOVERY_BOOT = 2,
  55. SW_REBOOT = 3,
  56. FACTORY_BOOT = 4,
  57. ADVMETA_BOOT = 5,
  58. ATE_FACTORY_BOOT = 6,
  59. ALARM_BOOT = 7,
  60. #if defined (MTK_KERNEL_POWER_OFF_CHARGING)
  61. KERNEL_POWER_OFF_CHARGING_BOOT = 8,
  62. LOW_POWER_OFF_CHARGING_BOOT = 9,
  63. #endif
  64. FASTBOOT = 99,
  65. DOWNLOAD_BOOT = 100,
  66. UNKNOWN_BOOT
  67. } BOOTMODE;
  68. typedef enum {
  69. BR_POWER_KEY = 0,
  70. BR_USB,
  71. BR_RTC,
  72. BR_WDT,
  73. BR_WDT_BY_PASS_PWK,
  74. BR_TOOL_BY_PASS_PWK,
  75. BR_2SEC_REBOOT,
  76. BR_UNKNOWN,
  77. BR_KERNEL_PANIC,
  78. BR_WDT_SW,
  79. BR_WDT_HW,
  80. BR_POWER_EXC = 30,
  81. BR_LONG_POWKEY,
  82. BR_POWER_LOSS
  83. } boot_reason_t;
  84. /*META COM port type*/
  85. typedef enum {
  86. META_UNKNOWN_COM = 0,
  87. META_UART_COM,
  88. META_USB_COM
  89. } META_COM_TYPE;
  90. typedef struct {
  91. u32 addr; /* Download Agent address */
  92. u32 arg1; /* Download Agent arg 1*/
  93. u32 arg2; /* Download Agent arg 2*/
  94. u32 len; /* length of da */
  95. u32 sig_len; /* signature length of da */
  96. } da_info_t;
  97. typedef struct {
  98. u32 pll_setting_num;
  99. u32 freq_setting_num;
  100. u32 low_freq_pll_setting_addr;
  101. u32 low_freq_cha_setting_addr;
  102. u32 low_freq_chb_setting_addr;
  103. u32 high_freq_pll_setting_addr;
  104. u32 high_freq_cha_setting_addr;
  105. u32 high_freq_chb_setting_addr;
  106. } vcore_dvfs_info_t;
  107. typedef struct {
  108. u32 first_volt;
  109. u32 second_volt;
  110. u32 third_volt;
  111. u32 have_550;
  112. } ptp_info_t;
  113. typedef struct {
  114. u32 maggic_number;
  115. BOOTMODE boot_mode;
  116. u32 e_flag;
  117. u32 log_port;
  118. u32 log_baudrate;
  119. u8 log_enable;
  120. u32 log_dynamic_switch;
  121. u8 part_num;
  122. u8 reserved[2];
  123. u32 dram_rank_num;
  124. u64 dram_rank_size[4];
  125. mblock_info_t mblock_info;
  126. dram_info_t orig_dram_info;
  127. mem_desc_t lca_reserved_mem;
  128. mem_desc_t tee_reserved_mem;
  129. u32 boot_reason;
  130. META_COM_TYPE meta_com_type;
  131. u32 meta_com_id;
  132. u32 boot_time;
  133. da_info_t da_info;
  134. SEC_LIMIT sec_limit;
  135. part_hdr_t *part_info;
  136. u8 md_type[4];
  137. u32 ddr_reserve_enable;
  138. u32 ddr_reserve_success;
  139. u32 ddr_reserve_ready;
  140. ptp_info_t ptp_volt_info;
  141. u32 dram_buf_size;
  142. u32 meta_uart_port;
  143. u32 smc_boot_opt;
  144. u32 lk_boot_opt;
  145. u32 kernel_boot_opt;
  146. u32 non_secure_sram_addr;
  147. u32 non_secure_sram_size;
  148. u32 dtb_addr;
  149. u32 dtb_size;
  150. char pl_version[8];
  151. u32 pl_imgver_status;
  152. u32 ram_console_sram_addr;
  153. u32 ram_console_sram_size;
  154. u32 ram_console_def_type;
  155. u32 ram_console_memory_info_offset;
  156. } BOOT_ARGUMENT;
  157. typedef enum {
  158. BOOT_OPT_64S3 = 0,
  159. BOOT_OPT_64S1,
  160. BOOT_OPT_32S3,
  161. BOOT_OPT_32S1,
  162. BOOT_OPT_64N2,
  163. BOOT_OPT_64N1,
  164. BOOT_OPT_32N2,
  165. BOOT_OPT_32N1,
  166. BOOT_OPT_UNKNOWN
  167. } boot_option_t;
  168. typedef enum {
  169. CHIP_SW_VER_01 = 0x0000,
  170. CHIP_SW_VER_02 = 0x0001
  171. } CHIP_SW_VER;
  172. typedef enum {
  173. CHIP_HW_VER_01 = 0xCA00,
  174. CHIP_HW_VER_02 = 0xCA01
  175. } CHIP_HW_VER;
  176. typedef struct { /* RAM configuration */
  177. #ifndef MTK_LM_MODE
  178. unsigned long start;
  179. unsigned long size;
  180. #else
  181. unsigned long long start;
  182. unsigned long long size;
  183. #endif
  184. } BI_DRAM;
  185. /* ====== Preloader to LK Tags START ===== */
  186. /* boot reason */
  187. #define BOOT_TAG_BOOT_REASON 0x88610001
  188. struct boot_tag_boot_reason {
  189. u32 boot_reason;
  190. };
  191. /* boot mode */
  192. #define BOOT_TAG_BOOT_MODE 0x88610002
  193. struct boot_tag_boot_mode {
  194. u32 boot_mode;
  195. };
  196. /* META com port information */
  197. #define BOOT_TAG_META_COM 0x88610003
  198. struct boot_tag_meta_com {
  199. u32 meta_com_type;
  200. u32 meta_com_id;
  201. u32 meta_uart_port;
  202. };
  203. /* log com port information */
  204. #define BOOT_TAG_LOG_COM 0x88610004
  205. struct boot_tag_log_com {
  206. u32 log_port;
  207. u32 log_baudrate;
  208. u32 log_enable;
  209. u32 log_dynamic_switch;
  210. };
  211. /* memory information */
  212. #define BOOT_TAG_MEM 0x88610005
  213. struct boot_tag_mem {
  214. u32 dram_rank_num;
  215. u64 dram_rank_size[4];
  216. mblock_info_t mblock_info;
  217. dram_info_t orig_dram_info;
  218. mem_desc_t lca_reserved_mem;
  219. mem_desc_t tee_reserved_mem;
  220. };
  221. /* MD information */
  222. #define BOOT_TAG_MD_INFO 0x88610006
  223. struct boot_tag_md_info {
  224. u32 md_type[4];
  225. };
  226. /* boot time */
  227. #define BOOT_TAG_BOOT_TIME 0x88610007
  228. struct boot_tag_boot_time {
  229. u32 boot_time;
  230. };
  231. /* DA information */
  232. #define BOOT_TAG_DA_INFO 0x88610008
  233. struct boot_tag_da_info {
  234. da_info_t da_info;
  235. };
  236. /* security limitation information */
  237. #define BOOT_TAG_SEC_INFO 0x88610009
  238. struct boot_tag_sec_info {
  239. SEC_LIMIT sec_limit;
  240. };
  241. /* (for dummy AP) partition number */
  242. #define BOOT_TAG_PART_NUM 0x8861000A
  243. struct boot_tag_part_num {
  244. u32 part_num;
  245. };
  246. /* (for dummy AP) partition info */
  247. #define BOOT_TAG_PART_INFO 0x8861000B
  248. struct boot_tag_part_info {
  249. part_hdr_t *part_info;
  250. };
  251. /* eflag */
  252. #define BOOT_TAG_EFLAG 0x8861000C
  253. struct boot_tag_eflag {
  254. u32 e_flag;
  255. };
  256. /* DDR reserve */
  257. #define BOOT_TAG_DDR_RESERVE 0x8861000D
  258. struct boot_tag_ddr_reserve {
  259. u32 ddr_reserve_enable;
  260. u32 ddr_reserve_success;
  261. u32 ddr_reserve_ready;
  262. };
  263. /* DRAM BUFF */
  264. #define BOOT_TAG_DRAM_BUF 0x8861000E
  265. struct boot_tag_dram_buf {
  266. u32 dram_buf_size;
  267. };
  268. /* VCORE DVFS */
  269. #define BOOT_TAG_VCORE_DVFS 0x8861000F
  270. struct boot_tag_vcore_dvfs {
  271. vcore_dvfs_info_t vcore_dvfs_info;
  272. };
  273. /* PTP */
  274. #define BOOT_TAG_PTP 0x88610010
  275. struct boot_tag_ptp {
  276. ptp_info_t ptp_volt_info;
  277. };
  278. #define BOOT_TAG_BOOT_OPT 0x88610011
  279. struct boot_tag_boot_opt {
  280. u32 smc_boot_opt;
  281. u32 lk_boot_opt;
  282. u32 kernel_boot_opt;
  283. };
  284. #define BOOT_TAG_SRAM_INFO 0x88610012
  285. struct boot_tag_sram_info {
  286. u32 non_secure_sram_addr;
  287. u32 non_secure_sram_size;
  288. };
  289. #define BOOT_TAG_DTB_INFO 0x88610013
  290. struct boot_tag_dtb_info {
  291. u32 dtb_addr;
  292. u32 dtb_size;
  293. };
  294. #define BOOT_TAG_PL_VERSION 0x88610014
  295. struct boot_tag_pl_version {
  296. char pl_version[8];
  297. };
  298. #define BOOT_TAG_IMGVER_INFO 0x88610015
  299. struct boot_tag_imgver_info {
  300. u32 pl_imgver_status;
  301. };
  302. #define BOOT_TAG_RAM_CONSOLE_INFO 0x8861001C
  303. struct boot_tag_ram_console_info {
  304. u32 sram_addr;
  305. u32 sram_size;
  306. u32 def_type;
  307. u32 memory_info_offset;
  308. };
  309. struct boot_tag_header {
  310. u32 size;
  311. u32 tag;
  312. };
  313. struct boot_tag {
  314. struct boot_tag_header hdr;
  315. union {
  316. struct boot_tag_boot_reason boot_reason;
  317. struct boot_tag_boot_mode boot_mode;
  318. struct boot_tag_meta_com meta_com;
  319. struct boot_tag_log_com log_com;
  320. struct boot_tag_mem mem;
  321. struct boot_tag_md_info md_info;
  322. struct boot_tag_boot_time boot_time;
  323. struct boot_tag_da_info da_info;
  324. struct boot_tag_sec_info sec_info;
  325. struct boot_tag_part_num part_num;
  326. struct boot_tag_part_info part_info;
  327. struct boot_tag_eflag eflag;
  328. struct boot_tag_ddr_reserve ddr_reserve;
  329. struct boot_tag_dram_buf dram_buf;
  330. struct boot_tag_vcore_dvfs vcore_dvfs;
  331. struct boot_tag_boot_opt boot_opt;
  332. struct boot_tag_sram_info sram_info;
  333. struct boot_tag_ptp ptp_volt;
  334. struct boot_tag_dtb_info dtb_info;
  335. struct boot_tag_pl_version pl_version;
  336. struct boot_tag_imgver_info imgver_info;
  337. struct boot_tag_ram_console_info ram_console_info;
  338. } u;
  339. };
  340. #define boot_tag_next(t) ((struct boot_tag *)((u32 *)(t) + (t)->hdr.size))
  341. /* ====== Preloader to LK Tags END ===== */
  342. #define BOOT_ARGUMENT_MAGIC 0x504c504c
  343. extern unsigned int BOOT_ARGUMENT_LOCATION;
  344. extern void boot_mode_select(void);
  345. extern BOOTMODE g_boot_mode;
  346. extern CHIP_SW_VER mt_get_chip_sw_ver(void);
  347. extern CHIP_HW_VER mt_get_chip_hw_ver(void);
  348. unsigned int mt_get_chip_hw_code(void);
  349. extern int g_is_64bit_kernel;
  350. extern void platform_k64_check(void);
  351. extern BOOT_ARGUMENT *g_boot_arg;
  352. /*FIXME: NAND/eMMC boot. Needo to specifiy by MTK build system. TEMP define here*/
  353. //#define CFG_NAND_BOOT
  354. //#define CFG_MMC_BOOT
  355. #endif