From patchwork Mon Mar 28 09:37:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 602429 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3qYTk96W9Mz9sBf for ; Mon, 28 Mar 2016 20:53:21 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=u8MMy5d3; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id ED512A75FA; Mon, 28 Mar 2016 11:53:18 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id M4KA4lXZOmQ4; Mon, 28 Mar 2016 11:53:18 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 431B5A74E9; Mon, 28 Mar 2016 11:53:18 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 951E2A74E9 for ; Mon, 28 Mar 2016 11:53:14 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xkp6LLuKMJXI for ; Mon, 28 Mar 2016 11:53:14 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by theia.denx.de (Postfix) with ESMTPS id 1343EA748A for ; Mon, 28 Mar 2016 11:53:09 +0200 (CEST) Received: by mail-pa0-f65.google.com with SMTP id q6so14574320pav.0 for ; Mon, 28 Mar 2016 02:53:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=EETcURpLMrUFk1FLF18fKLTpntbXVxzTrnb43xVeV0o=; b=u8MMy5d3sIjIPDBXSGP+3omuN51FJXVzwGk6hemayhzzjv2lpWVRNWVcpfZXoYV9uv g0aAfiZV+hjwhJ8hODfEMhp19iS3PCEtEh4nNJe1BaartjhSxE+CZAmsq98l9tImfGxr WNd5xGXM/Ckhb7veAdtBe1uY7kExJMLfb7J7ZsjbCA9Xq43W42QmA8h3BdRval2q2DWC XIRQY5O/wm7e7z6YbTIxIPln9luZV+l4jhYZ3vOKNnccJPmyE7ZspCtjmehf4P74KyJ0 CzOyxcMDfpRbC5AKSvgNjOGdgUEJktcHnSGn8Mc7SjlPbMxYlaFETAePjvSghDqXTTjx gJgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=EETcURpLMrUFk1FLF18fKLTpntbXVxzTrnb43xVeV0o=; b=YFfUqLz6h7tOv6fM/41Rh9FwnEx5Ur1K9gXU7wVAiCsVRJyNJ96mrYggqYw0mZLOL+ 99MlsHApSIFfqEthZaDbcQY3+n2p70o37YrVSVl1A4Xkc2jJshfOyRnjXIpOuPKQrqFv yXPtnP4C1Qd5lM9cr1kVWwhdO5jNZtpimUfIGkfi3EMdaSndPIUIB4GvLvSx5SuaAwOF tKhtmMyjt3VjObEGizW02QU/N38dFUS80hFBoLoKQyW7URxukqhk8HrEksXpv4x1Bf0G VW+1/xftjPX3FADL8IwznMqxVa7wgjlDn8ud3OEonfwxQJwRlTL5WM86692qGqwTh8AA S2vg== X-Gm-Message-State: AD7BkJKU5VntIoQe930j5Z9/X0tMuWIgKZKJJQaNt/VV0vYCQ5Ua+Ndm+4PJZGHhe/B1WA== X-Received: by 10.66.246.234 with SMTP id xz10mr41289986pac.49.1459158788412; Mon, 28 Mar 2016 02:53:08 -0700 (PDT) Received: from linux-7smt.suse (gate-zmy3.freescale.com. [192.88.167.1]) by smtp.gmail.com with ESMTPSA id f8sm34257734pfj.49.2016.03.28.02.53.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 28 Mar 2016 02:53:07 -0700 (PDT) From: Peng Fan To: trini@konsulko.com Date: Mon, 28 Mar 2016 17:37:16 +0800 Message-Id: <1459157836-5042-1-git-send-email-van.freenix@gmail.com> X-Mailer: git-send-email 2.6.2 Cc: Stefan Roese , Joe Hershberger , Simon Glass , u-boot@lists.denx.de Subject: [U-Boot] [PATCH] common: env: support sata device X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 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" Introduce env support for sata device. 1. Implement write_env/read_env/env_relocate_spec/saveenv/sata_get_env_dev 2. If want to enable this feature, define CONFIG_ENV_IS_IN_SATA, and define CONFIG_SYS_SATA_ENV_DEV or implement your own sata_get_ev_dev. Signed-off-by: Peng Fan Cc: Simon Glass Cc: Joe Hershberger Cc: Bin Meng Cc: Stefan Roese Cc: Heiko Schocher Cc: Stuart Longland Cc: Maxime Ripard Cc: Tom Rini --- cmd/nvedit.c | 3 +- common/Makefile | 1 + common/env_sata.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 common/env_sata.c diff --git a/cmd/nvedit.c b/cmd/nvedit.c index 9cf884e..b67563b 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -49,12 +49,13 @@ DECLARE_GLOBAL_DATA_PTR; !defined(CONFIG_ENV_IS_IN_NAND) && \ !defined(CONFIG_ENV_IS_IN_NVRAM) && \ !defined(CONFIG_ENV_IS_IN_ONENAND) && \ + !defined(CONFIG_ENV_IS_IN_SATA) && \ !defined(CONFIG_ENV_IS_IN_SPI_FLASH) && \ !defined(CONFIG_ENV_IS_IN_REMOTE) && \ !defined(CONFIG_ENV_IS_IN_UBI) && \ !defined(CONFIG_ENV_IS_NOWHERE) # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\ -SPI_FLASH|NVRAM|MMC|FAT|EXT4|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE +SATA|SPI_FLASH|NVRAM|MMC|FAT|EXT4|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE #endif /* diff --git a/common/Makefile b/common/Makefile index 9a4b817..b23f312 100644 --- a/common/Makefile +++ b/common/Makefile @@ -50,6 +50,7 @@ obj-$(CONFIG_ENV_IS_IN_EXT4) += env_ext4.o obj-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o obj-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o obj-$(CONFIG_ENV_IS_IN_ONENAND) += env_onenand.o +obj-$(CONFIG_ENV_IS_IN_SATA) += env_sata.o obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o obj-$(CONFIG_ENV_IS_IN_REMOTE) += env_remote.o obj-$(CONFIG_ENV_IS_IN_UBI) += env_ubi.o diff --git a/common/env_sata.c b/common/env_sata.c new file mode 100644 index 0000000..bc49900 --- /dev/null +++ b/common/env_sata.c @@ -0,0 +1,135 @@ +/* + * (C) Copyright 2010-2016 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/* #define DEBUG */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +/* + * TODO: Support CONFIG_ENV_SIZE_REDUND CONFIG_ENV_OFFSET_REDUND + */ + +#if !defined(CONFIG_ENV_OFFSET) || !defined(CONFIG_ENV_SIZE) +#error CONFIG_ENV_OFFSET or CONFIG_ENV_SIZE not defined +#endif + +char *env_name_spec = "SATA"; + +#ifdef ENV_IS_EMBEDDED +env_t *env_ptr = (env_t *)(&environment[0]); +#else /* ! ENV_IS_EMBEDDED */ +env_t *env_ptr; +#endif /* ENV_IS_EMBEDDED */ + +DECLARE_GLOBAL_DATA_PTR; + +__weak int sata_get_env_dev(void) +{ + return CONFIG_SYS_SATA_ENV_DEV; +} + +int env_init(void) +{ + /* use default */ + gd->env_addr = (ulong)&default_environment[0]; + gd->env_valid = 1; + + return 0; +} + +#ifdef CONFIG_CMD_SAVEENV +static inline int write_env(struct blk_desc *sata, unsigned long size, + unsigned long offset, const void *buffer) +{ + uint blk_start, blk_cnt, n; + + blk_start = ALIGN(offset, sata->blksz) / sata->blksz; + blk_cnt = ALIGN(size, sata->blksz) / sata->blksz; + + n = sata->block_write(sata, blk_start, blk_cnt, (u_char *)buffer); + + return (n == blk_cnt) ? 0 : -1; +} + +int saveenv(void) +{ + ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); + struct blk_desc *sata = NULL; + int env_sata, ret; + + if (sata_initialize()) + return 1; + + env_sata = sata_get_env_dev(); + + sata = sata_get_dev(env_sata); + if (sata == NULL) { + printf("Unknown SATA(%d) device for environment!\n", + env_sata); + return 1; + } + + ret = env_export(env_new); + if (ret) + return 1; + + printf("Writing to SATA(%d)...", env_sata); + if (write_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, &env_new)) { + puts("failed\n"); + return 1; + } + + puts("done\n"); + return 0; +} +#endif /* CONFIG_CMD_SAVEENV */ + +static inline int read_env(struct blk_desc *sata, unsigned long size, + unsigned long offset, const void *buffer) +{ + uint blk_start, blk_cnt, n; + + blk_start = ALIGN(offset, sata->blksz) / sata->blksz; + blk_cnt = ALIGN(size, sata->blksz) / sata->blksz; + + n = sata->block_read(sata, blk_start, blk_cnt, (uchar *)buffer); + + return (n == blk_cnt) ? 0 : -1; +} + +void env_relocate_spec(void) +{ +#if !defined(ENV_IS_EMBEDDED) + ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); + struct blk_desc *sata = NULL; + int env_sata; + + if (sata_initialize()) + return; + + env_sata = sata_get_env_dev(); + + sata = sata_get_dev(env_sata); + if (sata == NULL) { + printf("Unknown SATA(%d) device for environment!\n", + env_sata); + return; + } + + if (read_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf)) + return set_default_env(NULL); + + env_import(buf, 1); +#endif +}