Add BOOT_DEVICE_SPINAND option and use it for sunxi

This commit is contained in:
Jookia 2023-12-08 09:44:13 +11:00
parent cd95fd413d
commit 2c97cf9958
7 changed files with 25 additions and 9 deletions

View File

@ -16,6 +16,7 @@
#define SUNXI_BOOTED_FROM_NAND 1
#define SUNXI_BOOTED_FROM_MMC2 2
#define SUNXI_BOOTED_FROM_SPI 3
#define SUNXI_BOOTED_FROM_SPINAND 4
/*
* Values taken from the F1C200s BootROM stack

View File

@ -22,6 +22,7 @@ enum {
BOOT_DEVICE_NOR,
BOOT_DEVICE_UART,
BOOT_DEVICE_SPI,
BOOT_DEVICE_SPINAND,
BOOT_DEVICE_USB,
BOOT_DEVICE_SATA,
BOOT_DEVICE_I2C,

View File

@ -234,11 +234,12 @@ static int suniv_get_boot_source(void)
switch (brom_call) {
case SUNIV_BOOTED_FROM_MMC0:
return SUNXI_BOOTED_FROM_MMC0;
case SUNIV_BOOTED_FROM_SPI:
case SUNIV_BOOTED_FROM_NAND:
return SUNXI_BOOTED_FROM_SPI;
case SUNIV_BOOTED_FROM_MMC1:
return SUNXI_BOOTED_FROM_MMC2;
case SUNIV_BOOTED_FROM_SPI:
return SUNXI_BOOTED_FROM_SPINAND;
}
/* If we get here something went wrong try to boot from FEL.*/
printf("Unknown boot source from BROM: 0x%x\n", brom_call);
@ -318,6 +319,8 @@ uint32_t sunxi_get_boot_device(void)
return BOOT_DEVICE_MMC2;
case SUNXI_BOOTED_FROM_SPI:
return BOOT_DEVICE_SPI;
case SUNXI_BOOTED_FROM_SPINAND:
return BOOT_DEVICE_SPINAND;
}
panic("Unknown boot source %d\n", boot_source);

View File

@ -459,6 +459,7 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
int ret = 0;
uint32_t load_offset = sunxi_get_spl_size();
struct spl_load_info load;
bool allow_raw = false;
load_offset = max_t(uint32_t, load_offset, CONFIG_SYS_SPI_U_BOOT_OFFS);
@ -469,21 +470,28 @@ static int spl_spi_load_image(struct spl_image_info *spl_image,
spi0_init();
switch (bootdev->boot_device) {
#if defined(CONFIG_SPL_SPI_SUNXI_NAND)
spi0_nand_reset();
load.read = spi_load_read_nand;
ret = spl_spi_try_load(spl_image, bootdev, &load, load_offset, false);
if (!ret)
goto out;
case BOOT_DEVICE_SPINAND:
spi0_nand_reset();
load.read = spi_load_read_nand;
break;
#endif
case BOOT_DEVICE_SPI:
load.read = spi_load_read_nor;
allow_raw = true;
break;
}
load.read = spi_load_read_nor;
ret = spl_spi_try_load(spl_image, bootdev, &load, load_offset, true);
ret = spl_spi_try_load(spl_image, bootdev, &load, load_offset, allow_raw);
out:
spi0_deinit();
return ret;
}
/* Use priorty 0 to override the default if it happens to be linked in */
SPL_LOAD_IMAGE_METHOD("sunxi SPI", 0, BOOT_DEVICE_SPI, spl_spi_load_image);
#if defined(CONFIG_SPL_SPI_SUNXI_NAND)
SPL_LOAD_IMAGE_METHOD("sunxi SPI NAND", 0, BOOT_DEVICE_SPINAND, spl_spi_load_image);
#endif

View File

@ -16,6 +16,7 @@ enum {
BOOT_DEVICE_NOR,
BOOT_DEVICE_UART,
BOOT_DEVICE_SPI,
BOOT_DEVICE_SPINAND,
BOOT_DEVICE_USB,
BOOT_DEVICE_SATA,
BOOT_DEVICE_I2C,

View File

@ -18,6 +18,7 @@ enum {
BOOT_DEVICE_NOR,
BOOT_DEVICE_UART,
BOOT_DEVICE_SPI,
BOOT_DEVICE_SPINAND,
BOOT_DEVICE_USB,
BOOT_DEVICE_SATA,
BOOT_DEVICE_NVME,

View File

@ -15,6 +15,7 @@ enum {
BOOT_DEVICE_CPGMAC,
BOOT_DEVICE_NOR,
BOOT_DEVICE_SPI,
BOOT_DEVICE_SPINAND,
};
/**