From patchwork Tue Nov 28 10:24:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 842059 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3ymKbr2wJyz9t3f for ; Tue, 28 Nov 2017 21:27:20 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id D8493C21E31; Tue, 28 Nov 2017 10:25:19 +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 95E56C21DD9; Tue, 28 Nov 2017 10:24:55 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id DB922C21D6A; Tue, 28 Nov 2017 10:24:52 +0000 (UTC) Received: from mail.free-electrons.com (mail.free-electrons.com [62.4.15.54]) by lists.denx.de (Postfix) with ESMTP id 8EBF8C21D79 for ; Tue, 28 Nov 2017 10:24:52 +0000 (UTC) Received: by mail.free-electrons.com (Postfix, from userid 110) id DF3FE20742; Tue, 28 Nov 2017 11:24:51 +0100 (CET) Received: from localhost (LStLambert-657-1-97-87.w90-63.abo.wanadoo.fr [90.63.216.87]) by mail.free-electrons.com (Postfix) with ESMTPSA id B5F5D20380; Tue, 28 Nov 2017 11:24:51 +0100 (CET) From: Maxime Ripard To: Tom Rini Date: Tue, 28 Nov 2017 11:24:45 +0100 Message-Id: X-Mailer: git-send-email 2.14.3 In-Reply-To: References: In-Reply-To: References: Cc: Thomas Petazzoni , u-boot@lists.denx.de, Andre Przywara , agraf@suse.de, Maxime Ripard , Jagan Teki Subject: [U-Boot] [PATCH 10/14] 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. Signed-off-by: Maxime Ripard --- env/env.c | 19 ++++++++++++------- include/asm-generic/global_data.h | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/env/env.c b/env/env.c index 5176700133d3..b4d8886e7a69 100644 --- a/env/env.c +++ b/env/env.c @@ -112,6 +112,9 @@ int env_get_char(int index) if (!drv->get_char) continue; + if (!(gd->env_has_init & BIT(drv->location))) + continue; + ret = drv->get_char(index); if (!ret) return 0; @@ -134,6 +137,9 @@ int env_load(void) if (!drv->load) continue; + if (!(gd->env_has_init & BIT(drv->location))) + continue; + printf("Loading Environment from %s... ", drv->name); ret = drv->load(); printf("%s\n", ret ? "Failed" : "OK"); @@ -155,6 +161,9 @@ int env_save(void) if (!drv->save) continue; + if (!(gd->env_has_init & BIT(drv->location))) + continue; + printf("Saving Environment to %s... ", drv->name); ret = drv->save(); printf("%s\n", ret ? "Failed" : "OK"); @@ -175,14 +184,10 @@ int env_init(void) int prio; for (prio = 0; (drv = env_driver_lookup(ENVO_INIT, prio)); prio++) { - if (!drv->init) - continue; - - ret = drv->init(); - if (!ret) - return 0; + if (!drv->init || !drv->init()) + gd->env_has_init |= BIT(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 944f58195caf..1d0611fe9498 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 */