hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/soc/rockchip/minidump/rk_minidump.c
....@@ -72,6 +72,8 @@
7272 static void __iomem *md_elf_mem;
7373 static resource_size_t md_elf_size;
7474 static struct proc_dir_entry *proc_rk_minidump;
75
+static bool md_is_ddr_address_default(u64 phys_addr);
76
+bool (*md_is_ddr_address)(u64 virt_addr) = md_is_ddr_address_default;
7577
7678 /* Number of pending entries to be added in ToC regions */
7779 static unsigned int pendings;
....@@ -168,6 +170,8 @@
168170 shdr->sh_flags = SHF_WRITE;
169171 shdr->sh_offset = minidump_elfheader.elf_offset;
170172 shdr->sh_entsize = 0;
173
+ shdr->sh_addralign = shdr->sh_addr; /* backup */
174
+ shdr->sh_entsize = entry->phys_addr; /* backup */
171175
172176 if (strstr((const char *)mdr->name, "note"))
173177 phdr->p_type = PT_NOTE;
....@@ -178,6 +182,7 @@
178182 phdr->p_paddr = entry->phys_addr;
179183 phdr->p_filesz = phdr->p_memsz = mdr->region_size;
180184 phdr->p_flags = PF_R | PF_W;
185
+ phdr->p_align = phdr->p_paddr; /* backup */
181186 minidump_elfheader.elf_offset += shdr->sh_size;
182187 mdr->md_valid = MD_REGION_VALID;
183188 minidump_table.md_ss_toc->ss_region_count++;
....@@ -210,6 +215,26 @@
210215 }
211216
212217 return 0;
218
+}
219
+
220
+int md_is_in_the_region(u64 addr)
221
+{
222
+ struct md_region *mdr;
223
+ u32 entries;
224
+ int i;
225
+
226
+ entries = minidump_table.num_regions;
227
+
228
+ for (i = 0; i < entries; i++) {
229
+ mdr = &minidump_table.entry[i];
230
+ if (mdr->virt_addr <= addr && addr < (mdr->virt_addr + mdr->size))
231
+ break;
232
+ }
233
+
234
+ if (i < entries)
235
+ return 1;
236
+ else
237
+ return 0;
213238 }
214239
215240 int rk_minidump_update_region(int regno, const struct md_region *entry)
....@@ -254,8 +279,11 @@
254279 phdr = elf_program(hdr, regno + 1);
255280
256281 shdr->sh_addr = (elf_addr_t)entry->virt_addr;
282
+ shdr->sh_addralign = shdr->sh_addr; /* backup */
283
+ shdr->sh_entsize = entry->phys_addr; /* backup */
257284 phdr->p_vaddr = entry->virt_addr;
258285 phdr->p_paddr = entry->phys_addr;
286
+ phdr->p_align = phdr->p_paddr; /* backup */
259287
260288 err_unlock:
261289 read_unlock_irqrestore(&mdt_remove_lock, flags);
....@@ -595,6 +623,22 @@
595623 .proc_read = rk_minidump_read_elf,
596624 };
597625
626
+static bool md_is_ddr_address_rk3588(u64 phys_addr)
627
+{
628
+ /* peripheral address space */
629
+ if (phys_addr >= 0xf0000000 && phys_addr < 0x100000000)
630
+ return false;
631
+ /* DDR is up to 32GB */
632
+ if (phys_addr > 0x800000000)
633
+ return false;
634
+ return true;
635
+}
636
+
637
+static bool md_is_ddr_address_default(u64 phys_addr)
638
+{
639
+ return true;
640
+}
641
+
598642 static int rk_minidump_driver_probe(struct platform_device *pdev)
599643 {
600644 unsigned int i;
....@@ -655,11 +699,17 @@
655699 phdr = (Elf64_Phdr *)(md_elf_mem + (ulong)ehdr->e_phoff);
656700 phdr += ehdr->e_phnum - 1;
657701 md_elf_size = phdr->p_memsz + phdr->p_offset;
658
-
659
- pr_info("Create /proc/rk_md/minidump...\n");
702
+ if (md_elf_size > r_size)
703
+ md_elf_size = r_size;
704
+ pr_info("Create /proc/rk_md/minidump, size:0x%llx...\n", md_elf_size);
660705 proc_rk_minidump = proc_create("minidump", 0400, base_dir, &rk_minidump_proc_ops);
706
+ } else {
707
+ pr_info("Create /proc/rk_md/minidump fail...\n");
661708 }
662709
710
+ if (of_machine_is_compatible("rockchip,rk3588"))
711
+ md_is_ddr_address = md_is_ddr_address_rk3588;
712
+
663713 /* Check global minidump support initialization */
664714 if (!md_global_toc->md_toc_init) {
665715 pr_err("System Minidump TOC not initialized\n");