From patchwork Tue Jan 23 20:16:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 125584 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp1985615ljf; Tue, 23 Jan 2018 12:26:59 -0800 (PST) X-Google-Smtp-Source: AH8x226XGQEQkAVfRtcLjRURx5jGUlnbv+2acWH/6b82UnGTAC5G2rEbk58jL1bYL5IttvSQ9nyN X-Received: by 10.80.194.146 with SMTP id o18mr14506502edf.67.1516739218970; Tue, 23 Jan 2018 12:26:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516739218; cv=none; d=google.com; s=arc-20160816; b=CfVse63axR0/sls5bP0P9nwCaU/FRTqc+Z7+ZQxLHNmFz3PwkkmkOmG5wVcH480AGJ kxT05R+EVf1rKsCEgf+aX0wnVVVgj+qEYKwUi6kXsCHMqQzJqZZF+ZrpDI9G6rT5H1PU gNmfRKZFk5ZOU+rEclXXxhvdpz4/Be6HtQPBZYfjqev1qls3emycUqUdCQMdcqWG9J6/ fXDex2L5g/wCm9xdE7Z11dAhnf0+TZiaEhyvKHPQn/OuHmoXRZ74XrJA3SjlsACDeLsc YEHtK3da3VjMFAOic8cix4sDGdLDgHHqOWRDRoQX2O6xwtD87ioRHAC5py6opUuCGd/f LoQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:references:in-reply-to:references :in-reply-to:message-id:date:to:from:arc-authentication-results; bh=WT9VQCqrW40Y9zcPvlNY3hRZuiFe3Nk8DeTMx4DOcnE=; b=VkDG8wi4NhKYK3JFkc/yQHBalTsYmSh3xmAyQHm9dUyC8W63laO/uWgCdASXTIXfSt qhBQzq0W1oTe7CS18vmWNha5hd5xa0gyXBvNpAxuwb55iwDBadwt2Pbr77h4sP1Ee7p7 Bu5lKrZlQFF5Ptbw8k4kDG7G8b9lIoVs0rVBrCQO/kromMDLM/LvDgobXCygZy0R2Uj5 Qoka8oDD3KgWQ8mV5suFojun/WdZ8kiwb4v7I8lUGN/gqKo/4kLYIsup75PNhVCJ5Lh2 XZngRDEkQd+77XFq2dsktKRDAGUo1uOlt9vEYUiRBrDAcU8V/lgoOfH1t5lcE1mphhUx dBDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id 6si2738313edf.460.2018.01.23.12.26.58; Tue, 23 Jan 2018 12:26:58 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by lists.denx.de (Postfix, from userid 105) id 7391FC2216F; Tue, 23 Jan 2018 20:21:44 +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=none 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 11159C22169; Tue, 23 Jan 2018 20:17:41 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 4BBA0C22140; Tue, 23 Jan 2018 20:17:16 +0000 (UTC) Received: from mail.free-electrons.com (mail.free-electrons.com [62.4.15.54]) by lists.denx.de (Postfix) with ESMTP id 62FADC21EE8 for ; Tue, 23 Jan 2018 20:17:11 +0000 (UTC) Received: by mail.free-electrons.com (Postfix, from userid 110) id 4118D20C1B; Tue, 23 Jan 2018 21:17:11 +0100 (CET) Received: from localhost (LFbn-1-2035-97.w90-76.abo.wanadoo.fr [90.76.104.97]) by mail.free-electrons.com (Postfix) with ESMTPSA id 0FD02207A8; Tue, 23 Jan 2018 21:17:11 +0100 (CET) From: Maxime Ripard To: Tom Rini Date: Tue, 23 Jan 2018 21:16:59 +0100 Message-Id: <62912996953986988c425da917d9aae0cc49fcf2.1516723179.git-series.maxime.ripard@free-electrons.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: References: In-Reply-To: References: Cc: Andre Przywara , agraf@suse.de, u-boot@lists.denx.de, Maxime Ripard , Jagan Teki Subject: [U-Boot] [PATCH v3 10/15] env: Initialise all the environments 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" Since we want to have multiple environments, we will need to initialise all the environments since we don't know at init time what drivers might fail when calling load. Let's init all of them, and only consider for further operations the ones that have not reported any errors at init time. Reviewed-by: Simon Glass Signed-off-by: Maxime Ripard --- env/env.c | 36 +++++++++++++++++++++++++------- include/asm-generic/global_data.h | 1 +- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/env/env.c b/env/env.c index 1182fdb545db..2ea581cbedd6 100644 --- a/env/env.c +++ b/env/env.c @@ -61,6 +61,23 @@ static enum env_location env_locations[] = { static enum env_location env_load_location = ENVL_UNKNOWN; +static bool env_has_inited(enum env_location location) +{ + return gd->env_has_init & BIT(location); +} + +static void env_set_inited(enum env_location location) +{ + /* + * We're using a 32-bits bitmask stored in gd (env_has_init) + * using the above enum value as the bit index. We need to + * make sure that we're not overflowing it. + */ + BUILD_BUG_ON(ARRAY_SIZE(env_locations) > BITS_PER_LONG); + + gd->env_has_init |= BIT(location); +} + /** * env_get_location() - Returns the best env location for a board * @op: operations performed on the environment @@ -142,6 +159,9 @@ int env_get_char(int index) if (!drv->get_char) continue; + if (!env_has_inited(drv->location)) + continue; + ret = drv->get_char(index); if (!ret) return 0; @@ -164,6 +184,9 @@ int env_load(void) if (!drv->load) continue; + if (!env_has_inited(drv->location)) + continue; + printf("Loading Environment from %s... ", drv->name); ret = drv->load(); if (ret) @@ -189,6 +212,9 @@ int env_save(void) if (!drv->save) continue; + if (!env_has_inited(drv->location)) + continue; + printf("Saving Environment to %s... ", drv->name); ret = drv->save(); if (ret) @@ -210,14 +236,10 @@ int env_init(void) int prio; for (prio = 0; (drv = env_driver_lookup(ENVOP_INIT, prio)); prio++) { - if (!drv->init) - continue; - - ret = drv->init(); - if (!ret) - return 0; + if (!drv->init || !(ret = drv->init())) + env_set_inited(drv->location); - debug("%s: Environment %s failed to init (err=%d)\n", __func__, + debug("%s: Environment %s init done (ret=%d)\n", __func__, drv->name, ret); } diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index 73e036d6fd4a..fd8cd45b050e 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -50,6 +50,7 @@ typedef struct global_data { #endif unsigned long env_addr; /* Address of Environment struct */ unsigned long env_valid; /* Environment valid? enum env_valid */ + unsigned long env_has_init; /* Bitmask of boolean of struct env_location offsets */ unsigned long ram_top; /* Top address of RAM used by U-Boot */ unsigned long relocaddr; /* Start address of U-Boot in RAM */