atf_ramdump.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include <arch/arm/mmu.h>
  2. #include <debug.h>
  3. #include <dev/aee_platform_debug.h>
  4. #include <libfdt.h>
  5. #ifdef MTK_SMC_ID_MGMT
  6. #include <mtk_secure_api.h>
  7. #endif
  8. #include <platform/boot_mode.h>
  9. #include <platform/mt_typedefs.h>
  10. #include <platform/plat_atf_dbg_info.h>
  11. #include <sys/types.h>
  12. #ifdef MBLOCK_LIB_SUPPORT
  13. #include <mblock.h>
  14. #endif
  15. /* default support ATF, define an empty function in ARMv7 chip family */
  16. #pragma weak atf_log_init
  17. #ifndef MTK_SMC_ID_MGMT
  18. #define MTK_SIP_LK_DUMP_ATF_LOG_INFO_AARCH32 0x8200010A
  19. #endif
  20. #define ATF_CRASH_MAGIC_NO 0xdead1abf
  21. #define ATF_LAST_LOG_MAGIC_NO 0x41544641
  22. #define ATF_DUMP_DONE_MAGIC_NO 0xd07ed07e
  23. #define ATF_SMC_UNK 0xffffffff
  24. #define INFO_LOG(fmt, args...) do {dprintf(INFO, fmt, ##args);} while (0)
  25. #define ALWAYS_LOG(fmt, args...) do {dprintf(ALWAYS, fmt, ##args);} while (0)
  26. extern BOOT_ARGUMENT *g_boot_arg;
  27. static u64 atf_ramdump_addr;
  28. static u64 atf_ramdump_size;
  29. static uint32_t atf_log_buf_addr;
  30. static uint32_t atf_log_buf_size;
  31. static uint32_t atf_crash_flag_addr;
  32. static void get_atf_ramdump_memory(void)
  33. {
  34. #if (defined(MTK_SMC_ID_MGMT) && !defined(MTK_DIS_ATF_RAM_DUMP))
  35. uint32_t address_hi, address_lo, size_hi, size_lo;
  36. u64 limit_addr = (u64)ATF_RAMDUMP_BUFFER_LIMIT_ADDR;
  37. u64 align_addr = (u64)ATF_RAMDUMP_BUFFER_ADDR_ALIGNMENT;
  38. atf_ramdump_size = ATF_RAMDUMP_BUFFER_SIZE;
  39. atf_ramdump_addr = mblock_reserve_ext(&g_boot_arg->mblock_info,
  40. (u64) atf_ramdump_size, (u64)align_addr, limit_addr, 0,
  41. "atf-ramdump-memory");
  42. if (atf_ramdump_addr) {
  43. address_hi = (atf_ramdump_addr >> 32) & 0xFFFFFFFF;
  44. address_lo = atf_ramdump_addr & 0xFFFFFFFF;
  45. size_hi = 0;
  46. size_lo = ATF_RAMDUMP_BUFFER_SIZE & 0xFFFFFFFF;
  47. mt_secure_call(MTK_SIP_RAM_DUMP_ADDR, address_hi, address_lo, size_hi, size_lo);
  48. ALWAYS_LOG("atf ram dump address hi:0x%x, adress lo:0x%x, size hi:%u, size lo:%u\n",
  49. address_hi, address_lo, size_hi, size_lo);
  50. } else {
  51. ALWAYS_LOG("Can't reserve atf-ramdump-memory, atf_ramdump_addr=0x%llx!\n",
  52. atf_ramdump_addr);
  53. }
  54. #else
  55. atf_ramdump_size = 0;
  56. atf_ramdump_addr = 0;
  57. ALWAYS_LOG("Do not support atf-ramdump-memory, atf_ramdump_addr=0x%llx!\n",
  58. atf_ramdump_addr);
  59. #endif
  60. }
  61. static uint32_t save_atf_log(u64 offset, int *len, CALLBACK dev_write)
  62. {
  63. uint32_t datasize = 0;
  64. #ifdef MTK_3LEVEL_PAGETABLE
  65. /* ATF log is located in DRAM, we must allocate it first */
  66. arch_mmu_map(ROUNDDOWN((uint64_t)atf_log_buf_addr, PAGE_SIZE), ROUNDDOWN((uint32_t)atf_log_buf_addr, PAGE_SIZE),
  67. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA, ROUNDUP(atf_log_buf_size, PAGE_SIZE));
  68. #endif
  69. *len = atf_log_buf_size;
  70. datasize = dev_write((void *)atf_log_buf_addr, *len);
  71. /* Clear ATF crash flag */
  72. *(uint32_t *)atf_crash_flag_addr = ATF_DUMP_DONE_MAGIC_NO;
  73. arch_clean_cache_range((addr_t)atf_crash_flag_addr, sizeof(uint32_t));
  74. dprintf(INFO, "ATF: dev_write:%u, atf_log_buf_addr:0x%x, atf_log_buf_size:%u, crash_flag:0x%x\n", datasize, atf_log_buf_addr, atf_log_buf_size, *(uint32_t *)atf_crash_flag_addr);
  75. return datasize;
  76. }
  77. static uint32_t save_atf_rdump(u64 offset, int *len, CALLBACK dev_write)
  78. {
  79. uint32_t datasize = 0;
  80. u64 local_atf_ramdump_addr;
  81. u64 local_atf_ramdump_size;
  82. local_atf_ramdump_addr = atf_ramdump_addr;
  83. local_atf_ramdump_size = atf_ramdump_size;
  84. #ifdef MTK_3LEVEL_PAGETABLE
  85. /* ATF log is located in DRAM, we must allocate it first */
  86. arch_mmu_map(ROUNDDOWN((uint64_t)local_atf_ramdump_addr, PAGE_SIZE),
  87. ROUNDDOWN((uint32_t)local_atf_ramdump_addr, PAGE_SIZE),
  88. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA,
  89. ROUNDUP(local_atf_ramdump_size, PAGE_SIZE));
  90. #endif
  91. *len = local_atf_ramdump_size;
  92. datasize = dev_write((void *)(uint32_t)local_atf_ramdump_addr, *len);
  93. dprintf(CRITICAL, "ATF: dev_write:%u, local_atf_ramdump_addr:0x%llx, local_atf_ramdump_size:0x%llx\n",
  94. datasize, local_atf_ramdump_addr, local_atf_ramdump_size);
  95. return datasize;
  96. }
  97. void atf_log_init(void)
  98. {
  99. #ifdef MTK_SMC_ID_MGMT
  100. uint32_t smc_id = MTK_SIP_LK_DUMP_ATF_LOG_INFO;
  101. #else
  102. uint32_t smc_id = MTK_SIP_LK_DUMP_ATF_LOG_INFO_AARCH32;
  103. #endif
  104. plat_atf_log_get = NULL;
  105. plat_atf_crash_get = NULL;
  106. plat_atf_rdump_get = save_atf_rdump;
  107. /* reserve ramdump memory and pass to ATF*/
  108. get_atf_ramdump_memory();
  109. #ifdef MTK_SMC_ID_MGMT
  110. atf_log_buf_addr = mt_secure_call_ret3(smc_id, 0, 0, 0, 0, &atf_log_buf_size, &atf_crash_flag_addr);
  111. #else
  112. __asm__ volatile(".arch_extension sec\n"
  113. "mov r0, %[smcid]\n"
  114. "smc #0x0\n"
  115. "mov %[addr], r0\n"
  116. "mov %[size], r1\n"
  117. "mov %[type], r2\n"
  118. :[addr]"=r"(atf_log_buf_addr), [size]"=r"(atf_log_buf_size),
  119. [type]"=r"(atf_crash_flag_addr):[smcid]"r"(smc_id):"cc",
  120. "r0", "r1" ,"r2", "r3");
  121. #endif
  122. if(atf_log_buf_addr == ATF_SMC_UNK) {
  123. dprintf(CRITICAL, "LK Dump: atf_log_init not supported\n");
  124. } else {
  125. plat_atf_rdump_get = save_atf_rdump;
  126. #ifdef MTK_3LEVEL_PAGETABLE
  127. arch_mmu_map(ROUNDDOWN((uint64_t)atf_crash_flag_addr, PAGE_SIZE),
  128. ROUNDDOWN((uint32_t)atf_crash_flag_addr, PAGE_SIZE),
  129. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA,
  130. PAGE_SIZE);
  131. #endif
  132. if(ATF_CRASH_MAGIC_NO == *(uint32_t *)atf_crash_flag_addr){
  133. dprintf(CRITICAL, "ATF: CRASH BUFF\n");
  134. plat_atf_crash_get = save_atf_log;
  135. }
  136. else if(ATF_LAST_LOG_MAGIC_NO == *(uint32_t *)atf_crash_flag_addr){
  137. dprintf(CRITICAL, "ATF: LAST BUFF\n");
  138. plat_atf_log_get = save_atf_log;
  139. }
  140. else {
  141. dprintf(CRITICAL, "ATF: RAW BUFF\n");
  142. plat_atf_raw_log_get = save_atf_log;
  143. }
  144. dprintf(CRITICAL, "atf_log_buf_addr:0x%x, atf_log_buf_size:%u, atf_crash_flag addr:0x%x, atf_log_type:0x%x\n",
  145. atf_log_buf_addr, atf_log_buf_size, atf_crash_flag_addr,
  146. *(uint32_t *)atf_crash_flag_addr);
  147. dprintf(CRITICAL, "plat_atf_log_get:%p, plat_atf_crash_get:%p\n",
  148. plat_atf_log_get, plat_atf_crash_get);
  149. }
  150. }