From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek =?ISO-8859-1?Q?Beh=FAn?= Date: Tue, 11 Dec 2018 14:59:22 +0100 Subject: [U-Boot] [PATCH u-boot-marvell v3 09/10] board: turris_mox: Support 1 GB version of Turris Mox In-Reply-To: <2bcc7dc7-5c60-1e5d-95e5-49e6b95fa87a@denx.de> References: <20181120120409.12822-1-marek.behun@nic.cz> <20181120120409.12822-9-marek.behun@nic.cz> <2bcc7dc7-5c60-1e5d-95e5-49e6b95fa87a@denx.de> Message-ID: <20181211145922.6333d170@dellmb.labs.office.nic.cz> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: u-boot@lists.denx.de Hi Stefan, get_ram_size does not work correctly on Mox. On a 512 MiB board it detects 1024 MiB of RAM, because on the 512 MiB RAM chip the topmost address bit is simply ignored and the RAM wraps - on 0x20000000-0x40000000 CPU sees the same data as on 0x0-0x20000000. ATF does not run RAM size determining code either, it just gets RAM size from a register, this register is written before ATF by BootROM and we have done it so that there is always 1 GB so that we could use same secure firmware image for all Moxes. I tried to change this register in secure firmware, but this lead to Synchornous Abort events in U-Boot. Maybe we could move the dram_init funcitons from arm64-common.c to specific board files, or maybe we could declare them __weak in arm64-common.c and turris_mox can then redefine them. Would that be OK with you? Marek On Thu, 29 Nov 2018 14:07:59 +0100 Stefan Roese wrote: > On 20.11.18 13:04, Marek Behún wrote: > > Depending on the data in the OTP memory, differentiate between the > > 512 MiB and 1 GiB versions of Turris Mox and report these RAM sizes > > in dram_init and dram_init_banksize. > > > > Signed-off-by: Marek Behún > > --- > > arch/arm/mach-mvebu/arm64-common.c | 7 ++++++- > > board/CZ.NIC/turris_mox/turris_mox.c | 27 > > +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 > > deletion(-) > > > > diff --git a/arch/arm/mach-mvebu/arm64-common.c > > b/arch/arm/mach-mvebu/arm64-common.c index f47273fde9..5e6ac9fc4a > > 100644 --- a/arch/arm/mach-mvebu/arm64-common.c > > +++ b/arch/arm/mach-mvebu/arm64-common.c > > @@ -43,8 +43,12 @@ const struct mbus_dram_target_info > > *mvebu_mbus_dram_info(void) return NULL; > > } > > > > -/* DRAM init code ... */ > > +/* > > + * DRAM init code ... > > + * Turris Mox defines this itself, depending on data in burned > > eFuses > > + */ > > > > +#ifndef CONFIG_TARGET_TURRIS_MOX > > int dram_init_banksize(void) > > { > > fdtdec_setup_memory_banksize(); > > @@ -59,6 +63,7 @@ int dram_init(void) > > > > return 0; > > } > > +#endif /* !CONFIG_TARGET_TURRIS_MOX */ > > 2 Problems with this: > > a) > This does not apply any more with the latest changes in mainline. > > b) > I really don't like #ifdef's here in this common code. Can you not > get rid of this somehow? Isn't the turris_mox also using ATF and > will read the RAM size from there? > > U-Boot still has the good old get_ram_size() function, which can > easily auto-detect 512MiB vs 1GiB when run with 1GiB as parameter. > > Thanks, > Stefan > > > > > int arch_cpu_init(void) > > { > > diff --git a/board/CZ.NIC/turris_mox/turris_mox.c > > b/board/CZ.NIC/turris_mox/turris_mox.c index 89b3cd2ce0..9aa2fc004d > > 100644 --- a/board/CZ.NIC/turris_mox/turris_mox.c > > +++ b/board/CZ.NIC/turris_mox/turris_mox.c > > @@ -14,6 +14,7 @@ > > #include > > #include > > #include > > +#include > > > > #ifdef CONFIG_WDT_ARMADA_37XX > > #include > > @@ -40,6 +41,32 @@ > > > > DECLARE_GLOBAL_DATA_PTR; > > > > +int dram_init(void) > > +{ > > + int ret, ram_size; > > + > > + gd->ram_base = 0; > > + gd->ram_size = (phys_size_t)0x20000000; > > + > > + ret = mbox_sp_get_board_info(NULL, NULL, NULL, NULL, > > &ram_size); > > + if (ret < 0) { > > + puts("Cannot read RAM size from OTP, defaulting to > > 512 MiB"); > > + } else { > > + if (ram_size == 1024) > > + gd->ram_size = (phys_size_t)0x40000000; > > + } > > + > > + return 0; > > +} > > + > > +int dram_init_banksize(void) > > +{ > > + gd->bd->bi_dram[0].start = (phys_addr_t)0; > > + gd->bd->bi_dram[0].size = gd->ram_size; > > + > > + return 0; > > +} > > + > > #if defined(CONFIG_OF_BOARD_FIXUP) > > int board_fix_fdt(void *blob) > > { > > > > Viele Grüße, > Stefan >