fpga_boot_argument.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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) 2017. 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. /******************************************************************************
  32. ******************************************************************************/
  33. #include <fpga_boot_argument.h>
  34. #include <debug.h>
  35. /******************************************************************************
  36. ******************************************************************************/
  37. #ifdef FPGA_PRINT_BOOT_ARGUMENT
  38. static BOOT_ARGUMENT ba; // Copy "boot argument" for FPGA environment only.
  39. #endif // FPGA_PRINT_BOOT_ARGUMENT
  40. /******************************************************************************
  41. ******************************************************************************/
  42. void fpga_copy_boot_argument(BOOT_ARGUMENT *boot_arg)
  43. {
  44. #ifdef FPGA_PRINT_BOOT_ARGUMENT
  45. memcpy(&ba, boot_arg, sizeof(ba));
  46. #endif // FPGA_PRINT_BOOT_ARGUMENT
  47. }
  48. /******************************************************************************
  49. ******************************************************************************/
  50. void fpga_print_boot_argument(void)
  51. {
  52. #ifdef FPGA_PRINT_BOOT_ARGUMENT
  53. int i, elements;
  54. mtk_wdt_restart();
  55. // mdelay(10);
  56. dprintf(CRITICAL, "==============================================\n");
  57. dprintf(CRITICAL, "= Beginning of printing boot arguement =\n");
  58. dprintf(CRITICAL, "==============================================\n");
  59. dprintf(CRITICAL, "maggic_number = 0x%08x\n", ba.maggic_number);
  60. dprintf(CRITICAL, "boot_mode = 0x%08x\n", ba.boot_mode);
  61. dprintf(CRITICAL, "e_flag = 0x%08x\n", ba.e_flag);
  62. // mdelay(1);
  63. dprintf(CRITICAL, "log_port = 0x%08x\n", ba.log_port);
  64. dprintf(CRITICAL, "log_baudrate = 0x%08x\n", ba.log_baudrate);
  65. dprintf(CRITICAL, "log_enable = 0x%02x\n", ba.log_enable);
  66. dprintf(CRITICAL, "log_dynamic_switch = 0x%08x\n", ba.log_dynamic_switch);
  67. dprintf(CRITICAL, "part_num = 0x%02x\n", ba.part_num);
  68. // dprintf(CRITICAL, "reserved[0] = 0x%02x\n", ba.reserved[0]);
  69. // dprintf(CRITICAL, "reserved[1] = 0x%02x\n", ba.reserved[1]);
  70. // mdelay(1);
  71. dprintf(CRITICAL, "dram_rank_num = 0x%08x\n", ba.dram_rank_num);
  72. elements = sizeof(ba.dram_rank_size) / sizeof(ba.dram_rank_size[0]);
  73. elements = (elements > ba.dram_rank_num) ? ba.dram_rank_num : elements;
  74. for (i = 0; i < elements; i++)
  75. {
  76. dprintf(CRITICAL, "dram_rank_size[%d] = 0x%08x_%08x\n", i,
  77. (unsigned int)(ba.dram_rank_size[i] >> 32),
  78. (unsigned int)(ba.dram_rank_size[i] & 0xFFFFFFFF));
  79. }
  80. /* Print mblock_info */
  81. // mdelay(1);
  82. mblock_info_t *p_minfo = &ba.mblock_info;
  83. dprintf(CRITICAL, "mblock_info.mblock_num = 0x%08x\n", p_minfo->mblock_num);
  84. elements = sizeof(p_minfo->mblock) / sizeof(p_minfo->mblock[0]);
  85. elements = (elements > p_minfo->mblock_num) ? p_minfo->mblock_num : elements;
  86. for (i = 0; i < elements; i++)
  87. {
  88. dprintf(CRITICAL, "mblock_info.mblock[%d].start = 0x%08x_%08x\n", i,
  89. (unsigned int)(p_minfo->mblock[i].start >> 32),
  90. (unsigned int)(p_minfo->mblock[i].start & 0xFFFFFFFF));
  91. dprintf(CRITICAL, "mblock_info.mblock[%d].size = 0x%08x_%08x\n", i,
  92. (unsigned int)(p_minfo->mblock[i].size >> 32),
  93. (unsigned int)(p_minfo->mblock[i].size & 0xFFFFFFFF));
  94. dprintf(CRITICAL, "mblock_info.mblock[%d].rank = 0x%08x\n", i,
  95. p_minfo->mblock[i].rank);
  96. mtk_wdt_restart();
  97. }
  98. dprintf(CRITICAL, "mblock_info.mblock_magic = 0x%08x\n", p_minfo->mblock_magic);
  99. dprintf(CRITICAL, "mblock_info.mblock_version = 0x%08x\n", p_minfo->mblock_version);
  100. dprintf(CRITICAL, "mblock_info.reserved_num = 0x%08x\n", p_minfo->reserved_num);
  101. elements = sizeof(p_minfo->reserved) / sizeof(p_minfo->reserved[0]);
  102. elements = (elements > p_minfo->reserved_num) ? p_minfo->reserved_num : elements;
  103. for (i = 0; i < elements; i++)
  104. {
  105. dprintf(CRITICAL, "mblock_info.reserved[%d].start = 0x%08x_%08x\n", i,
  106. (unsigned int)(p_minfo->reserved[i].start >> 32),
  107. (unsigned int)(p_minfo->reserved[i].start & 0xFFFFFFFF));
  108. dprintf(CRITICAL, "mblock_info.reserved[%d].size = 0x%08x_%08x\n", i,
  109. (unsigned int)(p_minfo->reserved[i].size >> 32),
  110. (unsigned int)(p_minfo->reserved[i].size & 0xFFFFFFFF));
  111. dprintf(CRITICAL, "mblock_info.reserved[%d].mapping = 0x%08x\n", i,
  112. p_minfo->reserved[i].mapping);
  113. dprintf(CRITICAL, "mblock_info.reserved[%d].name:\n");
  114. hexdump(p_minfo->reserved[i].name, sizeof(p_minfo->reserved[i].name));
  115. }
  116. /* Print dram info */
  117. // mdelay(1);
  118. dram_info_t *p_dram = &ba.orig_dram_info;
  119. dprintf(CRITICAL, "orig_dram_info.rank_num = 0x%08x\n", p_dram->rank_num);
  120. elements = sizeof(p_dram->rank_info) / sizeof(p_dram->rank_info[0]);
  121. elements = (elements > p_dram->rank_num) ? p_dram->rank_num : elements;
  122. for (i = 0; i < elements; i++)
  123. {
  124. dprintf(CRITICAL, "orig_dram_info.rank_info[%d].start = 0x%08x_%08x\n", i,
  125. (unsigned int)(p_dram->rank_info[i].start >> 32),
  126. (unsigned int)(p_dram->rank_info[i].start & 0xFFFFFFFF));
  127. dprintf(CRITICAL, "orig_dram_info.rank_info[%d].size = 0x%08x_%08x\n", i,
  128. (unsigned int)(p_dram->rank_info[i].size >> 32),
  129. (unsigned int)(p_dram->rank_info[i].size & 0xFFFFFFFF));
  130. // mdelay(1);
  131. }
  132. dprintf(CRITICAL, "lca_reserved_mem.start = 0x%08x_%08x\n",
  133. (unsigned int)(ba.lca_reserved_mem.start >> 32),
  134. (unsigned int)(ba.lca_reserved_mem.start & 0xFFFFFFFF));
  135. dprintf(CRITICAL, "lca_reserved_mem.size = 0x%08x_%08x\n",
  136. (unsigned int)(ba.lca_reserved_mem.size >> 32),
  137. (unsigned int)(ba.lca_reserved_mem.size & 0xFFFFFFFF));
  138. dprintf(CRITICAL, "tee_reserved_mem.start = 0x%08x_%08x\n",
  139. (unsigned int)(ba.tee_reserved_mem.start >> 32),
  140. (unsigned int)(ba.tee_reserved_mem.start & 0xFFFFFFFF));
  141. dprintf(CRITICAL, "tee_reserved_mem.size = 0x%08x_%08x\n",
  142. (unsigned int)(ba.tee_reserved_mem.size >> 32),
  143. (unsigned int)(ba.tee_reserved_mem.size & 0xFFFFFFFF));
  144. // mdelay(1);
  145. dprintf(CRITICAL, "boot_reason = 0x%08x\n", ba.boot_reason);
  146. dprintf(CRITICAL, "meta_com_type = 0x%08x\n", ba.meta_com_type);
  147. dprintf(CRITICAL, "meta_com_id = 0x%08x\n", ba.meta_com_id);
  148. dprintf(CRITICAL, "boot_time = 0x%08x\n", ba.boot_time);
  149. /* Print da_info */
  150. // mdelay(1);
  151. dprintf(CRITICAL, "da_info.addr = 0x%08x\n", ba.da_info.addr);
  152. dprintf(CRITICAL, "da_info.arg1 = 0x%08x\n", ba.da_info.arg1);
  153. dprintf(CRITICAL, "da_info.arg2 = 0x%08x\n", ba.da_info.arg2);
  154. dprintf(CRITICAL, "da_info.len = 0x%08x\n", ba.da_info.len);
  155. dprintf(CRITICAL, "da_info.sig_len = 0x%08x\n", ba.da_info.sig_len);
  156. // mdelay(1);
  157. dprintf(CRITICAL, "sec_limit.magic_num = 0x%08x\n", ba.sec_limit.magic_num);
  158. dprintf(CRITICAL, "sec_limit.forbid_mode = 0x%08x\n", ba.sec_limit.forbid_mode);
  159. dprintf(CRITICAL, "part_info = 0x%08x\n", ba.part_info);
  160. elements = sizeof(ba.md_type) / sizeof(ba.md_type[0]);
  161. dprintf(CRITICAL, "md_type[%d]:\n", elements);
  162. hexdump(ba.md_type, elements);
  163. // mdelay(1);
  164. dprintf(CRITICAL, "ddr_reserve_enable = 0x%08x\n", ba.ddr_reserve_enable);
  165. dprintf(CRITICAL, "ddr_reserve_success = 0x%08x\n", ba.ddr_reserve_success);
  166. dprintf(CRITICAL, "ddr_reserve_ready = 0x%08x\n", ba.ddr_reserve_ready);
  167. /* Print ptp_volt_info */
  168. // mdelay(1);
  169. dprintf(CRITICAL, "ptp_volt_info.first_volt = 0x%08x\n", ba.ptp_volt_info.first_volt);
  170. dprintf(CRITICAL, "ptp_volt_info.second_volt = 0x%08x\n", ba.ptp_volt_info.second_volt);
  171. dprintf(CRITICAL, "ptp_volt_info.third_volt = 0x%08x\n", ba.ptp_volt_info.third_volt);
  172. dprintf(CRITICAL, "ptp_volt_info.have_550 = 0x%08x\n", ba.ptp_volt_info.have_550);
  173. dprintf(CRITICAL, "dram_buf_size = 0x%08x\n", ba.dram_buf_size);
  174. /* Print emi info */
  175. // mdelay(1);
  176. emi_info_t *p_emi = &ba.emi_info;
  177. dprintf(CRITICAL, "emi_info.dram_type = 0x%08x\n", p_emi->dram_type);
  178. dprintf(CRITICAL, "emi_info.ch_num = 0x%08x\n", p_emi->ch_num);
  179. dprintf(CRITICAL, "emi_info.rk_num = 0x%08x\n", p_emi->rk_num);
  180. elements = sizeof(p_emi->rank_size) / sizeof(p_emi->rank_size[0]);
  181. for (i = 0; i < elements; i++)
  182. {
  183. dprintf(CRITICAL, "emi_info.rank_size[%d] = 0x%08x_%08x\n", i,
  184. (unsigned int)(p_emi->rank_size[i] >> 32),
  185. (unsigned int)(p_emi->rank_size[i] & 0xFFFFFFFF));
  186. // mdelay(1);
  187. }
  188. dprintf(CRITICAL, "meta_uart_port = 0x%08x\n", ba.meta_uart_port);
  189. dprintf(CRITICAL, "smc_boot_opt = 0x%08x\n", ba.smc_boot_opt);
  190. dprintf(CRITICAL, "lk_boot_opt = 0x%08x\n", ba.lk_boot_opt);
  191. dprintf(CRITICAL, "kernel_boot_opt = 0x%08x\n", ba.kernel_boot_opt);
  192. dprintf(CRITICAL, "non_secure_sram_addr = 0x%08x\n", ba.non_secure_sram_addr);
  193. dprintf(CRITICAL, "non_secure_sram_size = 0x%08x\n", ba.non_secure_sram_size);
  194. elements = sizeof(ba.pl_version) / sizeof(ba.pl_version[0]);
  195. dprintf(CRITICAL, "pl_version[%d]:\n", elements);
  196. hexdump(ba.pl_version, elements);
  197. // mdelay(1);
  198. dprintf(CRITICAL, "pl_imgver_status = 0x%08x\n", ba.pl_imgver_status);
  199. dprintf(CRITICAL, "max_cpus = 0x%08x\n", ba.max_cpus);
  200. dprintf(CRITICAL, "boot_voltage = 0x%08x\n", ba.boot_voltage);
  201. dprintf(CRITICAL, "shutdown_time = 0x%08x\n", ba.shutdown_time);
  202. // mdelay(1);
  203. dprintf(CRITICAL, "==============================================\n");
  204. dprintf(CRITICAL, "= End of printing boot arguement =\n");
  205. dprintf(CRITICAL, "==============================================\n");
  206. mtk_wdt_restart();
  207. #endif // FPGA_PRINT_BOOT_ARGUMENT
  208. }
  209. /******************************************************************************
  210. ******************************************************************************/
  211. void fpga_set_boot_argument(BOOT_ARGUMENT *pba)
  212. {
  213. #ifdef FPGA_SET_BOOT_ARGUMENT
  214. memset((void*)pba, 0, sizeof(*pba));
  215. pba->maggic_number = 0x504c504c;
  216. // pba->boot_mode = 0;
  217. // pba->e_flag = 0;
  218. pba->log_port = 0x11003000;
  219. pba->log_baudrate = 0x000e1000; /* 0xe1000: 921600 */
  220. pba->log_enable = 1;
  221. pba->log_dynamic_switch = 1;
  222. pba->part_num = 2;
  223. // pba->reserved[0] = 0;
  224. // pba->reserved[1] = 0;
  225. pba->dram_rank_num = 2;
  226. pba->dram_rank_size[0] = 0x10000000ULL;
  227. pba->dram_rank_size[1] = 0x10000000ULL;
  228. // pba->dram_rank_size[2] = 0ULL;
  229. // pba->dram_rank_size[3] = 0ULL;
  230. /* Set mblock_info */
  231. pba->mblock_info.mblock_num = 2;
  232. pba->mblock_info.mblock[0].start = 0x40000000ULL;
  233. pba->mblock_info.mblock[0].size = 0x10000000ULL;
  234. pba->mblock_info.mblock[0].rank = 0ULL;
  235. pba->mblock_info.mblock[1].start = 0x50000000ULL;
  236. pba->mblock_info.mblock[1].size = 0x0fe00000ULL;
  237. pba->mblock_info.mblock[1].rank = 1ULL;
  238. pba->mblock_info.mblock_magic = MBLOCK_MAGIC;
  239. pba->mblock_info.mblock_version = MBLOCK_VERSION;
  240. pba->mblock_info.reserved_num = 0;
  241. /* Set dram info */
  242. pba->orig_dram_info.rank_num = 2;
  243. pba->orig_dram_info.rank_info[0].start = 0x40000000ULL;
  244. pba->orig_dram_info.rank_info[0].size = 0x10000000ULL;
  245. pba->orig_dram_info.rank_info[1].start = 0x50000000ULL;
  246. pba->orig_dram_info.rank_info[1].size = 0x10000000ULL;
  247. // pba->lca_reserved_mem.start = 0;
  248. // pba->lca_reserved_mem.size = 0;
  249. pba->tee_reserved_mem.start = 0x5fe00000ULL;
  250. pba->tee_reserved_mem.size = 0x00200000ULL;
  251. // pba->boot_reason = 0;
  252. // pba->meta_com_type = META_UNKNOWN_COM;
  253. // pba->meta_com_id = 0;
  254. // pba->boot_time = 0;
  255. /* Set da_info */
  256. // pba->da_info.addr = 0;
  257. // pba->da_info.arg1 = 0;
  258. // pba->da_info.arg2 = 0;
  259. // pba->da_info.len = 0;
  260. // pba->da_info.sig_len = 0;
  261. // pba->sec_limit.magic_num = 0;
  262. // pba->sec_limit.forbid_mode = F_FACTORY_MODE;
  263. pba->part_info = 0x40079a84; // Needed???
  264. // pba->md_type[0] = 0;
  265. // pba->md_type[1] = 0;
  266. // pba->md_type[2] = 0;
  267. // pba->md_type[3] = 0;
  268. // pba->ddr_reserve_enable = 0;
  269. // pba->ddr_reserve_success = 0;
  270. // pba->ddr_reserve_ready = 0;
  271. /* Set ptp_volt_info */
  272. // pba->ptp_volt_info.first_volt = 0;
  273. // pba->ptp_volt_info.second_volt = 0;
  274. // pba->ptp_volt_info.third_volt = 0;
  275. // pba->ptp_volt_info.have_550 = 0;
  276. pba->dram_buf_size = 0x00199880; // Needed???
  277. /* Set emi info */
  278. // pba->emi_info.dram_type = 0;
  279. // pba->emi_info.ch_num = 0;
  280. // pba->emi_info.rk_num = 0;
  281. // pba->emi_info.rank_size[0] = 0ULL;
  282. // pba->emi_info.rank_size[1] = 0ULL;
  283. pba->meta_uart_port = 0x11003000; // Needed???
  284. // pba->smc_boot_opt = 0;
  285. pba->lk_boot_opt = 3; // Needed???
  286. // pba->kernel_boot_opt = 0;
  287. pba->non_secure_sram_addr = 0x0012c000; // Needed???
  288. pba->non_secure_sram_size = 0x00004000; // Needed???
  289. // pba->pl_version[0] = '\0';
  290. // pba->pl_version[1] = '\0';
  291. // pba->pl_version[2] = '\0';
  292. // pba->pl_version[3] = '\0';
  293. // pba->pl_version[4] = '\0';
  294. // pba->pl_version[5] = '\0';
  295. // pba->pl_version[6] = '\0';
  296. // pba->pl_version[7] = '\0';
  297. // pba->pl_imgver_status = 0;
  298. // pba->max_cpus = 1; // Needed???
  299. // pba->boot_voltage = 0;
  300. // pba->shutdown_time = 0;
  301. #endif // FPGA_SET_BOOT_ARGUMENT
  302. }