From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935910AbbCDIBk (ORCPT ); Wed, 4 Mar 2015 03:01:40 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:42624 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935885AbbCDIBg (ORCPT ); Wed, 4 Mar 2015 03:01:36 -0500 From: Yinghai Lu To: Matt Fleming , "H. Peter Anvin" , Bjorn Helgaas Cc: Thomas Gleixner , Ingo Molnar , Jiri Kosina , Borislav Petkov , Baoquan He , linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org, linux-pci@vger.kernel.org, Yinghai Lu , Rob Herring , David Vrabel Subject: [PATCH v2 10/15] x86, of: let add_dtb reserve by itself Date: Wed, 4 Mar 2015 00:00:43 -0800 Message-Id: <1425456048-16236-11-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1425456048-16236-1-git-send-email-yinghai@kernel.org> References: <1425456048-16236-1-git-send-email-yinghai@kernel.org> X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We will not reserve setup_data in general code. Every handler need to reserve and copy. Current dtd handling already have code copying, just add reserve code ... also simplify code a bit with storing real dtb size. Cc: Rob Herring Cc: David Vrabel Signed-off-by: Yinghai Lu --- arch/x86/include/asm/prom.h | 9 ++++++--- arch/x86/kernel/devicetree.c | 39 +++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h index 1d081ac..fb716eddc 100644 --- a/arch/x86/include/asm/prom.h +++ b/arch/x86/include/asm/prom.h @@ -24,17 +24,20 @@ #ifdef CONFIG_OF extern int of_ioapic; -extern u64 initial_dtb; -extern void add_dtb(u64 data); void x86_of_pci_init(void); void x86_dtb_init(void); #else -static inline void add_dtb(u64 data) { } static inline void x86_of_pci_init(void) { } static inline void x86_dtb_init(void) { } #define of_ioapic 0 #endif +#ifdef CONFIG_OF_FLATTREE +extern void add_dtb(u64 data); +#else +static inline void add_dtb(u64 data) { } +#endif + extern char cmd_line[COMMAND_LINE_SIZE]; #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 3d35033..cc2fb61 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c @@ -2,6 +2,7 @@ * Architecture specific OF callbacks. */ #include +#include #include #include #include @@ -23,7 +24,6 @@ #include #include -__initdata u64 initial_dtb; char __initdata cmd_line[COMMAND_LINE_SIZE]; int __initdata of_ioapic; @@ -43,11 +43,23 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); } +#ifdef CONFIG_OF_FLATTREE +static u64 initial_dtb __initdata; +static u32 initial_dtb_size __initdata; void __init add_dtb(u64 data) { + u32 map_len; + initial_dtb = data + offsetof(struct setup_data, data); -} + map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), (u64)128); + initial_boot_params = early_memremap(initial_dtb, map_len); + initial_dtb_size = of_get_flat_dt_size(); + early_memunmap(initial_boot_params, map_len); + initial_boot_params = NULL; + memblock_reserve(initial_dtb, initial_dtb_size); +} +#endif /* * CE4100 ids. Will be moved to machine_device_initcall() once we have it. */ @@ -272,31 +284,22 @@ static void __init dtb_apic_setup(void) dtb_ioapic_setup(); } -#ifdef CONFIG_OF_FLATTREE static void __init x86_flattree_get_config(void) { - u32 size, map_len; +#ifdef CONFIG_OF_FLATTREE void *dt; if (!initial_dtb) return; - map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), (u64)128); - - initial_boot_params = dt = early_memremap(initial_dtb, map_len); - size = of_get_flat_dt_size(); - if (map_len < size) { - early_iounmap(dt, map_len); - initial_boot_params = dt = early_memremap(initial_dtb, size); - map_len = size; - } - + initial_boot_params = dt = early_memremap(initial_dtb, + initial_dtb_size); unflatten_and_copy_device_tree(); - early_iounmap(dt, map_len); -} -#else -static inline void x86_flattree_get_config(void) { } + early_memunmap(dt, initial_dtb_size); + + memblock_free(initial_dtb, initial_dtb_size); #endif +} void __init x86_dtb_init(void) { -- 1.8.4.5