Message ID | CAOMZO5ChvMsYsFK4wq_RNE5wFFv+HS7VQ6vZhdajvCVdgrDXKg@mail.gmail.com |
---|---|
State | Not Applicable |
Delegated to: | Simon Glass |
Headers | show |
On Thursday, August 06, 2015 at 03:25:22 PM, Fabio Estevam wrote: > Hi, > > I am trying to use spi_flash_probe() inside SPL on a custom mx6 board. > > The idea is to read some parameters from the SPI NOR flash and configure > the DDR accordingly. > > This is similar to what gw_ventana_spl.c does, but it reads from i2c > eeprom instead of SPI NOR. > > Here are the changes just to illustrate the problem: I understand that you need to call spi_flash_probe() in board_init_f() at which point you still have no malloc() area available, so it fails with -ENOMEM or something like that, correct ? What you can probably try is to define CONFIG_SYS_MALLOC_F_LEN and do the following before doing spi_flash_probe(): static u8 array[128] __aligned(32); gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; gd->malloc_ptr = array; This might work, but is nasty. Best regards, Marek Vasut
Hi Fabio, On 06/08/2015 15:25, Fabio Estevam wrote: > Hi, > > I am trying to use spi_flash_probe() inside SPL on a custom mx6 board. > > The idea is to read some parameters from the SPI NOR flash and configure > the DDR accordingly. > > This is similar to what gw_ventana_spl.c does, but it reads from i2c > eeprom instead of SPI NOR. > > Here are the changes just to illustrate the problem: > > --- a/board/freescale/mx6sabresd/mx6sabresd.c > +++ b/board/freescale/mx6sabresd/mx6sabresd.c > @@ -692,6 +692,19 @@ int checkboard(void) > #ifdef CONFIG_SPL_BUILD > #include <spl.h> > #include <libfdt.h> > +#include <spi_flash.h> > +#include <spi.h> > + > +static int read_spi_flash(void) > +{ > + struct spi_flash *spi; > + char buf[2]; > + > + spi = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, > + CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); > + return spi_flash_read(spi, 0, 2, buf); > +} > > const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = { > .dram_sdclk_0 = 0x00020030, > @@ -837,6 +850,8 @@ void board_init_f(ulong dummy) > /* UART clocks enabled and gd valid - init serial console */ > preloader_console_init(); > > + read_spi_flash(); > + > /* DDR initialization */ > spl_dram_init(); > > diff --git a/include/configs/mx6sabresd.h b/include/configs/mx6sabresd.h > index 41162ca..f5dfaf7 100644 > --- a/include/configs/mx6sabresd.h > +++ b/include/configs/mx6sabresd.h > @@ -12,6 +12,10 @@ > #ifdef CONFIG_SPL > #define CONFIG_SPL_LIBCOMMON_SUPPORT > #define CONFIG_SPL_MMC_SUPPORT > +#define CONFIG_SPL_SPI_SUPPORT > +#define CONFIG_SPL_SPI_FLASH_SUPPORT > +#define CONFIG_SYS_SPI_U_BOOT_OFFS (64 * 1024) > +#define CONFIG_SPL_SPI_LOAD > #include "imx6_spl.h" > #endif > > @@ -35,6 +39,12 @@ > #define CONFIG_SYS_MMC_ENV_DEV 1 /* SDHC3 */ > #endif > > +#define CONFIG_ENV_SECT_SIZE (64 * 1024) > +#define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS > +#define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS > +#define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE > +#define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED > + > #define CONFIG_CMD_PCI > #ifdef CONFIG_CMD_PCI > #define CONFIG_PCI > > The when I run it: > > U-Boot SPL 2015.07-08202-g6dcdca1-dirty (Aug 06 2015 - 10:18:33) > mxc_spi: SPI Slave not allocated ! > > spi_flash_probe() ---> spi_setup_slave() ----> spi_alloc_slave() which > fails on mxc_spi.c Right - if I remember well, spi_alloc requires a full functional malloc, and then fails. > > As read_spi_flash() is called prior to the DDR initialization, > spi_alloc_slave() fails. > > Is there a way to avoid calling spi_alloc_slave() in the SPL case? > > Any ideas on how to fix this? There is the possibility to set a malloc area inside SPL: CONFIG_SYS_SPL_MALLOC_START CONFIG_SYS_SPL_MALLOC_SIZE you do not need a lot of space, and you can try to put it inside the IRAM. This should guarantee that spi_alloc_slave() works. Best regards, Stefano
--- a/board/freescale/mx6sabresd/mx6sabresd.c +++ b/board/freescale/mx6sabresd/mx6sabresd.c @@ -692,6 +692,19 @@ int checkboard(void) #ifdef CONFIG_SPL_BUILD #include <spl.h> #include <libfdt.h> +#include <spi_flash.h> +#include <spi.h> + +static int read_spi_flash(void) +{ + struct spi_flash *spi; + char buf[2]; + + spi = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, + CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); + return spi_flash_read(spi, 0, 2, buf); +} const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = { .dram_sdclk_0 = 0x00020030, @@ -837,6 +850,8 @@ void board_init_f(ulong dummy) /* UART clocks enabled and gd valid - init serial console */ preloader_console_init(); + read_spi_flash(); + /* DDR initialization */ spl_dram_init(); diff --git a/include/configs/mx6sabresd.h b/include/configs/mx6sabresd.h index 41162ca..f5dfaf7 100644 --- a/include/configs/mx6sabresd.h +++ b/include/configs/mx6sabresd.h @@ -12,6 +12,10 @@ #ifdef CONFIG_SPL #define CONFIG_SPL_LIBCOMMON_SUPPORT #define CONFIG_SPL_MMC_SUPPORT +#define CONFIG_SPL_SPI_SUPPORT +#define CONFIG_SPL_SPI_FLASH_SUPPORT +#define CONFIG_SYS_SPI_U_BOOT_OFFS (64 * 1024) +#define CONFIG_SPL_SPI_LOAD #include "imx6_spl.h" #endif @@ -35,6 +39,12 @@ #define CONFIG_SYS_MMC_ENV_DEV 1 /* SDHC3 */ #endif +#define CONFIG_ENV_SECT_SIZE (64 * 1024) +#define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS +#define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS +#define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE +#define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED + #define CONFIG_CMD_PCI #ifdef CONFIG_CMD_PCI #define CONFIG_PCI