[U-Boot] [PATCH v3 1/2] env_mmc: configure environment offsets via device tree

This introduces the ability to override the environment offets from the device tree by setting the following nodes in '/config': 'u-boot,mmc-env-offset' - overrides CONFIG_ENV_OFFSET 'u-boot,mmc-env-offset-redundant' - overrides CONFIG_ENV_OFFSET_REDUND
To keep with the previous logic, the CONFIG_* defines still need to be available and the statically defined values become the defaults, when the corresponding properties are not set in the device-tree.
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com Acked-by: Simon Glass sjg@chromium.org ---
Changes in v3: - changes the config-check to depend on CONFIG_OF_CONTROL to detect if 'fdtdec_get_config_int' is available
Changes in v2: None
common/env_mmc.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/common/env_mmc.c b/common/env_mmc.c index a5d14d4..c10eec5 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -10,6 +10,7 @@
#include <command.h> #include <environment.h> +#include <fdtdec.h> #include <linux/stddef.h> #include <malloc.h> #include <memalign.h> @@ -36,15 +37,37 @@ DECLARE_GLOBAL_DATA_PTR; #define CONFIG_ENV_OFFSET 0 #endif
-__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +#if defined(CONFIG_OF_CONTROL) +static inline s64 mmc_offset(int copy) { - s64 offset; + const char *propname = "u-boot,mmc-env-offset"; + s64 defvalue = CONFIG_ENV_OFFSET;
- offset = CONFIG_ENV_OFFSET; -#ifdef CONFIG_ENV_OFFSET_REDUND +#if defined(CONFIG_ENV_OFFSET_REDUND) + if (copy) { + propname = "u-boot,mmc-env-offset-redundant"; + defvalue = CONFIG_ENV_OFFSET_REDUND; + } +#endif + + return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue); +} +#else +static inline s64 mmc_offset(int copy) +{ + s64 offset = CONFIG_ENV_OFFSET; + +#if defined(CONFIG_ENV_OFFSET_REDUND) if (copy) offset = CONFIG_ENV_OFFSET_REDUND; #endif + return offset; +} +#endif + +__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +{ + s64 offset = mmc_offset(copy);
if (offset < 0) offset += mmc->capacity;

Adding documentation on the new config properties: 'u-boot,mmc-env-offset' - overrides CONFIG_ENV_OFFSET 'u-boot,mmc-env-offset-redundant' - overrides CONFIG_ENV_OFFSET_REDUND
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
---
Changes in v3: None Changes in v2: - added documentation in config.txt
doc/device-tree-bindings/config.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/doc/device-tree-bindings/config.txt b/doc/device-tree-bindings/config.txt index d4bc1df..fe0e04a 100644 --- a/doc/device-tree-bindings/config.txt +++ b/doc/device-tree-bindings/config.txt @@ -21,6 +21,18 @@ u-boot,efi-partition-entries-offset
This setting will override any values configured via Kconfig.
+u-boot,mmc-env-offset +u-boot,mmc-env-offset-redundant + If present, the values of the 'u-boot,mmc-env-offset' and/or + of the u-boot,mmc-env-offset-redundant' properties overrides + CONFIG_ENV_OFFSET and CONFIG_ENV_OFFSET_REDUND, respectively, + for SD/MMC devices. + + Values are interpreted as the offset from the start of the + device, specified in bytes. It is assumed that the setting + will point at the beginning of a LBA and values that are not + LBA-aligned will be rounded up to the next LBA address. + u-boot,spl-payload-offset If present (and SPL is controlled by the device-tree), this allows to override the CONFIG_SYS_SPI_U_BOOT_OFFS setting using a value

On 10 May 2017 at 06:44, Philipp Tomsich philipp.tomsich@theobroma-systems.com wrote:
Adding documentation on the new config properties: 'u-boot,mmc-env-offset' - overrides CONFIG_ENV_OFFSET 'u-boot,mmc-env-offset-redundant' - overrides CONFIG_ENV_OFFSET_REDUND
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
Changes in v3: None Changes in v2:
- added documentation in config.txt
doc/device-tree-bindings/config.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

Hi Philipp,
On 05/10/2017 09:44 PM, Philipp Tomsich wrote:
This introduces the ability to override the environment offets from the device tree by setting the following nodes in '/config': 'u-boot,mmc-env-offset' - overrides CONFIG_ENV_OFFSET 'u-boot,mmc-env-offset-redundant' - overrides CONFIG_ENV_OFFSET_REDUND
To keep with the previous logic, the CONFIG_* defines still need to be available and the statically defined values become the defaults, when the corresponding properties are not set in the device-tree.
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com Acked-by: Simon Glass sjg@chromium.org
your patch has the compile error about building spl.
+common/built-in.o: In function `mmc_offset': +common/env_mmc.c:53: undefined reference to `fdtdec_get_config_int' +make[2]: *** [spl/u-boot-spl] Error 1 +make[1]: *** [spl/u-boot-spl] Error 2 +make: *** [sub-make] Error 2
Plz, fix this.
Best Regards, Jaehoon Chung
Changes in v3:
- changes the config-check to depend on CONFIG_OF_CONTROL to detect if 'fdtdec_get_config_int' is available
Changes in v2: None
common/env_mmc.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/common/env_mmc.c b/common/env_mmc.c index a5d14d4..c10eec5 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -10,6 +10,7 @@
#include <command.h> #include <environment.h> +#include <fdtdec.h> #include <linux/stddef.h> #include <malloc.h> #include <memalign.h> @@ -36,15 +37,37 @@ DECLARE_GLOBAL_DATA_PTR; #define CONFIG_ENV_OFFSET 0 #endif
-__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +#if defined(CONFIG_OF_CONTROL) +static inline s64 mmc_offset(int copy) {
- s64 offset;
- const char *propname = "u-boot,mmc-env-offset";
- s64 defvalue = CONFIG_ENV_OFFSET;
- offset = CONFIG_ENV_OFFSET;
-#ifdef CONFIG_ENV_OFFSET_REDUND +#if defined(CONFIG_ENV_OFFSET_REDUND)
- if (copy) {
propname = "u-boot,mmc-env-offset-redundant";
defvalue = CONFIG_ENV_OFFSET_REDUND;
- }
+#endif
- return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue);
+} +#else +static inline s64 mmc_offset(int copy) +{
- s64 offset = CONFIG_ENV_OFFSET;
+#if defined(CONFIG_ENV_OFFSET_REDUND) if (copy) offset = CONFIG_ENV_OFFSET_REDUND; #endif
- return offset;
+} +#endif
+__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +{
s64 offset = mmc_offset(copy);
if (offset < 0) offset += mmc->capacity;

Hi Jaehoon,
I haven’t been able to reproduce this on any our configs, but I believe to have caught the issue: testing the OF_CONTROL using defined(CONFIG_OF_CONTROL) gives a false positive in the SPL build, as the SPL infrastructure does not undefine it … yet, lib/Makefile uses CONFIG_$(SPL_)OF_CONTROL to control the inclusion of fdtdec.o.
Please let me know if the resubmitted (v4) series fixes the issue on the configurations that you see the error on. If not, I’d appreciate a pointer to one of the broken configurations so I can reproduce locally.
Best regards, Philipp.
On 15 May 2017, at 23:33, Jaehoon Chung jh80.chung@samsung.com wrote:
Hi Philipp,
On 05/10/2017 09:44 PM, Philipp Tomsich wrote:
This introduces the ability to override the environment offets from the device tree by setting the following nodes in '/config': 'u-boot,mmc-env-offset' - overrides CONFIG_ENV_OFFSET 'u-boot,mmc-env-offset-redundant' - overrides CONFIG_ENV_OFFSET_REDUND
To keep with the previous logic, the CONFIG_* defines still need to be available and the statically defined values become the defaults, when the corresponding properties are not set in the device-tree.
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com Acked-by: Simon Glass sjg@chromium.org
your patch has the compile error about building spl.
+common/built-in.o: In function `mmc_offset': +common/env_mmc.c:53: undefined reference to `fdtdec_get_config_int' +make[2]: *** [spl/u-boot-spl] Error 1 +make[1]: *** [spl/u-boot-spl] Error 2 +make: *** [sub-make] Error 2
Plz, fix this.
Best Regards, Jaehoon Chung
Changes in v3:
- changes the config-check to depend on CONFIG_OF_CONTROL to detect
if 'fdtdec_get_config_int' is available
Changes in v2: None
common/env_mmc.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/common/env_mmc.c b/common/env_mmc.c index a5d14d4..c10eec5 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -10,6 +10,7 @@
#include <command.h> #include <environment.h> +#include <fdtdec.h> #include <linux/stddef.h> #include <malloc.h> #include <memalign.h> @@ -36,15 +37,37 @@ DECLARE_GLOBAL_DATA_PTR; #define CONFIG_ENV_OFFSET 0 #endif
-__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +#if defined(CONFIG_OF_CONTROL) +static inline s64 mmc_offset(int copy) {
- s64 offset;
- const char *propname = "u-boot,mmc-env-offset";
- s64 defvalue = CONFIG_ENV_OFFSET;
- offset = CONFIG_ENV_OFFSET;
-#ifdef CONFIG_ENV_OFFSET_REDUND +#if defined(CONFIG_ENV_OFFSET_REDUND)
- if (copy) {
propname = "u-boot,mmc-env-offset-redundant";
defvalue = CONFIG_ENV_OFFSET_REDUND;
- }
+#endif
- return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue);
+} +#else +static inline s64 mmc_offset(int copy) +{
- s64 offset = CONFIG_ENV_OFFSET;
+#if defined(CONFIG_ENV_OFFSET_REDUND) if (copy) offset = CONFIG_ENV_OFFSET_REDUND; #endif
- return offset;
+} +#endif
+__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) +{
s64 offset = mmc_offset(copy);
if (offset < 0) offset += mmc->capacity;
participants (4)
-
Dr. Philipp Tomsich
-
Jaehoon Chung
-
Philipp Tomsich
-
Simon Glass