All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 20/30] env: Add a new implementation of environment access
Date: Sun,  9 Jul 2017 14:53:03 -0600	[thread overview]
Message-ID: <20170709205313.116174-21-sjg@chromium.org> (raw)
In-Reply-To: <20170709205313.116174-1-sjg@chromium.org>

We plan to move to a environment access via drivers for each location
where the environment can be stored. Add an implementation for this. So
far it is not used, but will be pressed into service in a future patch.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 env/Makefile |   2 +-
 env/env.c    | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 146 insertions(+), 1 deletion(-)
 create mode 100644 env/env.c

diff --git a/env/Makefile b/env/Makefile
index 4c1bdcfdf4..8df5b9d4c9 100644
--- a/env/Makefile
+++ b/env/Makefile
@@ -5,7 +5,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-obj-y += common.o
+obj-y += common.o env.o
 
 ifndef CONFIG_SPL_BUILD
 obj-y += attr.o
diff --git a/env/env.c b/env/env.c
new file mode 100644
index 0000000000..9f0a04c33c
--- /dev/null
+++ b/env/env.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <environment.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct env_driver *env_driver_lookup(enum env_location loc)
+{
+	struct env_driver *drv;
+	const int n_ents = ll_entry_count(struct env_driver, env_driver);
+	struct env_driver *entry;
+
+	drv = ll_entry_start(struct env_driver, env_driver);
+	for (entry = drv; entry != drv + n_ents; entry++) {
+		if (loc == entry->location)
+			return entry;
+	}
+
+	/* Not found */
+	return NULL;
+}
+
+static enum env_location env_get_default_location(void)
+{
+	if IS_ENABLED(CONFIG_ENV_IS_IN_DATAFLASH)
+		return ENVL_DATAFLASH;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_EEPROM)
+		return ENVL_EEPROM;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_FAT)
+		return ENVL_FAT;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_FLASH)
+		return ENVL_FLASH;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
+		return ENVL_MMC;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_NAND)
+		return ENVL_NAND;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_NVRAM)
+		return ENVL_NVRAM;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_REMOTE)
+		return ENVL_REMOTE;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH)
+		return ENVL_SPI_FLASH;
+	else if IS_ENABLED(CONFIG_ENV_IS_IN_UBI)
+		return ENVL_UBI;
+	else if IS_ENABLED(CONFIG_ENV_IS_NOWHERE)
+		return ENVL_NOWHERE;
+	else
+		return ENVL_UNKNOWN;
+}
+
+static struct env_driver *env_driver_lookup_default(void)
+{
+	enum env_location loc = env_get_default_location();
+	struct env_driver *drv;
+
+	drv = env_driver_lookup(loc);
+	if (!drv) {
+		debug("%s: No environment driver for location %d\n", __func__,
+		      loc);
+		return NULL;
+	}
+
+	return drv;
+}
+
+int env_get_char_new(int index)
+{
+	struct env_driver *drv = env_driver_lookup_default();
+	int ret;
+
+	if (!drv)
+		return -ENODEV;
+	if (!drv->get_char)
+		return *(uchar *)(gd->env_addr + index);
+	ret = drv->get_char(index);
+	if (ret < 0) {
+		debug("%s: Environment failed to load (err=%d)\n",
+		      __func__, ret);
+	}
+
+	return ret;
+}
+
+int env_load(void)
+{
+	struct env_driver *drv = env_driver_lookup_default();
+	int ret = 0;
+
+	if (!drv)
+		return -ENODEV;
+	if (!drv->load)
+		return 0;
+	drv->load();  /* TODO(sjg at chromium.org): Make this return an error */
+	if (ret) {
+		debug("%s: Environment failed to load (err=%d)\n", __func__,
+		      ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+int env_save(void)
+{
+	struct env_driver *drv = env_driver_lookup_default();
+	int ret;
+
+	if (!drv)
+		return -ENODEV;
+	if (!drv->save)
+		return -ENOSYS;
+	ret = drv->save();
+	if (ret) {
+		debug("%s: Environment failed to save (err=%d)\n", __func__,
+		      ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+int env_init_new(void)
+{
+	struct env_driver *drv = env_driver_lookup_default();
+	int ret;
+
+	if (!drv)
+		return -ENODEV;
+	if (!drv->init)
+		return -ENOSYS;
+	ret = drv->init();
+	if (ret) {
+		debug("%s: Environment failed to init (err=%d)\n", __func__,
+		      ret);
+		return ret;
+	}
+
+	return 0;
+}
-- 
2.13.2.725.g09c95d1e9-goog

  parent reply	other threads:[~2017-07-09 20:53 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-09 20:52 [U-Boot] [PATCH 00/30] env: Move environment code to use location drivers Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 01/30] Makefile: Rename 'env' target to 'environ' Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 02/30] Move environment files from common/ to env/ Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 03/30] Convert CONFIG_ENV_IS_IN_MMC et al to Kconfig Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 04/30] env: Move help from README " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 05/30] Convert CONFIG_ENV_IS_IN_FLASH " Simon Glass
2017-07-10 22:09   ` Daniel Schwierzeck
2017-07-18 14:00     ` Simon Glass
2017-07-18 15:01       ` Daniel Schwierzeck
2017-07-18 16:55         ` Tom Rini
2017-07-09 20:52 ` [U-Boot] [PATCH 06/30] Convert CONFIG_ENV_IS_IN_NVRAM " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 07/30] Convert CONFIG_ENV_IS_IN_EEPROM " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 08/30] Convert CONFIG_ENV_IS_IN_DATAFLASH " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 09/30] Convert CONFIG_ENV_IS_IN_SPI_FLASH " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 10/30] Convert CONFIG_ENV_IS_IN_REMOTE " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 11/30] Convert CONFIG_ENV_IS_IN_FAT " Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 12/30] env: common: Make env_get_addr/get_char_memory() static Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 13/30] env: common: Drop env_get_addr() Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 14/30] env: common: Factor out the common env_valid check Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 15/30] env: common: Drop env_get_char_init() Simon Glass
2017-07-09 20:52 ` [U-Boot] [PATCH 16/30] env: common: Drop env_get_char_memory() Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 17/30] env: Add an enum for environment state Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 18/30] env: Rename nand env_location to nand_env_location Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 19/30] env: Create a location driver for each location Simon Glass
2017-07-09 20:53 ` Simon Glass [this message]
2017-07-09 20:53 ` [U-Boot] [PATCH 21/30] env: Switch over to use environment location drivers Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 22/30] env: Drop common init() functions Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 23/30] env: Drop the env_name_spec global Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 24/30] env: Drop unused env_ptr variables Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 25/30] env: Drop env_init_new() Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 26/30] env: Drop env_get_char_spec() Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 27/30] env: Drop env_relocate_spec() in favour of env_load() Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 28/30] env: Drop saveenv() in favour of env_save() Simon Glass
2017-07-10 20:08   ` Wolfgang Denk
2017-07-12  0:32     ` Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 29/30] env: Adjust the get_char() method to return an int Simon Glass
2017-07-09 20:53 ` [U-Boot] [PATCH 30/30] env: Adjust the load() method to return an error Simon Glass
2017-07-10  8:10 ` [U-Boot] [PATCH 00/30] env: Move environment code to use location drivers Christophe LEROY
2017-07-10 16:38   ` Simon Glass
2017-07-11  7:59     ` Christophe LEROY
2017-07-12  0:32       ` Simon Glass
2017-07-12 12:24 ` Tom Rini
2017-07-13 16:45   ` Simon Glass
2017-07-18  0:56     ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170709205313.116174-21-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.