[PATCH] env: spi: Fix gd->env_valid for the first write

Michal Simek michal.simek at amd.com
Tue Aug 19 16:25:41 CEST 2025


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.

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

U-Boot SPL 2025.10-rc2-00066-gf2925ed31728 (Aug 19 2025 - 16:18:55 +0200)
Loading new PMUFW cfg obj (1836 bytes)
PMUFW:	v1.1
Silicon version:	3
EL Level:	EL3
Secure Boot:	not authenticated, not encrypted
Multiboot:	64
Trying to boot from SPI
SPI offset:	0x280000
load_simple_fit: Skip load 'tee': image size is 0!
NOTICE:  BL31: Non secure code at 0x8000000
NOTICE:  BL31: v2.10.0	(release):xlnx_rebase_v2.10_2024.1-27-g14cea4616-dirty
NOTICE:  BL31: Built : 04:42:28, Sep 19 2024

U-Boot 2025.10-rc2-00066-gf2925ed31728 (Aug 19 2025 - 16:18:55 +0200)

CPU:   ZynqMP
Silicon: v3
Chip:  xck26
Detected name: zynqmp-sm-k26-xcl2gc-ed-revB-sck-kr-g-revB
Model: ZynqMP KR260 revB
Board: Xilinx ZynqMP
DRAM:  2 GiB (total 4 GiB)
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SM-K26-XCL2GC-ED
 Serial No: 50572B111F2H
 Part Number: 5057-02ED
 File ID: 0x0
 Revision Number: B
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: 51011A21CT4G
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: B
EL Level:	EL2
Secure Boot:	not authenticated, not encrypted
Core:  102 devices, 36 uclasses, devicetree: fit
MMC:   mmc at ff160000: 0
Loading Environment from SPIFlash... SF: Detected mt25qu512a with page size 256 Bytes, erase size 64 KiB, total 64 MiB
*** Warning - bad CRC, using default environment

Variables from 0
In:    serial
Out:   serial,vidconsole
Err:   serial,vidconsole
No USB device found
Bootmode: QSPI_MODE
Reset reason:	SOFT
Net:
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
Get shared mii bus on ethernet at ff0b0000

ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet at ff0b0000, eth1: ethernet at ff0c0000

RTC #0 - rtc at ffa60000
!!! For TPM reset a full power cycle or pressing the POR_B button is required !!!
starting USB...
Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
usb_onboard_hub hub at 2: data_buf i2c_write failed, err:-121
usb_onboard_hub hub at 2: onboard i2c init failed: -121
Scanning bus usb at fe200000 failed, error -121
usb_onboard_hub hub at 2: data_buf i2c_write failed, err:-121
usb_onboard_hub hub at 2: onboard i2c init failed: -121
Scanning bus usb at fe300000 failed, error -121
Bus usb at fe200000: No USB Device found
Bus usb at fe300000: No USB Device found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0
ZynqMP>
ZynqMP> mtd read "U-Boot storage variables" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: ffffffff ffffffff ffffffff ffffffff  ................
00001010: ffffffff ffffffff ffffffff ffffffff  ................
00001020: ffffffff ffffffff ffffffff ffffffff  ................
00001030: ffffffff ffffffff ffffffff ffffffff  ................
00001040: ffffffff ffffffff ffffffff ffffffff  ................
00001050: ffffffff ffffffff ffffffff ffffffff  ................
00001060: ffffffff ffffffff ffffffff ffffffff  ................
00001070: ffffffff ffffffff ffffffff ffffffff  ................
00001080: ffffffff ffffffff ffffffff ffffffff  ................
00001090: ffffffff ffffffff ffffffff ffffffff  ................
000010a0: ffffffff ffffffff ffffffff ffffffff  ................
000010b0: ffffffff ffffffff ffffffff ffffffff  ................
000010c0: ffffffff ffffffff ffffffff ffffffff  ................
000010d0: ffffffff ffffffff ffffffff ffffffff  ................
000010e0: ffffffff ffffffff ffffffff ffffffff  ................
000010f0: ffffffff ffffffff ffffffff ffffffff  ................
ZynqMP> mtd read "U-Boot storage variables backup" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: ffffffff ffffffff ffffffff ffffffff  ................
00001010: ffffffff ffffffff ffffffff ffffffff  ................
00001020: ffffffff ffffffff ffffffff ffffffff  ................
00001030: ffffffff ffffffff ffffffff ffffffff  ................
00001040: ffffffff ffffffff ffffffff ffffffff  ................
00001050: ffffffff ffffffff ffffffff ffffffff  ................
00001060: ffffffff ffffffff ffffffff ffffffff  ................
00001070: ffffffff ffffffff ffffffff ffffffff  ................
00001080: ffffffff ffffffff ffffffff ffffffff  ................
00001090: ffffffff ffffffff ffffffff ffffffff  ................
000010a0: ffffffff ffffffff ffffffff ffffffff  ................
000010b0: ffffffff ffffffff ffffffff ffffffff  ................
000010c0: ffffffff ffffffff ffffffff ffffffff  ................
000010d0: ffffffff ffffffff ffffffff ffffffff  ................
000010e0: ffffffff ffffffff ffffffff ffffffff  ................
000010f0: ffffffff ffffffff ffffffff ffffffff  ................
ZynqMP> savee
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash... offset 2200000
done
Valid environment: 2
OK
ZynqMP> mtd read "U-Boot storage variables" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: 5d691224 63726101 72613d68 7561006d  $.i].arch=arm.au
00001010: 6f6c6f74 6e3d6461 6162006f 61726475  toload=no.baudra
00001020: 313d6574 30323531 6f620030 3d647261  te=115200.board=
00001030: 716e797a 6200706d 6472616f 6e616d5f  zynqmp.board_man
00001040: 63616675 65727574 49583d72 584e494c  ufacturer=XILINX
00001050: 616f6200 6e5f6472 3d656d61 4b2d4d53  .board_name=SM-K
00001060: 582d3632 47324c43 44452d43 616f6200  26-XCL2GC-ED.boa
00001070: 725f6472 423d7665 616f6200 735f6472  rd_rev=B.board_s
00001080: 61697265 30353d6c 42323735 46313131  erial=50572B111F
00001090: 62004832 6472616f 7465735f 723d7075  2H.board_setup=r
000010a0: 64206374 30207665 797a203b 706d716e  tc dev 0; zynqmp
000010b0: 696d6d20 72775f6f 20657469 46467830   mmio_write 0xFF
000010c0: 30304143 30203031 66666678 203b3020  CA0010 0xfff 0;
000010d0: 74206669 20747365 61637b24 5f316472  if test ${card1_
000010e0: 656d616e 203d207d 2d4b4353 472d564b  name} = SCK-KV-G
000010f0: 6874203b 72206e65 74206e75 6b5f6d70  ; then run tpm_k
ZynqMP> mtd read "U-Boot storage variables backup" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: ffffffff ffffff00 ffffffff ffffffff  ................
00001010: ffffffff ffffffff ffffffff ffffffff  ................
00001020: ffffffff ffffffff ffffffff ffffffff  ................
00001030: ffffffff ffffffff ffffffff ffffffff  ................
00001040: ffffffff ffffffff ffffffff ffffffff  ................
00001050: ffffffff ffffffff ffffffff ffffffff  ................
00001060: ffffffff ffffffff ffffffff ffffffff  ................
00001070: ffffffff ffffffff ffffffff ffffffff  ................
00001080: ffffffff ffffffff ffffffff ffffffff  ................
00001090: ffffffff ffffffff ffffffff ffffffff  ................
000010a0: ffffffff ffffffff ffffffff ffffffff  ................
000010b0: ffffffff ffffffff ffffffff ffffffff  ................
000010c0: ffffffff ffffffff ffffffff ffffffff  ................
000010d0: ffffffff ffffffff ffffffff ffffffff  ................
000010e0: ffffffff ffffffff ffffffff ffffffff  ................
000010f0: ffffffff ffffffff ffffffff ffffffff  ................
ZynqMP> savee
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash... offset 2200000
done
Valid environment: 1
OK
ZynqMP> mtd read "U-Boot storage variables" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: 5d691224 63726101 72613d68 7561006d  $.i].arch=arm.au
00001010: 6f6c6f74 6e3d6461 6162006f 61726475  toload=no.baudra
00001020: 313d6574 30323531 6f620030 3d647261  te=115200.board=
00001030: 716e797a 6200706d 6472616f 6e616d5f  zynqmp.board_man
00001040: 63616675 65727574 49583d72 584e494c  ufacturer=XILINX
00001050: 616f6200 6e5f6472 3d656d61 4b2d4d53  .board_name=SM-K
00001060: 582d3632 47324c43 44452d43 616f6200  26-XCL2GC-ED.boa
00001070: 725f6472 423d7665 616f6200 735f6472  rd_rev=B.board_s
00001080: 61697265 30353d6c 42323735 46313131  erial=50572B111F
00001090: 62004832 6472616f 7465735f 723d7075  2H.board_setup=r
000010a0: 64206374 30207665 797a203b 706d716e  tc dev 0; zynqmp
000010b0: 696d6d20 72775f6f 20657469 46467830   mmio_write 0xFF
000010c0: 30304143 30203031 66666678 203b3020  CA0010 0xfff 0;
000010d0: 74206669 20747365 61637b24 5f316472  if test ${card1_
000010e0: 656d616e 203d207d 2d4b4353 472d564b  name} = SCK-KV-G
000010f0: 6874203b 72206e65 74206e75 6b5f6d70  ; then run tpm_k
ZynqMP> mtd read "U-Boot storage variables backup" 1000
Reading 131072 byte(s) at offset 0x00000000
ZynqMP> md 1000
00001000: ffffffff ffffff00 ffffffff ffffffff  ................
00001010: ffffffff ffffffff ffffffff ffffffff  ................
00001020: ffffffff ffffffff ffffffff ffffffff  ................
00001030: ffffffff ffffffff ffffffff ffffffff  ................
00001040: ffffffff ffffffff ffffffff ffffffff  ................
00001050: ffffffff ffffffff ffffffff ffffffff  ................
00001060: ffffffff ffffffff ffffffff ffffffff  ................
00001070: ffffffff ffffffff ffffffff ffffffff  ................
00001080: ffffffff ffffffff ffffffff ffffffff  ................
00001090: ffffffff ffffffff ffffffff ffffffff  ................
000010a0: ffffffff ffffffff ffffffff ffffffff  ................
000010b0: ffffffff ffffffff ffffffff ffffffff  ................
000010c0: ffffffff ffffffff ffffffff ffffffff  ................
000010d0: ffffffff ffffffff ffffffff ffffffff  ................
000010e0: ffffffff ffffffff ffffffff ffffffff  ................
000010f0: ffffffff ffffffff ffffffff ffffffff  ................
ZynqMP> savee
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash... offset 2220000
done
Valid environment: 2
OK
ZynqMP> savee
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash... offset 2200000
done
Valid environment: 1
OK
ZynqMP>

---
 env/sf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/env/sf.c b/env/sf.c
index 961e853eaef7..57ceaeaf3d89 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: b589e7f533826088aa8c83c13a1afd860edd7340
branch: debian-sent3


More information about the U-Boot mailing list