All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] env: spi: Fix gd->env_valid for the first write
@ 2025-09-10  7:26 Michal Simek
  2025-09-11  3:28 ` Marek Vasut
  0 siblings, 1 reply; 12+ messages in thread
From: Michal Simek @ 2025-09-10  7:26 UTC (permalink / raw)
  To: u-boot, git, Marek Vasut, Tom Rini
  Cc: Casey Connolly, Ilias Apalodimas, Joe Hershberger, Marek Vasut,
	Simon Glass

In case of ENV_INVALID (uninitialized variables) the first env location
should be used for storing variables.
That's why change the logic how env_valid is setup to be aligned with
offset calculation.
This will also fix the print about Valid environment is showing proper
location where variables are saved for the first time.
And also fixes behavior where the first two writes were going to the
first location instead of the first to the first location and second to
second location.

Signed-off-by: Michal Simek <michal.simek@amd.com>
---

Changes in v2:
- Simplify commit message

Origin commit message with more technical details.

When both location for variables are not valid (or empty) gd->env_valid is
0 (ENV_INVALID) which is setup by
env_sf_load()/env_import_redund()/env_check_redund() calls.

When saveenv is called in case of SPI env_sf_save() is called which
contains logic which describes new/old variable locations.

if (gd->env_valid == ENV_VALID) {
        env_new_offset = CONFIG_ENV_OFFSET_REDUND;
        env_offset = CONFIG_ENV_OFFSET;
} else {
        env_new_offset = CONFIG_ENV_OFFSET;
        env_offset = CONFIG_ENV_OFFSET_REDUND;
}

In case of ENV_INVALID option the first location is used (else part)
and variables are saved with ENV_REDUND_ACTIVE flag.
The second location flag is rewritten to ENV_REDUND_OBSOLETE.

And
gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND;
is executed. env_valid is ENV_INVALID that's why ENV_REDUND is setup
but that's not correct because the first location has been written and not
the second one.
That is confirmed by
printf("Valid environment: %d\n", (int)gd->env_valid);
which is showing number 2 (ENV_REDUND).

That's why change the logic how env_valid is setup to be aligned with
offset calculation which also cover the case where initial state is
ENV_INVALID.
Then print about Valid environment is showing proper location where
variables are saved for the first time.
But also it is fixing behavior where the first two writes are going to the
first location instead of the first to the first location and second to
second location. Alternation is happening after it.

v1: https://lore.kernel.org/r/03aa59f72f47fe0ecafd1e1ca52cbb8a5a8f0446.1755613540.git.michal.simek@amd.com
---
 env/sf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/env/sf.c b/env/sf.c
index 0b70e18b9afa..0e27a020643e 100644
--- a/env/sf.c
+++ b/env/sf.c
@@ -148,7 +148,7 @@ static int env_sf_save(void)
 
 	puts("done\n");
 
-	gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND;
+	gd->env_valid = gd->env_valid == ENV_VALID ? ENV_REDUND : ENV_VALID;
 
 	printf("Valid environment: %d\n", (int)gd->env_valid);
 
-- 
2.43.0

base-commit: 354392a63cf18523a6714d3b486e68dd92ba2ca7
branch: debian-sent3

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-09-30 14:59 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-10  7:26 [PATCH v2] env: spi: Fix gd->env_valid for the first write Michal Simek
2025-09-11  3:28 ` Marek Vasut
2025-09-11  5:40   ` Michal Simek
2025-09-22 14:02     ` Michal Simek
2025-09-22 14:51       ` Marek Vasut
2025-09-23 21:18         ` E Shattow
2025-09-29  7:08           ` Michal Simek
2025-09-29  9:49             ` E Shattow
2025-09-29 12:36               ` Michal Simek
2025-09-30  0:32                 ` E Shattow
2025-09-30 13:28                   ` Michal Simek
2025-09-30 14:59                     ` Tom Rini

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.