From patchwork Thu Jul 13 03:12:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Yan X-Patchwork-Id: 787655 X-Patchwork-Delegate: philipp.tomsich@theobroma-systems.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3x7Xpb1LbXz9s2s for ; Thu, 13 Jul 2017 20:57:43 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id D6518C21DEA; Thu, 13 Jul 2017 10:57:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=KHOP_BIG_TO_CC, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 15021C21DD6; Thu, 13 Jul 2017 10:57:02 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5B677C21C51; Thu, 13 Jul 2017 03:12:58 +0000 (UTC) Received: from regular1.263xmail.com (regular1.263xmail.com [211.150.99.136]) by lists.denx.de (Postfix) with ESMTPS id AB3FCC21C35 for ; Thu, 13 Jul 2017 03:12:56 +0000 (UTC) Received: from andy.yan?rock-chips.com (unknown [192.168.167.190]) by regular1.263xmail.com (Postfix) with ESMTP id E0DE397; Thu, 13 Jul 2017 11:12:52 +0800 (CST) X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.263.net (Postfix) with ESMTPA id ECCD6362; Thu, 13 Jul 2017 11:12:46 +0800 (CST) X-RL-SENDER: andy.yan@rock-chips.com X-FST-TO: sjg@chromium.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: andy.yan@rock-chips.com X-UNIQUE-TAG: <36d8ded8aaba0cb4ccf651873868f87b> X-ATTACHMENT-NUM: 0 X-SENDER: yxj@rock-chips.com X-DNS-TYPE: 0 Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.263.net (Postfix) whith ESMTP id 86186JKW9V; Thu, 13 Jul 2017 11:12:51 +0800 (CST) From: Andy Yan To: sjg@chromium.org, trini@konsulko.com, philipp.tomsich@theobroma-systems.com Date: Thu, 13 Jul 2017 11:12:29 +0800 Message-Id: <1499915549-22563-1-git-send-email-andy.yan@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1499915475-22504-1-git-send-email-andy.yan@rock-chips.com> References: <1499915475-22504-1-git-send-email-andy.yan@rock-chips.com> X-Mailman-Approved-At: Thu, 13 Jul 2017 10:56:59 +0000 Cc: pantelis.antoniou@konsulko.com, michal.simek@xilinx.com, u-boot@lists.denx.de, afleming@gmail.com, sr@denx.de, galak@kernel.crashing.org, stefan.agner@toradex.com, andre.przywara@arm.com, kim.phillips@freescale.com, andriy.shevchenko@linux.intel.com, jagan@openedev.com, Andy Yan Subject: [U-Boot] [PATCH v2 1/9] make SPL and normal u-boot stage use independent SYS_MALLOC_F_LEN X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Some platforms has very small sram to run spl code, so it has no enough sapce for so much malloc pool before relocation in spl stage as the normal u-boot stake. Make spl and normal u-boot stage use independent SYS_MALLOC_F_LEN, Then people can sets the pre-relocation malloc pool according to the memory space indepently. Signed-off-by: Andy Yan Reviewed-by: Tom Rini --- Changes in v2: - introduce a new control CONFIG_SPL_SYS_MALLOC_F_LEN, adviced by Simon Kconfig | 10 ++++++++++ arch/sandbox/cpu/start.c | 2 +- cmd/bdinfo.c | 2 +- common/Makefile | 2 +- common/board_f.c | 4 ++-- common/board_r.c | 2 +- common/dlmalloc.c | 12 ++++++------ common/init/board_init.c | 4 ++-- common/spl/spl.c | 6 +++--- drivers/core/Kconfig | 8 ++++---- drivers/serial/serial-uclass.c | 4 ++-- include/asm-generic/global_data.h | 2 +- include/common.h | 11 +++++++++++ lib/asm-offsets.c | 2 +- lib/efi/efi_app.c | 2 +- 15 files changed, 47 insertions(+), 26 deletions(-) diff --git a/Kconfig b/Kconfig index bb80ada..c1451bc 100644 --- a/Kconfig +++ b/Kconfig @@ -95,6 +95,16 @@ config SYS_MALLOC_F_LEN particular needs this to operate, so that it can allocate the initial serial device and any others that are needed. +config SPL_SYS_MALLOC_F_LEN + hex "Size of malloc() pool in spl before relocation" + depends on SYS_MALLOC_F + default SYS_MALLOC_F_LEN + help + Before relocation, memory is very limited on many platforms. Still, + we can provide a small malloc() pool if needed. Driver model in + particular needs this to operate, so that it can allocate the + initial serial device and any others that are needed. + menuconfig EXPERT bool "Configure standard U-Boot features (expert users)" default y diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c index f605d4d..17e531a 100644 --- a/arch/sandbox/cpu/start.c +++ b/arch/sandbox/cpu/start.c @@ -310,7 +310,7 @@ int main(int argc, char *argv[]) memset(&data, '\0', sizeof(data)); gd = &data; -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F gd->malloc_base = CONFIG_MALLOC_F_ADDR; #endif setup_ram_buf(state); diff --git a/cmd/bdinfo.c b/cmd/bdinfo.c index 8971697..64836e9 100644 --- a/cmd/bdinfo.c +++ b/cmd/bdinfo.c @@ -346,7 +346,7 @@ static int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, #endif #ifdef CONFIG_SYS_MALLOC_F printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr, - CONFIG_SYS_MALLOC_F_LEN); + get_sys_malloc_f_len()); #endif if (gd->fdt_blob) printf("fdt_blob = %p\n", gd->fdt_blob); diff --git a/common/Makefile b/common/Makefile index 17a92ea..29c880d 100644 --- a/common/Makefile +++ b/common/Makefile @@ -139,7 +139,7 @@ obj-y += console.o endif obj-$(CONFIG_CROS_EC) += cros_ec.o obj-y += dlmalloc.o -ifdef CONFIG_SYS_MALLOC_F_LEN +ifdef CONFIG_SYS_MALLOC_F obj-y += malloc_simple.o endif obj-y += image.o diff --git a/common/board_f.c b/common/board_f.c index ffa84e3..82dae70 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -727,7 +727,7 @@ static int initf_bootstage(void) static int initf_console_record(void) { -#if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F_LEN) +#if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F) return console_record_init(); #else return 0; @@ -736,7 +736,7 @@ static int initf_console_record(void) static int initf_dm(void) { -#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN) +#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F) int ret; bootstage_start(BOOTSTATE_ID_ACCUM_DM_F, "dm_f"); diff --git a/common/board_r.c b/common/board_r.c index ecca1ed..e7d4010 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -256,7 +256,7 @@ static int initr_malloc(void) { ulong malloc_start; -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr, gd->malloc_ptr / 1024); #endif diff --git a/common/dlmalloc.c b/common/dlmalloc.c index fc1e8b3..d19c3e1 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -1254,7 +1254,7 @@ Void_t* mALLOc(bytes) size_t bytes; INTERNAL_SIZE_T nb; -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) return malloc_simple(bytes); #endif @@ -1522,7 +1522,7 @@ void fREe(mem) Void_t* mem; mchunkptr fwd; /* misc temp for linking */ int islr; /* track whether merging with last_remainder */ -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F /* free() is a no-op - all the memory will be freed on relocation */ if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) return; @@ -1679,7 +1679,7 @@ Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes; /* realloc of null is supposed to be same as malloc */ if (oldmem == NULL) return mALLOc(bytes); -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) { /* This is harder to support and should not be needed */ panic("pre-reloc realloc() is not supported"); @@ -2074,7 +2074,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size; return NULL; else { -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) { MALLOC_ZERO(mem, sz); return mem; @@ -2375,9 +2375,9 @@ int mALLOPt(param_number, value) int param_number; int value; int initf_malloc(void) { -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F assert(gd->malloc_base); /* Set up by crt0.S */ - gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; + gd->malloc_limit = get_sys_malloc_f_len(); gd->malloc_ptr = 0; #endif diff --git a/common/init/board_init.c b/common/init/board_init.c index bf4255b..7698558 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -47,7 +47,7 @@ ulong board_init_f_alloc_reserve(ulong top) { /* Reserve early malloc arena */ #if defined(CONFIG_SYS_MALLOC_F) - top -= CONFIG_SYS_MALLOC_F_LEN; + top -= get_sys_malloc_f_len(); #endif /* LAST : reserve GD (rounded up to a multiple of 16 bytes) */ top = rounddown(top-sizeof(struct global_data), 16); @@ -125,7 +125,7 @@ void board_init_f_init_reserve(ulong base) /* go down one 'early malloc arena' */ gd->malloc_base = base; /* next alloc will be higher by one 'early malloc arena' size */ - base += CONFIG_SYS_MALLOC_F_LEN; + base += get_sys_malloc_f_len(); #endif } diff --git a/common/spl/spl.c b/common/spl/spl.c index 7f3fd92..006ed02 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -220,12 +220,12 @@ static int spl_common_init(bool setup_malloc) debug("spl_early_init()\n"); -#if defined(CONFIG_SYS_MALLOC_F_LEN) +#if defined(CONFIG_SYS_MALLOC_F) if (setup_malloc) { #ifdef CONFIG_MALLOC_F_ADDR gd->malloc_base = CONFIG_MALLOC_F_ADDR; #endif - gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; + gd->malloc_limit = get_sys_malloc_f_len(); gd->malloc_ptr = 0; } #endif @@ -419,7 +419,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2) default: debug("Unsupported OS image.. Jumping nevertheless..\n"); } -#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE) +#if defined(CONFIG_SYS_MALLOC_F) && !defined(CONFIG_SYS_SPL_MALLOC_SIZE) debug("SPL malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr, gd->malloc_ptr / 1024); #endif diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig index fb5c4e8..f8b19a4 100644 --- a/drivers/core/Kconfig +++ b/drivers/core/Kconfig @@ -16,10 +16,10 @@ config SPL_DM suitable malloc() implementation. If you are not using the full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START, consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you - must provide CONFIG_SYS_MALLOC_F_LEN to set the size. + must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size. In most cases driver model will only allocate a few uclasses and devices in SPL, so 1KB should be enable. See - CONFIG_SYS_MALLOC_F_LEN for more details on how to enable it. + CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it. config TPL_DM bool "Enable Driver Model for TPL" @@ -29,10 +29,10 @@ config TPL_DM suitable malloc() implementation. If you are not using the full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START, consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you - must provide CONFIG_SYS_MALLOC_F_LEN to set the size. + must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size. In most cases driver model will only allocate a few uclasses and devices in SPL, so 1KB should be enough. See - CONFIG_SYS_MALLOC_F_LEN for more details on how to enable it. + CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it. Disable this for very small implementations. config DM_WARN diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index f360534..8d63b05 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -23,8 +23,8 @@ DECLARE_GLOBAL_DATA_PTR; */ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE; -#ifndef CONFIG_SYS_MALLOC_F_LEN -#error "Serial is required before relocation - define CONFIG_SYS_MALLOC_F_LEN to make this work" +#ifndef CONFIG_SYS_MALLOC_F +#error "Serial is required before relocation - define CONFIG_$(SPL_)SYS_MALLOC_F_LEN to make this work" #endif static int serial_check_stdout(const void *blob, struct udevice **devp) diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index fb90be9..cf3e12a 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -88,7 +88,7 @@ typedef struct global_data { #endif unsigned int timebase_h; unsigned int timebase_l; -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F unsigned long malloc_base; /* base address of early malloc() */ unsigned long malloc_limit; /* limit address */ unsigned long malloc_ptr; /* current address */ diff --git a/include/common.h b/include/common.h index 751665f..afba422 100644 --- a/include/common.h +++ b/include/common.h @@ -717,6 +717,17 @@ int cpu_disable(int nr); int cpu_release(int nr, int argc, char * const argv[]); #endif +#if defined(CONFIG_SYS_MALLOC_F) +static inline int get_sys_malloc_f_len(void) +{ +#if defined(CONFIG_SPL_BUILD) + return CONFIG_SPL_SYS_MALLOC_F_LEN; +#else + return CONFIG_SYS_MALLOC_F_LEN; +#endif +} +#endif + #else /* __ASSEMBLY__ */ /* Drop a C type modifier (like in 3UL) for constants used in assembly. */ diff --git a/lib/asm-offsets.c b/lib/asm-offsets.c index 221ebbf..a65df59 100644 --- a/lib/asm-offsets.c +++ b/lib/asm-offsets.c @@ -28,7 +28,7 @@ int main(void) DEFINE(GD_SIZE, sizeof(struct global_data)); DEFINE(GD_BD, offsetof(struct global_data, bd)); -#ifdef CONFIG_SYS_MALLOC_F_LEN +#ifdef CONFIG_SYS_MALLOC_F DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base)); #endif diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c index 452ab5d..89bbc1b 100644 --- a/lib/efi/efi_app.c +++ b/lib/efi/efi_app.c @@ -48,7 +48,7 @@ static efi_status_t setup_memory(struct efi_priv *priv) return ret; memset(gd, '\0', sizeof(*gd)); - gd->malloc_base = (ulong)efi_malloc(priv, CONFIG_SYS_MALLOC_F_LEN, + gd->malloc_base = (ulong)efi_malloc(priv, get_sys_malloc_f_len(), &ret); if (!gd->malloc_base) return ret;