minidump_private.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2017-2019, 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef __MINIDUMP_PRIVATE_H
  7. #define __MINIDUMP_PRIVATE_H
  8. #define MD_REVISION 1
  9. #define SBL_MINIDUMP_SMEM_ID 602
  10. #define MAX_NUM_OF_SS 10
  11. #define MD_SS_HLOS_ID 0
  12. #define SMEM_ENTRY_SIZE 40
  13. /* Bootloader has 16 byte support, 4 bytes reserved for itself */
  14. #define MAX_REGION_NAME_LENGTH 16
  15. #define MD_REGION_VALID ('V' << 24 | 'A' << 16 | 'L' << 8 | 'I' << 0)
  16. #define MD_REGION_INVALID ('I' << 24 | 'N' << 16 | 'V' << 8 | 'A' << 0)
  17. #define MD_REGION_INIT ('I' << 24 | 'N' << 16 | 'I' << 8 | 'T' << 0)
  18. #define MD_REGION_NOINIT 0
  19. #define MD_SS_ENCR_REQ (0 << 24 | 'Y' << 16 | 'E' << 8 | 'S' << 0)
  20. #define MD_SS_ENCR_NOTREQ (0 << 24 | 0 << 16 | 'N' << 8 | 'R' << 0)
  21. #define MD_SS_ENCR_NONE ('N' << 24 | 'O' << 16 | 'N' << 8 | 'E' << 0)
  22. #define MD_SS_ENCR_DONE ('D' << 24 | 'O' << 16 | 'N' << 8 | 'E' << 0)
  23. #define MD_SS_ENCR_START ('S' << 24 | 'T' << 16 | 'R' << 8 | 'T' << 0)
  24. #define MD_SS_ENABLED ('E' << 24 | 'N' << 16 | 'B' << 8 | 'L' << 0)
  25. #define MD_SS_DISABLED ('D' << 24 | 'S' << 16 | 'B' << 8 | 'L' << 0)
  26. #define MAX_NUM_ENTRIES (CONFIG_MINIDUMP_MAX_ENTRIES + 1)
  27. #define MAX_STRTBL_SIZE (MAX_NUM_ENTRIES * MAX_REGION_NAME_LENGTH)
  28. extern unsigned int md_num_regions;
  29. extern struct md_elfhdr minidump_elfheader;
  30. extern spinlock_t mdt_lock;
  31. /**
  32. * md_ss_region - Minidump region
  33. * @name : Name of the region to be dumped
  34. * @seq_num: : Use to differentiate regions with same name.
  35. * @md_valid : This entry to be dumped (if set to 1)
  36. * @region_base_address : Physical address of region to be dumped
  37. * @region_size : Size of the region
  38. */
  39. struct md_ss_region {
  40. char name[MAX_REGION_NAME_LENGTH];
  41. u32 seq_num;
  42. u32 md_valid;
  43. u64 region_base_address;
  44. u64 region_size;
  45. };
  46. /**
  47. * md_ss_toc: Sub system SMEM Table of content
  48. * @md_ss_toc_init : SS toc init status
  49. * @md_ss_enable_status : if set to 1, Bootloader would dump this SS regions
  50. * @encryption_status: Encryption status for this subsystem
  51. * @encryption_required : Decides to encrypt the SS regions or not
  52. * @ss_region_count : Number of regions added in this SS toc
  53. * @md_ss_smem_regions_baseptr : regions base pointer of the Subsystem
  54. */
  55. struct md_ss_toc {
  56. u32 md_ss_toc_init;
  57. u32 md_ss_enable_status;
  58. u32 encryption_status;
  59. u32 encryption_required;
  60. u32 ss_region_count;
  61. u64 md_ss_smem_regions_baseptr;
  62. };
  63. /**
  64. * md_global_toc: Global Table of Content
  65. * @md_toc_init : Global Minidump init status
  66. * @md_revision : Minidump revision
  67. * @md_enable_status : Minidump enable status
  68. * @md_ss_toc : Array of subsystems toc
  69. */
  70. struct md_global_toc {
  71. u32 md_toc_init;
  72. u32 md_revision;
  73. u32 md_enable_status;
  74. struct md_ss_toc md_ss_toc[MAX_NUM_OF_SS];
  75. };
  76. int msm_minidump_log_init(void);
  77. /**
  78. * md_elfhdr: Minidump table elf header
  79. * @ehdr: elf main header
  80. * @shdr: Section header
  81. * @phdr: Program header
  82. * @elf_offset: section offset in elf
  83. * @strtable_idx: string table current index position
  84. */
  85. struct md_elfhdr {
  86. struct elfhdr *ehdr;
  87. struct elf_shdr *shdr;
  88. struct elf_phdr *phdr;
  89. u64 elf_offset;
  90. u64 strtable_idx;
  91. };
  92. struct md_ops {
  93. int (*init_md_table)(void);
  94. int (*add_pending_entry)(struct list_head *pending_list);
  95. void (*add_header)(struct elf_shdr *shdr, struct elfhdr *ehdr, unsigned int elfh_size);
  96. int (*remove_region)(const struct md_region *entry);
  97. int (*add_region)(const struct md_region *entry);
  98. int (*update_region)(int regno, const struct md_region *entry);
  99. int (*get_available_region)(void);
  100. bool (*md_enable)(void);
  101. struct md_region (*get_region)(char *name);
  102. };
  103. struct md_init_data {
  104. const struct md_ops *ops;
  105. };
  106. extern int msm_minidump_driver_probe(const struct md_init_data *data);
  107. extern void md_add_elf_header(const struct md_region *entry);
  108. extern void md_update_elf_header(int entryno, const struct md_region *entry);
  109. extern int msm_minidump_clear_headers(const struct md_region *entry);
  110. extern inline unsigned int set_section_name(const char *name);
  111. extern inline char *elf_lookup_string(struct elfhdr *hdr, int offset);
  112. #endif