atf_ramdump.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include <sys/types.h>
  2. #include <debug.h>
  3. #include <platform/mt_typedefs.h>
  4. #include <libfdt.h>
  5. #define INFO_LOG(fmt, args...) do {dprintf(INFO, fmt, ##args);} while (0)
  6. #define ALWAYS_LOG(fmt, args...) do {dprintf(ALWAYS, fmt, ##args);} while (0)
  7. void get_atf_ramdump_memory(void *fdt){
  8. int offset, sub_offset;
  9. uint32_t address_hi, address_lo, size_hi, size_lo;
  10. int len;
  11. const struct fdt_property *prop;
  12. offset = fdt_path_offset(fdt, "/reserved-memory");
  13. sub_offset = fdt_subnode_offset(fdt, offset, "atf-ramdump-memory");
  14. if (sub_offset) {
  15. prop = fdt_get_property(fdt, sub_offset, "reg", &len);
  16. if(prop){
  17. memcpy((void *)&address_hi, (void *)prop->data, sizeof(uint32_t));
  18. memcpy((void *)&address_lo, (void *)&prop->data[4], sizeof(uint32_t));
  19. memcpy((void *)&size_hi, (void *)&prop->data[8], sizeof(uint32_t));
  20. memcpy((void *)&size_lo, (void *)&prop->data[12], sizeof(uint32_t));
  21. address_hi = fdt32_to_cpu(address_hi);
  22. address_lo = fdt32_to_cpu(address_lo);
  23. size_hi = fdt32_to_cpu(size_hi);
  24. size_lo = fdt32_to_cpu(size_lo);
  25. __asm__ volatile("ldr r0, =0x8200020E\n" //MTK_SIP_RAM_DUMP_ADDR_AARCH32
  26. "mov r1, %0\n"
  27. "mov r2, %1\n"
  28. "mov r3, %2\n"
  29. "mov r4, %3\n"
  30. "smc #0x0\n"
  31. ::"r"(address_hi),"r"(address_lo),"r"(size_hi),"r"(size_lo):"cc", "r0", "r1" ,"r2", "r3", "r4"
  32. );
  33. INFO_LOG("atf ram dump address hi:0x%x, adress lo:0x%x, size hi:%u, size lo:%u\n", address_hi, address_lo, size_hi, size_lo);
  34. }
  35. else{
  36. ALWAYS_LOG("Can not find atf ram dump!\n");
  37. }
  38. }
  39. else{
  40. ALWAYS_LOG("Can not find atf-ramdump-memory node!\n");
  41. }
  42. }