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.si...@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@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@ff0b0000 ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii eth0: ethernet@ff0b0000, eth1: ethernet@ff0c0000 RTC #0 - rtc@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@2: data_buf i2c_write failed, err:-121 usb_onboard_hub hub@2: onboard i2c init failed: -121 Scanning bus usb@fe200000 failed, error -121 usb_onboard_hub hub@2: data_buf i2c_write failed, err:-121 usb_onboard_hub hub@2: onboard i2c init failed: -121 Scanning bus usb@fe300000 failed, error -121 Bus usb@fe200000: No USB Device found Bus usb@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