aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch251
1 files changed, 251 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch
new file mode 100644
index 00000000..74f4fed2
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch
@@ -0,0 +1,251 @@
+From d6af0f1dc8fc9dbc056ce5e79750747f6d1ca300 Mon Sep 17 00:00:00 2001
+From: Tom Lendacky <thomas.lendacky@amd.com>
+Date: Fri, 20 Oct 2017 09:30:51 -0500
+Subject: [PATCH 50/95] resource: Provide resource struct in resource walk
+ callback
+
+In preperation for a new function that will need additional resource
+information during the resource walk, update the resource walk callback to
+pass the resource structure. Since the current callback start and end
+arguments are pulled from the resource structure, the callback functions
+can obtain them from the resource structure directly.
+
+Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
+Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Tested-by: Borislav Petkov <bp@suse.de>
+Cc: kvm@vger.kernel.org
+Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: linuxppc-dev@lists.ozlabs.org
+Link: https://lkml.kernel.org/r/20171020143059.3291-10-brijesh.singh@amd.com
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ arch/powerpc/kernel/machine_kexec_file_64.c | 12 +++++++++---
+ arch/x86/kernel/crash.c | 18 +++++++++---------
+ arch/x86/kernel/pmem.c | 2 +-
+ include/linux/ioport.h | 4 ++--
+ include/linux/kexec.h | 2 +-
+ kernel/kexec_file.c | 5 +++--
+ kernel/resource.c | 9 +++++----
+ 7 files changed, 30 insertions(+), 22 deletions(-)
+
+diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c
+index c66132b..45e0b7d 100644
+--- a/arch/powerpc/kernel/machine_kexec_file_64.c
++++ b/arch/powerpc/kernel/machine_kexec_file_64.c
+@@ -91,11 +91,13 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
+ * and that value will be returned. If all free regions are visited without
+ * func returning non-zero, then zero will be returned.
+ */
+-int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
++int arch_kexec_walk_mem(struct kexec_buf *kbuf,
++ int (*func)(struct resource *, void *))
+ {
+ int ret = 0;
+ u64 i;
+ phys_addr_t mstart, mend;
++ struct resource res = { };
+
+ if (kbuf->top_down) {
+ for_each_free_mem_range_reverse(i, NUMA_NO_NODE, 0,
+@@ -105,7 +107,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
+ * range while in kexec, end points to the last byte
+ * in the range.
+ */
+- ret = func(mstart, mend - 1, kbuf);
++ res.start = mstart;
++ res.end = mend - 1;
++ ret = func(&res, kbuf);
+ if (ret)
+ break;
+ }
+@@ -117,7 +121,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
+ * range while in kexec, end points to the last byte
+ * in the range.
+ */
+- ret = func(mstart, mend - 1, kbuf);
++ res.start = mstart;
++ res.end = mend - 1;
++ ret = func(&res, kbuf);
+ if (ret)
+ break;
+ }
+diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
+index 44404e2..815008c 100644
+--- a/arch/x86/kernel/crash.c
++++ b/arch/x86/kernel/crash.c
+@@ -209,7 +209,7 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
+ }
+
+ #ifdef CONFIG_KEXEC_FILE
+-static int get_nr_ram_ranges_callback(u64 start, u64 end, void *arg)
++static int get_nr_ram_ranges_callback(struct resource *res, void *arg)
+ {
+ unsigned int *nr_ranges = arg;
+
+@@ -342,7 +342,7 @@ static int elf_header_exclude_ranges(struct crash_elf_data *ced,
+ return ret;
+ }
+
+-static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg)
++static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg)
+ {
+ struct crash_elf_data *ced = arg;
+ Elf64_Ehdr *ehdr;
+@@ -355,7 +355,7 @@ static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg)
+ ehdr = ced->ehdr;
+
+ /* Exclude unwanted mem ranges */
+- ret = elf_header_exclude_ranges(ced, start, end);
++ ret = elf_header_exclude_ranges(ced, res->start, res->end);
+ if (ret)
+ return ret;
+
+@@ -518,14 +518,14 @@ static int add_e820_entry(struct boot_params *params, struct e820_entry *entry)
+ return 0;
+ }
+
+-static int memmap_entry_callback(u64 start, u64 end, void *arg)
++static int memmap_entry_callback(struct resource *res, void *arg)
+ {
+ struct crash_memmap_data *cmd = arg;
+ struct boot_params *params = cmd->params;
+ struct e820_entry ei;
+
+- ei.addr = start;
+- ei.size = end - start + 1;
++ ei.addr = res->start;
++ ei.size = res->end - res->start + 1;
+ ei.type = cmd->type;
+ add_e820_entry(params, &ei);
+
+@@ -619,12 +619,12 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params)
+ return ret;
+ }
+
+-static int determine_backup_region(u64 start, u64 end, void *arg)
++static int determine_backup_region(struct resource *res, void *arg)
+ {
+ struct kimage *image = arg;
+
+- image->arch.backup_src_start = start;
+- image->arch.backup_src_sz = end - start + 1;
++ image->arch.backup_src_start = res->start;
++ image->arch.backup_src_sz = res->end - res->start + 1;
+
+ /* Expecting only one range for backup region */
+ return 1;
+diff --git a/arch/x86/kernel/pmem.c b/arch/x86/kernel/pmem.c
+index 3fe6900..6b07faa 100644
+--- a/arch/x86/kernel/pmem.c
++++ b/arch/x86/kernel/pmem.c
+@@ -7,7 +7,7 @@
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+
+-static int found(u64 start, u64 end, void *data)
++static int found(struct resource *res, void *data)
+ {
+ return 1;
+ }
+diff --git a/include/linux/ioport.h b/include/linux/ioport.h
+index 83c8d65..c0070d7 100644
+--- a/include/linux/ioport.h
++++ b/include/linux/ioport.h
+@@ -272,10 +272,10 @@ walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
+ void *arg, int (*func)(unsigned long, unsigned long, void *));
+ extern int
+ walk_system_ram_res(u64 start, u64 end, void *arg,
+- int (*func)(u64, u64, void *));
++ int (*func)(struct resource *, void *));
+ extern int
+ walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end,
+- void *arg, int (*func)(u64, u64, void *));
++ void *arg, int (*func)(struct resource *, void *));
+
+ /* True if any part of r1 overlaps r2 */
+ static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
+diff --git a/include/linux/kexec.h b/include/linux/kexec.h
+index 1c08c92..f16f6ce 100644
+--- a/include/linux/kexec.h
++++ b/include/linux/kexec.h
+@@ -160,7 +160,7 @@ struct kexec_buf {
+ };
+
+ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
+- int (*func)(u64, u64, void *));
++ int (*func)(struct resource *, void *));
+ extern int kexec_add_buffer(struct kexec_buf *kbuf);
+ int kexec_locate_mem_hole(struct kexec_buf *kbuf);
+ #endif /* CONFIG_KEXEC_FILE */
+diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
+index 9f48f44..e5bcd94 100644
+--- a/kernel/kexec_file.c
++++ b/kernel/kexec_file.c
+@@ -406,9 +406,10 @@ static int locate_mem_hole_bottom_up(unsigned long start, unsigned long end,
+ return 1;
+ }
+
+-static int locate_mem_hole_callback(u64 start, u64 end, void *arg)
++static int locate_mem_hole_callback(struct resource *res, void *arg)
+ {
+ struct kexec_buf *kbuf = (struct kexec_buf *)arg;
++ u64 start = res->start, end = res->end;
+ unsigned long sz = end - start + 1;
+
+ /* Returning 0 will take to next memory range */
+@@ -437,7 +438,7 @@ static int locate_mem_hole_callback(u64 start, u64 end, void *arg)
+ * func returning non-zero, then zero will be returned.
+ */
+ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
+- int (*func)(u64, u64, void *))
++ int (*func)(struct resource *, void *))
+ {
+ if (kbuf->image->type == KEXEC_TYPE_CRASH)
+ return walk_iomem_res_desc(crashk_res.desc,
+diff --git a/kernel/resource.c b/kernel/resource.c
+index 1260f30..78cae82 100644
+--- a/kernel/resource.c
++++ b/kernel/resource.c
+@@ -402,14 +402,15 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
+
+ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc,
+ bool first_level_children_only,
+- void *arg, int (*func)(u64, u64, void *))
++ void *arg,
++ int (*func)(struct resource *, void *))
+ {
+ u64 orig_end = res->end;
+ int ret = -1;
+
+ while ((res->start < res->end) &&
+ !find_next_iomem_res(res, desc, first_level_children_only)) {
+- ret = (*func)(res->start, res->end, arg);
++ ret = (*func)(res, arg);
+ if (ret)
+ break;
+
+@@ -435,7 +436,7 @@ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc,
+ * <linux/ioport.h> and set it in 'desc' of a target resource entry.
+ */
+ int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
+- u64 end, void *arg, int (*func)(u64, u64, void *))
++ u64 end, void *arg, int (*func)(struct resource *, void *))
+ {
+ struct resource res;
+
+@@ -454,7 +455,7 @@ int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
+ * ranges.
+ */
+ int walk_system_ram_res(u64 start, u64 end, void *arg,
+- int (*func)(u64, u64, void *))
++ int (*func)(struct resource *, void *))
+ {
+ struct resource res;
+
+--
+2.7.4
+