From patchwork Thu Oct 8 17:27:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harry Waschkeit X-Patchwork-Id: 1378891 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=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=men.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=men.de header.i=@men.de header.a=rsa-sha256 header.s=secure header.b=cndZkr+v; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4C6jGP0l0jz9ryj for ; Fri, 9 Oct 2020 07:19:09 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 69714806C5; Thu, 8 Oct 2020 22:19:05 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=men.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=men.de header.i=@men.de header.b="cndZkr+v"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 7589581BD2; Thu, 8 Oct 2020 19:27:54 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail1.bemta25.messagelabs.com (mail1.bemta25.messagelabs.com [195.245.230.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 8A433801D8 for ; Thu, 8 Oct 2020 19:27:51 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=men.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=Harry.Waschkeit@duagon.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=men.de; s=secure; t=1602178071; i=@men.de; bh=gF92QB7pf+RZDd8+bS2WdKIfkBujhDwE6wW4wRfm9Os=; h=To:From:Subject:Message-ID:Date:MIME-Version:Content-Type: Content-Transfer-Encoding; b=cndZkr+vGyWu85+XalZbVC3B0czeiB33PSEXsgdxYMD+P1SBPWFw3xe44i4dmFAjs GoPbw0g+6fSlklWuLkrzfzc6D0GBE2q915hvibJktrMAgzDTo1N71BJ/20JWWzyI2b jOKTwqcS2KPpM5UWcSlontJh1KtqldGIJ3KKjch8= Received: from [100.112.193.11] (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256 bits)) by server-1.bemta.az-a.eu-west-1.aws.symcld.net id 8C/42-11775-61C4F7F5; Thu, 08 Oct 2020 17:27:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrEIsWRWlGSWpSXmKPExsUS8J9toq6YT32 8weReOYu3ezvZHRg9zt7ZwRjAGMWamZeUX5HAmtG/7BtbwWXNike37zE3MN6V6mLk4hASaGCU mPrmN0sXIyeHhICfxP8Nb5khEqsZJQ59a2aHcHYzSsxo2cUKUiUiICXxsnMjM4jNJqAn0btgF 1A3B4ewgLHEtFWpIGFeAUuJw8snMIGEWQRUJF7eDgYJiwqES7z9MI0VokRQ4uTMJ2B7mQUsJG bOP88IUs4sICIxvc8SIiwvsf3tHLBFQgLKEtPOv2KEOFNJ4tyVR6wg5RICcRJf7phCmNYSEzc nQlRwSrz/8IFpAqPwLCS7ZiHZNQth1ywkuxYwsqxiNE8qykzPKMlNzMzRNTQw0DU0NNI1tDTS NTHRS6zSTdRLLdUtTy0u0TXUSywv1iuuzE3OSdHLSy3ZxAiMipSCAzo7GH+++qB3iFGSg0lJl JfJuz5eiC8pP6UyI7E4I76oNCe1+BCjDAeHkgSvtxdQTrAoNT21Ii0zBxihMGkJDh4lEV4dkF be4oLE3OLMdIjUKUZFKXFeJZCEAEgiozQPrg2WFC4xykoJ8zIyMDAI8RSkFuVmlqDKv2IU52B UEuZ1A9nOk5lXAjf9FdBiJqDFr3fVgCwuSURISTUwZWp1PN4eXXpG6luCcOVlHevvAQ2zNR7/ ueJg86b/LYP/7pa93XEL/7ktkbJ0cmOSjKrZkRkkcujkySqXVa4rVGXEw0ISz9fNNTX3vVzO8 PyeZW1WW1xGA5P/vUOGC5WmnFVkZK1/VyesLPbveu/O/yE3ki2/Tni/Y5veOb+Mk1oPNlQEXt APeMsg+DHEY94r3cOnAvV19nxT4rluGd0pss1ahzm5/XzhLL+9CQwrJGaJun4ImDF17tXdx/s E0759UrsoE3v49nubFacvLsnW3fiA/YmF3/3YyhuqMsyK7VrB9jdl9bXtXys39i3u1hBX2G71 0N788Ul10yl2J55ZrhbKqfLIurPuzcsdS2SVWIozEg21mIuKEwGigE9XhQMAAA== X-Env-Sender: Harry.Waschkeit@duagon.com X-Msg-Ref: server-31.tower-268.messagelabs.com!1602178069!2456169!1 X-Originating-IP: [80.255.6.145] X-SYMC-ESS-Client-Auth: outbound-route-from=pass X-StarScan-Received: X-StarScan-Version: 9.60.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 24356 invoked from network); 8 Oct 2020 17:27:50 -0000 Received: from unknown (HELO keys.men.de) (80.255.6.145) by server-31.tower-268.messagelabs.com with DHE-RSA-AES256-SHA encrypted SMTP; 8 Oct 2020 17:27:50 -0000 Received: from MEN-EX01.intra.men.de ([192.168.1.1]) by keys.men.de (PGP Universal service); Thu, 08 Oct 2020 19:27:50 +0200 X-PGP-Universal: processed; by keys.men.de on Thu, 08 Oct 2020 19:27:50 +0200 Received: from MEN-EX01.intra.men.de (192.168.1.1) by MEN-EX01.intra.men.de (192.168.1.1) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 8 Oct 2020 19:27:49 +0200 Received: from [10.0.2.15] (192.168.200.23) by MEN-EX01.intra.men.de (192.168.1.1) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Thu, 8 Oct 2020 19:27:49 +0200 To: From: Harry Waschkeit Subject: [PATCH] env: sf: add support for env erase Message-ID: <66c89baf-b52a-81cb-2846-112a7925a256@men.de> Date: Thu, 8 Oct 2020 19:27:48 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 MIME-Version: 1.0 Content-Language: de X-Originating-IP: [192.168.200.23] X-ClientProxiedBy: MEN-EX01.intra.men.de (192.168.1.1) To MEN-EX01.intra.men.de (192.168.1.1) X-EXCLAIMER-MD-CONFIG: e4841e51-7998-49c0-ba41-8b8a0e2d8962 X-Loop: 2 X-Mailman-Approved-At: Thu, 08 Oct 2020 22:19:04 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Command "env erase" didn't work even though CONFIG_CMD_ERASEENV was defined, because serial flash environment routines didn't implement erase method. Signed-off-by: Waschkeit, Harry --- env/sf.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/env/sf.c b/env/sf.c index 937778aa37..9cda192a73 100644 --- a/env/sf.c +++ b/env/sf.c @@ -146,6 +146,78 @@ static int env_sf_save(void) return ret; } +#ifdef CONFIG_CMD_ERASEENV +static int env_sf_erase(void) +{ + char *saved_buffer = NULL; + u32 saved_size, saved_offset, sector; + ulong offset; + ulong offsets[2] = { CONFIG_ENV_OFFSET, CONFIG_ENV_OFFSET_REDUND }; + int i; + int ret; + + ret = setup_flash_device(); + if (ret) + return ret; + + /* get temporary storage if sector is larger than env (i.e. embedded) */ + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { + saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE; + saved_buffer = memalign(ARCH_DMA_MINALIGN, saved_size); + if (!saved_buffer) { + ret = -ENOMEM; + goto done; + } + } + + sector = DIV_ROUND_UP(CONFIG_ENV_SIZE, CONFIG_ENV_SECT_SIZE); + + /* simply erase both environments, retaining non-env data (if any) */ + for (i = 0; i < ARRAY_SIZE(offsets); i++) { + offset = offsets[i]; + + if (saved_buffer) { + saved_offset = offset + CONFIG_ENV_SIZE; + ret = spi_flash_read(env_flash, saved_offset, + saved_size, saved_buffer); + if (ret) + goto done; + } + + if (i) + puts("Redund:"); + + puts("Erasing SPI flash..."); + ret = spi_flash_erase(env_flash, offset, + sector * CONFIG_ENV_SECT_SIZE); + if (ret) + goto done; + + if (saved_buffer) { + puts("Writing non-environment data to SPI flash..."); + ret = spi_flash_write(env_flash, saved_offset, + saved_size, saved_buffer); + if (ret) + goto done; + } + + puts("done\n"); + } + + /* here we know that both env sections are cleared */ + env_new_offset = CONFIG_ENV_OFFSET; + env_offset = CONFIG_ENV_OFFSET_REDUND; + + gd->env_valid = ENV_INVALID; + + done: + if (saved_buffer) + free(saved_buffer); + + return ret; +} +#endif /* CONFIG_CMD_ERASEENV */ + static int env_sf_load(void) { int ret; @@ -182,7 +254,7 @@ out: return ret; } -#else +#else /* #if defined(CONFIG_ENV_OFFSET_REDUND) */ static int env_sf_save(void) { u32 saved_size, saved_offset, sector; @@ -243,6 +315,57 @@ static int env_sf_save(void) return ret; } +#ifdef CONFIG_CMD_ERASEENV +static int env_sf_erase(void) +{ + u32 saved_size, saved_offset, sector; + char *saved_buffer = NULL; + int ret = 1; + + ret = setup_flash_device(); + if (ret) + return ret; + + /* Is the sector larger than the env (i.e. embedded) */ + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { + saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE; + saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE; + saved_buffer = malloc(saved_size); + if (!saved_buffer) + goto done; + + ret = spi_flash_read(env_flash, saved_offset, + saved_size, saved_buffer); + if (ret) + goto done; + } + + sector = DIV_ROUND_UP(CONFIG_ENV_SIZE, CONFIG_ENV_SECT_SIZE); + + puts("Erasing SPI flash..."); + ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET, + sector * CONFIG_ENV_SECT_SIZE); + if (ret) + goto done; + + if (saved_buffer) { + puts("Writing non-environment data to SPI flash..."); + ret = spi_flash_write(env_flash, saved_offset, + saved_size, saved_buffer); + if (ret) + goto done; + } + + puts("done\n"); + + done: + if (saved_buffer) + free(saved_buffer); + + return ret; +} +#endif /* CONFIG_CMD_ERASEENV */ + static int env_sf_load(void) { int ret; @@ -277,7 +400,7 @@ out: return ret; } -#endif +#endif /* #if defined(CONFIG_ENV_OFFSET_REDUND) #else */ #if CONFIG_ENV_ADDR != 0x0 __weak void *env_sf_get_env_addr(void) @@ -311,4 +434,7 @@ U_BOOT_ENV_LOCATION(sf) = { #if defined(INITENV) && (CONFIG_ENV_ADDR != 0x0) .init = env_sf_init, #endif +#if defined(CONFIG_CMD_ERASEENV) && defined(CONFIG_ENV_ADDR) + .erase = env_sf_erase, +#endif };