reboot_record.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <string.h>
  2. #include <arch/ops.h>
  3. #include <dev/mrdump.h>
  4. #include <debug.h>
  5. #include "aee.h"
  6. #include "mrdump_private.h"
  7. #ifdef MTK_MRDUMP_SRAM_CB
  8. struct mrdump_control_block *mrdump_cb_addr(void)
  9. {
  10. /* directly return the address of debug service on SRAM */
  11. return (struct mrdump_control_block *)MRDUMP_CB_ADDR;
  12. }
  13. int mrdump_cb_size(void)
  14. {
  15. return MRDUMP_CB_SIZE;
  16. }
  17. #else
  18. #ifdef MTK_3LEVEL_PAGETABLE
  19. #include <stdlib.h>
  20. #include <err.h>
  21. #endif
  22. #define SEARCH_SIZE 33554432
  23. #define SEARCH_STEP 1024
  24. #ifdef MTK_3LEVEL_PAGETABLE
  25. #define MAX_MAP_CNT (SECTION_SIZE/SEARCH_STEP)
  26. #define mapflags (MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA)
  27. struct mrdump_control_block *mrdump_cb_addr(void)
  28. {
  29. int i, cnt = 0;
  30. /* to write sig, use 1-on-1 mapping */
  31. uint64_t paddr = DRAM_PHY_ADDR;
  32. vaddr_t vaddr = (vaddr_t)paddr;
  33. for (i = 0; i < SEARCH_SIZE; i += SEARCH_STEP) {
  34. if (cnt == 0) {
  35. int map_ok = arch_mmu_map(paddr, vaddr, mapflags, SECTION_SIZE);
  36. if (map_ok != NO_ERROR) {
  37. dprintf(CRITICAL, "%s: arch_mmu_map error.\n", __func__);
  38. return NULL;
  39. }
  40. }
  41. struct mrdump_control_block *bufp = (struct mrdump_control_block *)vaddr;
  42. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  43. return bufp;
  44. }
  45. cnt++;
  46. cnt %= MAX_MAP_CNT;
  47. paddr += SEARCH_STEP;
  48. vaddr += SEARCH_STEP;
  49. }
  50. return NULL;
  51. }
  52. #else
  53. struct mrdump_control_block *mrdump_cb_addr(void)
  54. {
  55. int i;
  56. for (i = 0; i < SEARCH_SIZE; i += SEARCH_STEP) {
  57. struct mrdump_control_block *bufp = (struct mrdump_control_block *)(DRAM_PHY_ADDR + i);
  58. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  59. return bufp;
  60. }
  61. }
  62. return NULL;
  63. }
  64. #endif
  65. int mrdump_cb_size(void)
  66. {
  67. return 8192; /* Hardcode for old platform */
  68. }
  69. #endif //MTK_MRDUMP_SRAM_CB
  70. int aee_mrdump_get_info(struct mrdump_control_block *mcb)
  71. {
  72. if (mcb == NULL)
  73. return -1;
  74. struct mrdump_control_block *bufp = NULL;
  75. memset(mcb, 0, sizeof(struct mrdump_control_block));
  76. bufp = mrdump_cb_addr();
  77. if (bufp == NULL)
  78. return -2;
  79. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  80. memcpy(mcb, bufp, sizeof(struct mrdump_control_block));
  81. return 0;
  82. } else {
  83. return -3;
  84. }
  85. }
  86. struct mrdump_control_block *aee_mrdump_get_params(void)
  87. {
  88. struct mrdump_control_block *bufp = mrdump_cb_addr();
  89. if (bufp == NULL) {
  90. dprintf(CRITICAL, "mrdump_cb is NULL\n");
  91. return NULL;
  92. }
  93. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  94. bufp->sig[0] = 'X';
  95. aee_mrdump_flush_cblock(bufp);
  96. dprintf(CRITICAL, "Boot record found at %p[%02x%02x]\n", bufp, bufp->sig[0], bufp->sig[1]);
  97. return bufp;
  98. } else {
  99. dprintf(CRITICAL, "No Boot record found\n");
  100. return NULL;
  101. }
  102. }
  103. void aee_mrdump_flush_cblock(struct mrdump_control_block *bufp)
  104. {
  105. if (bufp != NULL) {
  106. arch_clean_cache_range((addr_t)bufp, sizeof(struct mrdump_control_block));
  107. }
  108. }