From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2401C433DF for ; Tue, 7 Jul 2020 06:52:13 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5E2A4206E9 for ; Tue, 7 Jul 2020 06:52:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="bsO0CIdp"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="reF32Z3u" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5E2A4206E9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=JfZb75wsLSwhfG9NQpWcyNXW6+Qb2x7U0ldyH5SdOXg=; b=bsO0CIdpiiiCTQ2TMMWHMRn1B vKoRDETY9WHqMIRXcxo6HgygtH3VD6BRxrzVzRX/rFkGbwMBlskrxn92fUy5tqnm4p0epToPFFLzo QUeyJFUveUYm8m0ez1QQjoECwHAT5hxzf05T+oCgVxuwDzVODiwJ2MjYbYLvMOpjwtmT0sjSmvE7Y H5wNzzsC7o7EOnCitVn57QUc571TY+5zLibWUVR7rgHYlAblJfQoQ2k65MKiGipSA8Q+8RGcYj5uu d5qmLWgWQX01KphwsIQtd1/kiYPqUUX+sUvnNLUNMUoqfAKd6Ow+bb2WmAtKp1Cn6MIn2WyyqjLif qRiPdVGyA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jshRF-0007rt-Gv; Tue, 07 Jul 2020 06:50:45 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jshRC-0007qs-FI for linux-arm-kernel@lists.infradead.org; Tue, 07 Jul 2020 06:50:43 +0000 Received: from mail-ot1-f43.google.com (mail-ot1-f43.google.com [209.85.210.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7572020702 for ; Tue, 7 Jul 2020 06:50:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1594104641; bh=GffjWrcd1WsRtPJ1h392se8rKoI280AVRqQ5U/fEgN4=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=reF32Z3uuaEirhi6nhZQssflBUEw1sWpj+yp98c6Gq20iFrAP9zT0IOryKe6AScPf VYm6GBNYZFHohyG7H6aDLYdr/N57OJ50ZJ+cLbk2LL+I9wC6h8GSvo8ss5eKS4k/O5 eeS7HAz9QbdijCBxL/5J/98be6/gelkWxa4E6AOU= Received: by mail-ot1-f43.google.com with SMTP id 18so33532789otv.6 for ; Mon, 06 Jul 2020 23:50:41 -0700 (PDT) X-Gm-Message-State: AOAM532P55uvFg+89SNoTprNdlhL6heHXeYNVEigwhxc/fPB+ZVWngGT /nkz8XOHZsig56AxZp23bByJQk0D5KC3zNAye+0= X-Google-Smtp-Source: ABdhPJzcW6c4D5BV5/WImqzsglpaC24OUWDn2mk4Cqw1pzwmFFilNzT0IecbC+gHNuuuy5s8VbcoV4kFhdi27oeAfhs= X-Received: by 2002:a9d:6e85:: with SMTP id a5mr3979353otr.90.1594104640735; Mon, 06 Jul 2020 23:50:40 -0700 (PDT) MIME-Version: 1.0 References: <20200706150205.22053-1-geert+renesas@glider.be> In-Reply-To: <20200706150205.22053-1-geert+renesas@glider.be> From: Ard Biesheuvel Date: Tue, 7 Jul 2020 09:50:29 +0300 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH/RFC v7] ARM: boot: Obtain start of physical memory from DTB To: Geert Uytterhoeven X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200707_025042_657708_1AC91A35 X-CRM114-Status: GOOD ( 39.65 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Arnd Bergmann , Nicolas Pitre , Masahiro Yamada , Lukasz Stelmach , Russell King , Linux-Renesas , Chris Brandt , =?UTF-8?Q?Uwe_Kleine=2DK=C3=B6nig?= , Eric Miao , Dmitry Osipenko , Linux ARM , Marek Szyprowski Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, 6 Jul 2020 at 18:02, Geert Uytterhoeven wrote: > > Currently, the start address of physical memory is obtained by masking > the program counter with a fixed mask of 0xf8000000. This mask value > was chosen as a balance between the requirements of different platforms. > However, this does require that the start address of physical memory is > a multiple of 128 MiB, precluding booting Linux on platforms where this > requirement is not fulfilled. > > Fix this limitation by obtaining the start address from the DTB instead, > if available (either explicitly passed, or appended to the kernel). > Fall back to the traditional method when needed. > > This allows to boot Linux on r7s9210/rza2mevb using the 64 MiB of SDRAM > on the RZA2MEVB sub board, which is located at 0x0C000000 (CS3 space), > i.e. not at a multiple of 128 MiB. > > Suggested-by: Nicolas Pitre > Signed-off-by: Geert Uytterhoeven > Reviewed-by: Nicolas Pitre > Reviewed-by: Ard Biesheuvel > Tested-by: Marek Szyprowski > Tested-by: Dmitry Osipenko > Cc: Lukasz Stelmach > --- > Marked as RFC, because: > 1. This is known to break crashkernel support, as the memory used by > the crashkernel is not marked reserved in DT (yet), > 2. Russell won't apply this for v5.9 anyway, > Would it help if we make this behavior dependent on a simple heuristic, e.g., if (round_up(load_address, 128M) >= dram_end) use dram_start from DT else use round_up(load_address, 128M) That way, the fix is guaranteed to only take effect for systems that cannot even boot otherwise, which fixes the crashkernel case, as well as other potential regressions due to the load address of the core kernel changing for existing boards. > v7: > - Rebase on top of commits 161e04a5bae58a65 ("ARM: decompressor: split > off _edata and stack base into separate object") and > c7c06b8843c0aa65 ("kbuild: remove cc-option test of > -fno-stack-protector") in next-20200706. > > v6: > - Rebase on top of commit 7ae4a78daacf240a ("ARM: 8969/1: > decompressor: simplify libfdt builds"), > - Include instead of , > > v5: > - Add Tested-by, Reviewed-by, > - Round up start of memory to satisfy 16 MiB alignment rule, > > v4: > - Fix stack location after commit 184bf653a7a452c1 ("ARM: > decompressor: factor out routine to obtain the inflated image > size"), > > v3: > - Add Reviewed-by, > - Fix ATAGs with appended DTB, > - Add Tested-by, > > v2: > - Use "cmp r0, #-1", instead of "cmn r0, #1", > - Add missing stack setup, > - Support appended DTB. > --- > arch/arm/boot/compressed/Makefile | 5 +- > arch/arm/boot/compressed/fdt_get_mem_start.c | 56 ++++++++++++++++++++ > arch/arm/boot/compressed/head.S | 52 +++++++++++++++++- > 3 files changed, 111 insertions(+), 2 deletions(-) > create mode 100644 arch/arm/boot/compressed/fdt_get_mem_start.c > > diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile > index b1147b7f2c8d372e..b1c09faf276e9193 100644 > --- a/arch/arm/boot/compressed/Makefile > +++ b/arch/arm/boot/compressed/Makefile > @@ -81,10 +81,13 @@ libfdt_objs := fdt_rw.o fdt_ro.o fdt_wip.o fdt.o > ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y) > OBJS += $(libfdt_objs) atags_to_fdt.o > endif > +ifeq ($(CONFIG_USE_OF),y) > +OBJS += $(libfdt_objs) fdt_get_mem_start.o > +endif > > # -fstack-protector-strong triggers protection checks in this code, > # but it is being used too early to link to meaningful stack_chk logic. > -$(foreach o, $(libfdt_objs) atags_to_fdt.o, \ > +$(foreach o, $(libfdt_objs) atags_to_fdt.o fdt_get_mem_start.o, \ > $(eval CFLAGS_$(o) := -I $(srctree)/scripts/dtc/libfdt -fno-stack-protector)) > > # These were previously generated C files. When you are building the kernel > diff --git a/arch/arm/boot/compressed/fdt_get_mem_start.c b/arch/arm/boot/compressed/fdt_get_mem_start.c > new file mode 100644 > index 0000000000000000..ae71fde731b869d7 > --- /dev/null > +++ b/arch/arm/boot/compressed/fdt_get_mem_start.c > @@ -0,0 +1,56 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include > +#include > +#include > + > +static const void *getprop(const void *fdt, const char *node_path, > + const char *property) > +{ > + int offset = fdt_path_offset(fdt, node_path); > + > + if (offset == -FDT_ERR_NOTFOUND) > + return NULL; > + > + return fdt_getprop(fdt, offset, property, NULL); > +} > + > +static uint32_t get_addr_size(const void *fdt) > +{ > + const __be32 *addr_len = getprop(fdt, "/", "#address-cells"); > + > + if (!addr_len) { > + /* default */ > + return 1; > + } > + > + return fdt32_to_cpu(*addr_len); > +} > + > +/* > + * Get the start of physical memory > + */ > + > +unsigned long fdt_get_mem_start(const void *fdt) > +{ > + uint32_t addr_size, mem_start; > + const __be32 *memory; > + > + if (!fdt) > + return -1; > + > + if (*(__be32 *)fdt != cpu_to_fdt32(FDT_MAGIC)) > + return -1; > + > + /* Find the first memory node */ > + memory = getprop(fdt, "/memory", "reg"); > + if (!memory) > + return -1; > + > + /* There may be multiple cells on LPAE platforms */ > + addr_size = get_addr_size(fdt); > + > + mem_start = fdt32_to_cpu(memory[addr_size - 1]); > + /* Must be a multiple of 16 MiB for phys/virt patching */ > + return round_up(mem_start, SZ_16M); > +} > diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S > index 434a16982e344fe4..802621756ac0480b 100644 > --- a/arch/arm/boot/compressed/head.S > +++ b/arch/arm/boot/compressed/head.S > @@ -254,8 +254,56 @@ not_angel: > .text > > #ifdef CONFIG_AUTO_ZRELADDR > +#ifdef CONFIG_USE_OF > /* > - * Find the start of physical memory. As we are executing > + * Find the start of physical memory. > + * Try the DTB first, if available. > + */ > + adr r0, LC1 > + ldr sp, [r0] @ get stack location > + add sp, sp, r0 @ apply relocation > + > +#ifdef CONFIG_ARM_APPENDED_DTB > + /* > + * Look for an appended DTB. If found, use it and > + * move stack away from it. > + */ > + ldr r6, [r0, #4] @ get &_edata > + add r6, r6, r0 @ relocate it > + ldmia r6, {r0, r5} @ get DTB signature and size > +#ifndef __ARMEB__ > + ldr r1, =0xedfe0dd0 @ sig is 0xd00dfeed big endian > + /* convert DTB size to little endian */ > + eor r2, r5, r5, ror #16 > + bic r2, r2, #0x00ff0000 > + mov r5, r5, ror #8 > + eor r5, r5, r2, lsr #8 > +#else > + ldr r1, =0xd00dfeed > +#endif > + cmp r0, r1 @ do we have a DTB there? > + bne 1f > + > + /* preserve 64-bit alignment */ > + add r5, r5, #7 > + bic r5, r5, #7 > + add sp, sp, r5 @ if so, move stack above DTB > + mov r0, r6 @ and extract memory start from DTB > + b 2f > + > +1: > +#endif /* CONFIG_ARM_APPENDED_DTB */ > + > + mov r0, r8 > +2: > + bl fdt_get_mem_start > + mov r4, r0 > + cmp r0, #-1 > + bne 1f > +#endif /* CONFIG_USE_OF */ > + > + /* > + * Fall back to the traditional method. As we are executing > * without the MMU on, we are in the physical address space. > * We just need to get rid of any offset by aligning the > * address. > @@ -273,6 +321,8 @@ not_angel: > */ > mov r4, pc > and r4, r4, #0xf8000000 > + > +1: > /* Determine final kernel image address. */ > add r4, r4, #TEXT_OFFSET > #else > -- > 2.17.1 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel