Skip to contentSkip to conversation

env_mmc: support env partition setup in runtime

PATCH Superseded Dmitry Lifshitz 4 participants 7 messages Jul 29, 2014 – Aug 1, 2014

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 env_mmc: support env partition setup in runtime

Add callback with __weak annotation to allow setup of environment partition number in runtime from a board file.

Propagate mmc_switch_part() return value into init_mmc_for_env() instead of -1 in case of failure.

---
 common/env_mmc.c |   35 +++++++++++++++++++++++------------
 1 files changed, 23 insertions(+), 12 deletions(-)
common/env_mmc.c +23 -12
index 7da10e6..a7621a8 100644
@@ -62,16 +62,36 @@ int env_init(void)
 	return 0;
 }
 
-static int init_mmc_for_env(struct mmc *mmc)
-{
 #ifdef CONFIG_SYS_MMC_ENV_PART
+__weak uint mmc_get_env_part(struct mmc *mmc)
+{
+	return CONFIG_SYS_MMC_ENV_PART;
+}
+
+static int mmc_set_env_part(struct mmc *mmc)
+{
+	uint part = mmc_get_env_part(mmc);
 	int dev = CONFIG_SYS_MMC_ENV_DEV;
+	int ret = 0;
 
 #ifdef CONFIG_SPL_BUILD
 	dev = 0;
 #endif
+
+	if (part != mmc->part_num) {
+		ret = mmc_switch_part(dev, part);
+		if (ret)
+			puts("MMC partition switch failed\n");
+	}
+
+	return ret;
+}
+#else
+static inline int mmc_set_env_part(struct mmc *mmc) {return 0; };
 #endif
 
+static int init_mmc_for_env(struct mmc *mmc)
+{
 	if (!mmc) {
 		puts("No MMC card found\n");
 		return -1;
@@ -82,16 +102,7 @@ static int init_mmc_for_env(struct mmc *mmc)
 		return -1;
 	}
 
-#ifdef CONFIG_SYS_MMC_ENV_PART
-	if (CONFIG_SYS_MMC_ENV_PART != mmc->part_num) {
-		if (mmc_switch_part(dev, CONFIG_SYS_MMC_ENV_PART)) {
-			puts("MMC partition switch failed\n");
-			return -1;
-		}
-	}
-#endif
-
-	return 0;
+	return mmc_set_env_part(mmc);
 }
 
 static void fini_mmc_for_env(struct mmc *mmc)
Signature · 1 line
1.7.5.4
#1 lore raw

PATCH 1/1 env_mmc: support env partition setup in runtime

Hello Dmitry,

Quoted 18 lines · Dmitry Lifshitz

Add callback with __weak annotation to allow setup of environment partition number in runtime from a board file.

Propagate mmc_switch_part() return value into init_mmc_for_env() instead of -1 in case of failure.

---
  common/env_mmc.c |   35 +++++++++++++++++++++++------------
  1 files changed, 23 insertions(+), 12 deletions(-)
common/env_mmc.c +0 -0
index 7da10e6..a7621a8 100644
@@ -62,16 +62,36 @@ int env_init(void)
  	return 0;

common/env_mmc.c int env_init(void) · line 70

Quoted 10 lines
common/env_mmc.c +5 -2
  }
 
-static int init_mmc_for_env(struct mmc *mmc)
-{
  #ifdef CONFIG_SYS_MMC_ENV_PART
+__weak uint mmc_get_env_part(struct mmc *mmc)
+{
+	return CONFIG_SYS_MMC_ENV_PART;
+}
+

mmc_get_env_part lacks a prototype and there seems to be no "strong version" / user of this code.

Regards,
Jeroen

#2 lore raw

PATCH 1/1 env_mmc: support env partition setup in runtime

Hi Jeroen,

Quoted 25 lines · Jeroen Hofstee

Hello Dmitry,

Quoted 22 lines · Dmitry Lifshitz

Add callback with __weak annotation to allow setup of environment partition number in runtime from a board file.

Propagate mmc_switch_part() return value into init_mmc_for_env() instead of -1 in case of failure.

---
  common/env_mmc.c |   35 +++++++++++++++++++++++------------
  1 files changed, 23 insertions(+), 12 deletions(-)
common/env_mmc.c +0 -1
index 7da10e6..a7621a8 100644
@@ -62,16 +62,36 @@ int env_init(void)
      return 0;
  }
  -static int init_mmc_for_env(struct mmc *mmc)
-{
  #ifdef CONFIG_SYS_MMC_ENV_PART
Quoted 8 lines

common/env_mmc.c int env_init(void) · line 70

Quoted 5 lines
common/env_mmc.c +5 -0
+__weak uint mmc_get_env_part(struct mmc *mmc)
+{
+    return CONFIG_SYS_MMC_ENV_PART;
+}
+

mmc_get_env_part lacks a prototype and there seems to be no "strong version" / user of this code.

Thanks for finding this one.
Indeed we forgot to add a prototype - will fix that shortly.

As to the strong version - it is already upstream:
1c8c36f (cm-t54: add environment partition runtime detection)

Signature · 2 lines
Regards,
Igor.
#3 lore raw

PATCH 1/2 env_mmc: add mmc_get_env_addr() prototype

In reply to Dmitry Lifshitz

Add missing mmc_get_env_addr() prototype in environment.h

---
 include/environment.h |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
include/environment.h +6 -0
index 08679ae..d7a1adf 100644
@@ -180,6 +180,12 @@ extern unsigned char env_get_char_spec(int);
 extern void env_reloc(void);
 #endif
 
+#ifdef CONFIG_ENV_IS_IN_MMC
+#include <mmc.h>
+
+extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
+#endif
+
 #ifndef DO_DEPS_ONLY
 
 #include <env_attr.h>
Signature · 1 line
1.7.5.4
#4 lore raw

PATCH v2 2/2 env_mmc: support env partition setup in runtime

Add callback with __weak annotation to allow setup of environment partition number in runtime from a board file.

Propagate mmc_switch_part() return value into init_mmc_for_env() instead of -1 in case of failure.

---

Changes in v2:

* Added mmc_get_env_part() proto in environment.h.

 common/env_mmc.c      |   35 +++++++++++++++++++++++------------
 include/environment.h |    3 +++
 2 files changed, 26 insertions(+), 12 deletions(-)
common/env_mmc.c +23 -12
index 7da10e6..a7621a8 100644
@@ -62,16 +62,36 @@ int env_init(void)
 	return 0;
 }
 
-static int init_mmc_for_env(struct mmc *mmc)
-{
 #ifdef CONFIG_SYS_MMC_ENV_PART
+__weak uint mmc_get_env_part(struct mmc *mmc)
+{
+	return CONFIG_SYS_MMC_ENV_PART;
+}
+
+static int mmc_set_env_part(struct mmc *mmc)
+{
+	uint part = mmc_get_env_part(mmc);
 	int dev = CONFIG_SYS_MMC_ENV_DEV;
+	int ret = 0;
 
 #ifdef CONFIG_SPL_BUILD
 	dev = 0;
 #endif
+
+	if (part != mmc->part_num) {
+		ret = mmc_switch_part(dev, part);
+		if (ret)
+			puts("MMC partition switch failed\n");
+	}
+
+	return ret;
+}
+#else
+static inline int mmc_set_env_part(struct mmc *mmc) {return 0; };
 #endif
 
+static int init_mmc_for_env(struct mmc *mmc)
+{
 	if (!mmc) {
 		puts("No MMC card found\n");
 		return -1;
@@ -82,16 +102,7 @@ static int init_mmc_for_env(struct mmc *mmc)
 		return -1;
 	}
 
-#ifdef CONFIG_SYS_MMC_ENV_PART
-	if (CONFIG_SYS_MMC_ENV_PART != mmc->part_num) {
-		if (mmc_switch_part(dev, CONFIG_SYS_MMC_ENV_PART)) {
-			puts("MMC partition switch failed\n");
-			return -1;
-		}
-	}
-#endif
-
-	return 0;
+	return mmc_set_env_part(mmc);
 }
 
 static void fini_mmc_for_env(struct mmc *mmc)
include/environment.h +3 -0
index d7a1adf..1fdbdad 100644
@@ -184,6 +184,9 @@ extern void env_reloc(void);
 #include <mmc.h>
 
 extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
+# ifdef CONFIG_SYS_MMC_ENV_PART
+extern uint mmc_get_env_part(struct mmc *mmc);
+# endif
 #endif
 
 #ifndef DO_DEPS_ONLY
Signature · 1 line
1.7.5.4
#5 lore raw

PATCH v2 2/2 env_mmc: support env partition setup in runtime

Hi Dmitry,

Quoted 95 lines · Dmitry Lifshitz

Add callback with __weak annotation to allow setup of environment partition number in runtime from a board file.

Propagate mmc_switch_part() return value into init_mmc_for_env() instead of -1 in case of failure.

---

Changes in v2:

* Added mmc_get_env_part() proto in environment.h.

common/env_mmc.c | 35 +++++++++++++++++++++++------------
include/environment.h | 3 +++

2 files changed, 26 insertions(+), 12 deletions(-)
common/env_mmc.c +23 -12
index 7da10e6..a7621a8 100644
@@ -62,16 +62,36 @@ int env_init(void)
 	return 0;
 }
 
-static int init_mmc_for_env(struct mmc *mmc)
-{
 #ifdef CONFIG_SYS_MMC_ENV_PART
+__weak uint mmc_get_env_part(struct mmc *mmc)
+{
+	return CONFIG_SYS_MMC_ENV_PART;
+}
+
+static int mmc_set_env_part(struct mmc *mmc)
+{
+	uint part = mmc_get_env_part(mmc);
 	int dev = CONFIG_SYS_MMC_ENV_DEV;
+	int ret = 0;
 
 #ifdef CONFIG_SPL_BUILD
 	dev = 0;
 #endif
+
+	if (part != mmc->part_num) {
+		ret = mmc_switch_part(dev, part);
+		if (ret)
+			puts("MMC partition switch failed\n");
+	}
+
+	return ret;
+}
+#else
+static inline int mmc_set_env_part(struct mmc *mmc) {return 0; };
 #endif
 
+static int init_mmc_for_env(struct mmc *mmc)
+{
 	if (!mmc) {
 		puts("No MMC card found\n");
 		return -1;
@@ -82,16 +102,7 @@ static int init_mmc_for_env(struct mmc *mmc)
 		return -1;
 	}
 
-#ifdef CONFIG_SYS_MMC_ENV_PART
-	if (CONFIG_SYS_MMC_ENV_PART != mmc->part_num) {
-		if (mmc_switch_part(dev, CONFIG_SYS_MMC_ENV_PART)) {
-			puts("MMC partition switch failed\n");
-			return -1;
-		}
-	}
-#endif
-
-	return 0;
+	return mmc_set_env_part(mmc);
 }
 
 static void fini_mmc_for_env(struct mmc *mmc)
include/environment.h +3 -0
index d7a1adf..1fdbdad 100644
@@ -184,6 +184,9 @@ extern void env_reloc(void);
 #include <mmc.h>
 
 extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
+# ifdef CONFIG_SYS_MMC_ENV_PART
+extern uint mmc_get_env_part(struct mmc *mmc);
+# endif
 #endif
 
 #ifndef DO_DEPS_ONLY
Signature · 1 line
1.7.5.4

Applied, thanks.

-- Pantelis

#6 lore raw

PATCH 1/2 env_mmc: add mmc_get_env_addr() prototype

In reply to Dmitry Lifshitz

Hi Dmitry,

Quoted 26 lines · Dmitry Lifshitz

Add missing mmc_get_env_addr() prototype in environment.h

---
include/environment.h | 6 ++++++

1 files changed, 6 insertions(+), 0 deletions(-)
include/environment.h +6 -0
index 08679ae..d7a1adf 100644
@@ -180,6 +180,12 @@ extern unsigned char env_get_char_spec(int);
 extern void env_reloc(void);
 #endif
 
+#ifdef CONFIG_ENV_IS_IN_MMC
+#include <mmc.h>
+
+extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
+#endif
+
 #ifndef DO_DEPS_ONLY
 
 #include <env_attr.h>
Signature · 1 line
1.7.5.4

Applied, thanks.

-- Pantelis