From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/drivers/soc/rockchip/minidump/rk_minidump.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 52 insertions(+), 2 deletions(-) diff --git a/kernel/drivers/soc/rockchip/minidump/rk_minidump.c b/kernel/drivers/soc/rockchip/minidump/rk_minidump.c index 908bb5c..d742b7e 100644 --- a/kernel/drivers/soc/rockchip/minidump/rk_minidump.c +++ b/kernel/drivers/soc/rockchip/minidump/rk_minidump.c @@ -72,6 +72,8 @@ static void __iomem *md_elf_mem; static resource_size_t md_elf_size; static struct proc_dir_entry *proc_rk_minidump; +static bool md_is_ddr_address_default(u64 phys_addr); +bool (*md_is_ddr_address)(u64 virt_addr) = md_is_ddr_address_default; /* Number of pending entries to be added in ToC regions */ static unsigned int pendings; @@ -168,6 +170,8 @@ shdr->sh_flags = SHF_WRITE; shdr->sh_offset = minidump_elfheader.elf_offset; shdr->sh_entsize = 0; + shdr->sh_addralign = shdr->sh_addr; /* backup */ + shdr->sh_entsize = entry->phys_addr; /* backup */ if (strstr((const char *)mdr->name, "note")) phdr->p_type = PT_NOTE; @@ -178,6 +182,7 @@ phdr->p_paddr = entry->phys_addr; phdr->p_filesz = phdr->p_memsz = mdr->region_size; phdr->p_flags = PF_R | PF_W; + phdr->p_align = phdr->p_paddr; /* backup */ minidump_elfheader.elf_offset += shdr->sh_size; mdr->md_valid = MD_REGION_VALID; minidump_table.md_ss_toc->ss_region_count++; @@ -210,6 +215,26 @@ } return 0; +} + +int md_is_in_the_region(u64 addr) +{ + struct md_region *mdr; + u32 entries; + int i; + + entries = minidump_table.num_regions; + + for (i = 0; i < entries; i++) { + mdr = &minidump_table.entry[i]; + if (mdr->virt_addr <= addr && addr < (mdr->virt_addr + mdr->size)) + break; + } + + if (i < entries) + return 1; + else + return 0; } int rk_minidump_update_region(int regno, const struct md_region *entry) @@ -254,8 +279,11 @@ phdr = elf_program(hdr, regno + 1); shdr->sh_addr = (elf_addr_t)entry->virt_addr; + shdr->sh_addralign = shdr->sh_addr; /* backup */ + shdr->sh_entsize = entry->phys_addr; /* backup */ phdr->p_vaddr = entry->virt_addr; phdr->p_paddr = entry->phys_addr; + phdr->p_align = phdr->p_paddr; /* backup */ err_unlock: read_unlock_irqrestore(&mdt_remove_lock, flags); @@ -595,6 +623,22 @@ .proc_read = rk_minidump_read_elf, }; +static bool md_is_ddr_address_rk3588(u64 phys_addr) +{ + /* peripheral address space */ + if (phys_addr >= 0xf0000000 && phys_addr < 0x100000000) + return false; + /* DDR is up to 32GB */ + if (phys_addr > 0x800000000) + return false; + return true; +} + +static bool md_is_ddr_address_default(u64 phys_addr) +{ + return true; +} + static int rk_minidump_driver_probe(struct platform_device *pdev) { unsigned int i; @@ -655,11 +699,17 @@ phdr = (Elf64_Phdr *)(md_elf_mem + (ulong)ehdr->e_phoff); phdr += ehdr->e_phnum - 1; md_elf_size = phdr->p_memsz + phdr->p_offset; - - pr_info("Create /proc/rk_md/minidump...\n"); + if (md_elf_size > r_size) + md_elf_size = r_size; + pr_info("Create /proc/rk_md/minidump, size:0x%llx...\n", md_elf_size); proc_rk_minidump = proc_create("minidump", 0400, base_dir, &rk_minidump_proc_ops); + } else { + pr_info("Create /proc/rk_md/minidump fail...\n"); } + if (of_machine_is_compatible("rockchip,rk3588")) + md_is_ddr_address = md_is_ddr_address_rk3588; + /* Check global minidump support initialization */ if (!md_global_toc->md_toc_init) { pr_err("System Minidump TOC not initialized\n"); -- Gitblit v1.6.2