[U-Boot] [PATCH] powerpc/85xx: clean up and document the QE/FMAN microcode macros

Kumar Gala kumar.gala at freescale.com
Sat Nov 19 18:16:15 CET 2011


On Nov 8, 2011, at 5:40 PM, Timur Tabi wrote:

> Several macros are used to identify and locate the microcode binary image
> that U-boot needs to upload to the QE or Fman.  Both the QE and the Fman
> use the QE Firmware binary format to package their respective microcode data,
> which is why the same macros are used for both.  A given SOC will only have
> a QE or an Fman, so this is safe.
> 
> Unfortunately, the current macro definition and usage has inconsistencies.
> For example, CONFIG_SYS_FMAN_FW_ADDR was used to define the address of Fman
> firmware in NOR flash, but CONFIG_SYS_QE_FW_IN_NAND contains the address
> of NAND.  There's no way to know by looking at a variable how it's supposed
> to be used.
> 
> In the future, the code which uploads QE firmware and Fman firmware will
> be merged.
> 
> Signed-off-by: Timur Tabi <timur at freescale.com>
> ---
> README                              |   38 +++++++++++++++++++++++++++++++++++
> arch/powerpc/cpu/mpc85xx/cpu_init.c |   12 +++++-----
> arch/powerpc/cpu/mpc85xx/fdt.c      |    2 +-
> drivers/net/fm/fm.c                 |   32 ++++++++++++++--------------
> drivers/qe/qe.c                     |    4 +-
> include/configs/MPC8569MDS.h        |    3 +-
> include/configs/P1023RDS.h          |   10 +++++---
> include/configs/P2041RDB.h          |   13 +++++++----
> include/configs/corenet_ds.h        |   16 +++++++++-----
> include/configs/p1_p2_rdb_pc.h      |    5 ++-
> 10 files changed, 92 insertions(+), 43 deletions(-)
> 
> diff --git a/README b/README
> index c05c40a..33cd678 100644
> --- a/README
> +++ b/README
> @@ -3263,6 +3263,44 @@ Low Level (hardware related) configuration options:
> 		be used if available. These functions may be faster under some
> 		conditions but may increase the binary size.
> 
> +Freescale QE/FMAN Firmware Support:
> +-----------------------------------
> +
> +The Freescale QUICCEngine (QE) and Frame Manager (FMAN) both support the
> +loading of "firmware", which is encoded in the QE firmware binary format.
> +This firmware often needs to be loaded during U-Boot booting, so macros
> +are used to identify the storage device (NOR flash, SPI, etc) and the address
> +within that device.
> +
> +- CONFIG_SYS_QE_FMAN_FW_ADDR
> +	The address in the storage device where the firmware is located.  The
> +	meaning of this address depends on which CONFIG_SYS_QE_FW_IN_xxx macro
> +	is also specified.
> +
> +- CONFIG_SYS_QE_FMAN_FW_LENGTH
> +	The maximum possible size of the firmware.  The firmware binary format
> +	has a field that specifies the actual size of the firmware, but it
> +	might not be possible to read any part of the firmware unless some
> +	local storage is allocated to hold the entire firmware first.
> +
> +- CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +	Specifies that QE/FMAN firmware is located in NOR flash, mapped as
> +	normal addressable memory via the LBC.  CONFIG_SYS_FMAN_FW_ADDR is the
> +	virtual address in NOR flash.
> +
> +- CONFIG_SYS_QE_FMAN_FW_IN_NAND
> +	Specifies that QE/FMAN firmware is located in NAND flash.
> +	CONFIG_SYS_FMAN_FW_ADDR is the offset within NAND flash.
> +
> +- CONFIG_SYS_QE_FMAN_FW_IN_MMC
> +	Specifies that QE/FMAN firmware is located on the primary SD/MMC
> +	device.  CONFIG_SYS_FMAN_FW_ADDR is the byte offset on that device.
> +
> +- CONFIG_SYS_QE_FMAN_FW_IN_SPIFLASH
> +	Specifies that QE/FMAN firmware is located on the primary SPI
> +	device.  CONFIG_SYS_FMAN_FW_ADDR is the byte offset on that device.
> +
> +
> Building the Software:
> ======================
> 
> diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c
> index 0a4ce53..5e42955 100644
> --- a/arch/powerpc/cpu/mpc85xx/cpu_init.c
> +++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c
> @@ -38,7 +38,7 @@
> #include <asm/fsl_law.h>
> #include <asm/fsl_serdes.h>
> #include "mp.h"
> -#ifdef CONFIG_SYS_QE_FW_IN_NAND
> +#ifdef CONFIG_SYS_QE_FMAN_FW_IN_NAND
> #include <nand.h>
> #include <errno.h>
> #endif
> @@ -524,17 +524,17 @@ void cpu_secondary_init_r(void)
> {
> #ifdef CONFIG_QE
> 	uint qe_base = CONFIG_SYS_IMMR + 0x00080000; /* QE immr base */
> -#ifdef CONFIG_SYS_QE_FW_IN_NAND
> +#ifdef CONFIG_SYS_QE_FMAN_FW_IN_NAND
> 	int ret;
> -	size_t fw_length = CONFIG_SYS_QE_FW_LENGTH;
> +	size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH;
> 
> 	/* load QE firmware from NAND flash to DDR first */
> -	ret = nand_read(&nand_info[0], (loff_t)CONFIG_SYS_QE_FW_IN_NAND,
> -			&fw_length, (u_char *)CONFIG_SYS_QE_FW_ADDR);
> +	ret = nand_read(&nand_info[0], (loff_t)CONFIG_SYS_QE_FMAN_FW_IN_NAND,
> +			&fw_length, (u_char *)CONFIG_SYS_QE_FMAN_FW_ADDR);
> 
> 	if (ret && ret == -EUCLEAN) {
> 		printf ("NAND read for QE firmware at offset %x failed %d\n",
> -				CONFIG_SYS_QE_FW_IN_NAND, ret);
> +				CONFIG_SYS_QE_FMAN_FW_IN_NAND, ret);
> 	}
> #endif
> 	qe_init(qe_base);
> diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c
> index 9d31568..435bd1a 100644
> --- a/arch/powerpc/cpu/mpc85xx/fdt.c
> +++ b/arch/powerpc/cpu/mpc85xx/fdt.c
> @@ -466,7 +466,7 @@ void fdt_fixup_fman_firmware(void *blob)
> 		return;
> 	}
> 
> -	if (length > CONFIG_SYS_FMAN_FW_LENGTH) {
> +	if (length > CONFIG_SYS_QE_FMAN_FW_LENGTH) {
> 		printf("Fman firmware at %p is too large (size=%u)\n",
> 		       fmanfw, length);
> 		return;
> diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c
> index 23ef14b..3fadc34 100644
> --- a/drivers/net/fm/fm.c
> +++ b/drivers/net/fm/fm.c
> @@ -25,11 +25,11 @@
> #include "fm.h"
> #include "../../qe/qe.h"		/* For struct qe_firmware */
> 
> -#ifdef CONFIG_SYS_QE_FW_IN_NAND
> +#ifdef CONFIG_SYS_QE_FMAN_FW_IN_NAND
> #include <nand.h>
> #elif defined(CONFIG_SYS_QE_FW_IN_SPIFLASH)
> #include <spi_flash.h>
> -#elif defined(CONFIG_SYS_QE_FW_IN_MMC)
> +#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_MMC)
> #include <mmc.h>
> #endif
> 
> @@ -363,21 +363,21 @@ int fm_init_common(int index, struct ccsr_fman *reg)
> {
> 	int rc;
> 	char env_addr[32];
> -#if defined(CONFIG_SYS_FMAN_FW_ADDR)
> -	void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR;
> -#elif defined(CONFIG_SYS_QE_FW_IN_NAND)
> -	size_t fw_length = CONFIG_SYS_FMAN_FW_LENGTH;
> -	void *addr = malloc(CONFIG_SYS_FMAN_FW_LENGTH);
> +#if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR)
> +	void *addr = (void *)CONFIG_SYS_QE_FMAN_FW_ADDR;
> +#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND)
> +	size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH;
> +	void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
> 
> -	rc = nand_read(&nand_info[0], (loff_t)CONFIG_SYS_QE_FW_IN_NAND,
> +	rc = nand_read(&nand_info[0], (loff_t)CONFIG_SYS_QE_FMAN_FW_ADDR,
> 		       &fw_length, (u_char *)addr);
> 	if (rc == -EUCLEAN) {
> 		printf("NAND read of FMAN firmware at offset 0x%x failed %d\n",
> -			CONFIG_SYS_QE_FW_IN_NAND, rc);
> +			CONFIG_SYS_QE_FMAN_FW_ADDR, rc);
> 	}
> #elif defined(CONFIG_SYS_QE_FW_IN_SPIFLASH)
> 	struct spi_flash *ucode_flash;
> -	void *addr = malloc(CONFIG_SYS_FMAN_FW_LENGTH);
> +	void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
> 	int ret = 0;
> 
> 	ucode_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
> @@ -385,18 +385,18 @@ int fm_init_common(int index, struct ccsr_fman *reg)
> 	if (!ucode_flash)
> 		printf("SF: probe for ucode failed\n");
> 	else {
> -		ret = spi_flash_read(ucode_flash, CONFIG_SYS_QE_FW_IN_SPIFLASH,
> -				CONFIG_SYS_FMAN_FW_LENGTH, addr);
> +		ret = spi_flash_read(ucode_flash, CONFIG_SYS_QE_FMAN_FW_ADDR,
> +				CONFIG_SYS_QE_FMAN_FW_LENGTH, addr);
> 		if (ret)
> 			printf("SF: read for ucode failed\n");
> 		spi_flash_free(ucode_flash);
> 	}
> -#elif defined(CONFIG_SYS_QE_FW_IN_MMC)
> +#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_MMC)
> 	int dev = CONFIG_SYS_MMC_ENV_DEV;
> -	void *addr = malloc(CONFIG_SYS_FMAN_FW_LENGTH);
> -	u32 cnt = CONFIG_SYS_FMAN_FW_LENGTH / 512;
> +	void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
> +	u32 cnt = CONFIG_SYS_QE_FMAN_FW_LENGTH / 512;
> 	u32 n;
> -	u32 blk = CONFIG_SYS_QE_FW_IN_MMC / 512;
> +	u32 blk = CONFIG_SYS_QE_FMAN_FW_ADDR / 512;
> 	struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
> 
> 	if (!mmc)
> diff --git a/drivers/qe/qe.c b/drivers/qe/qe.c
> index c4ec2f4..9f71151 100644
> --- a/drivers/qe/qe.c
> +++ b/drivers/qe/qe.c
> @@ -170,11 +170,11 @@ void qe_init(uint qe_base)
> 	/* Init the QE IMMR base */
> 	qe_immr = (qe_map_t *)qe_base;
> 
> -#ifdef CONFIG_SYS_QE_FW_ADDR
> +#ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
> 	/*
> 	 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
> 	 */
> -	qe_upload_firmware((const struct qe_firmware *) CONFIG_SYS_QE_FW_ADDR);
> +	qe_upload_firmware((const void *)CONFIG_SYS_QE_FMAN_FW_ADDR);
> 
> 	/* enable the microcode in IRAM */
> 	out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
> diff --git a/include/configs/MPC8569MDS.h b/include/configs/MPC8569MDS.h
> index 19d3271..000af21 100644
> --- a/include/configs/MPC8569MDS.h
> +++ b/include/configs/MPC8569MDS.h
> @@ -510,7 +510,8 @@ extern unsigned long get_clock_freq(void);
> #define CONFIG_SYS_LOADS_BAUD_CHANGE	1	/* allow baudrate change */
> 
> /* QE microcode/firmware address */
> -#define CONFIG_SYS_QE_FW_ADDR	0xfff00000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0xfff00000
> 
> /*
>  * BOOTP options
> diff --git a/include/configs/P1023RDS.h b/include/configs/P1023RDS.h
> index 013a6ac..e057b1f 100644
> --- a/include/configs/P1023RDS.h
> +++ b/include/configs/P1023RDS.h
> @@ -526,12 +526,14 @@ extern unsigned long get_clock_freq(void);
> #ifndef CONFIG_NAND
> /* Default address of microcode for the Linux Fman driver */
> /* QE microcode/firmware address */
> -#define CONFIG_SYS_FMAN_FW_ADDR		0xEF000000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0xEF000000
> #else
> -#define CONFIG_SYS_QE_FW_IN_NAND	0x1f00000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NAND
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0x1f00000
> #endif
> -#define CONFIG_SYS_FMAN_FW_LENGTH	0x10000
> -#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_FMAN_FW_LENGTH)
> +#define CONFIG_SYS_QE_FMAN_FW_LENGTH	0x10000
> +#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_QE_FMAN_FW_LENGTH)
> 
> #ifdef CONFIG_FMAN_ENET
> #define CONFIG_SYS_FM1_DTSEC1_PHY_ADDR	0x2
> diff --git a/include/configs/P2041RDB.h b/include/configs/P2041RDB.h
> index 6d45bb1..d654967 100644
> --- a/include/configs/P2041RDB.h
> +++ b/include/configs/P2041RDB.h
> @@ -421,14 +421,17 @@ unsigned long get_board_sys_clk(unsigned long dummy);
>  * about 545KB (1089 blocks), Env is stored after the image, and the env size is
>  * 0x2000 (16 blocks), 8 + 1089 + 16 = 1113, enlarge it to 1130.
>  */
> -#define CONFIG_SYS_QE_FW_IN_MMC		(512 * 1130)
> +#define CONFIG_SYS_QE_FMAN_FW_IN_MMC
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	(512 * 1130)
> #elif defined(CONFIG_NAND)
> -#define CONFIG_SYS_QE_FW_IN_NAND	(6 * CONFIG_SYS_NAND_BLOCK_SIZE)
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NAND
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	(6 * CONFIG_SYS_NAND_BLOCK_SIZE)
> #else
> -#define CONFIG_SYS_FMAN_FW_ADDR		0xEF000000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0xEF000000
> #endif
> -#define CONFIG_SYS_FMAN_FW_LENGTH	0x10000
> -#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_FMAN_FW_LENGTH)
> +#define CONFIG_SYS_QE_FMAN_FW_LENGTH	0x10000
> +#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_QE_FMAN_FW_LENGTH)
> 
> #ifdef CONFIG_SYS_DPAA_FMAN
> #define CONFIG_FMAN_ENET
> diff --git a/include/configs/corenet_ds.h b/include/configs/corenet_ds.h
> index bc0aeeb..0622b9f 100644
> --- a/include/configs/corenet_ds.h
> +++ b/include/configs/corenet_ds.h
> @@ -474,21 +474,25 @@
>  * env is stored at 0x100000, sector size is 0x10000, ucode is stored after
>  * env, so we got 0x110000.
>  */
> -#define CONFIG_SYS_QE_FW_IN_SPIFLASH	0x110000
> +#define CONFIG_SYS_QE_FW_IN_SPIFLASH
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0x110000
> #elif defined(CONFIG_SDCARD)
> /*
>  * PBL SD boot image should stored at 0x1000(8 blocks), the size of the image is
>  * about 545KB (1089 blocks), Env is stored after the image, and the env size is
>  * 0x2000 (16 blocks), 8 + 1089 + 16 = 1113, enlarge it to 1130.
>  */
> -#define CONFIG_SYS_QE_FW_IN_MMC		(512 * 1130)
> +#define CONFIG_SYS_QE_FMAN_FW_IN_MMC
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	(512 * 1130)
> #elif defined(CONFIG_NAND)
> -#define CONFIG_SYS_QE_FW_IN_NAND	(6 * CONFIG_SYS_NAND_BLOCK_SIZE)
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NAND
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	(6 * CONFIG_SYS_NAND_BLOCK_SIZE)
> #else
> -#define CONFIG_SYS_FMAN_FW_ADDR		0xEF000000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR		0xEF000000
> #endif
> -#define CONFIG_SYS_FMAN_FW_LENGTH	0x10000
> -#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_FMAN_FW_LENGTH)
> +#define CONFIG_SYS_QE_FMAN_FW_LENGTH	0x10000
> +#define CONFIG_SYS_FDT_PAD		(0x3000 + CONFIG_SYS_QE_FMAN_FW_LENGTH)
> 
> #ifdef CONFIG_SYS_DPAA_FMAN
> #define CONFIG_FMAN_ENET
> diff --git a/include/configs/p1_p2_rdb_pc.h b/include/configs/p1_p2_rdb_pc.h
> index bcfb034..906132f 100644
> --- a/include/configs/p1_p2_rdb_pc.h
> +++ b/include/configs/p1_p2_rdb_pc.h
> @@ -677,8 +677,9 @@
> 
> #ifdef CONFIG_QE
> /* QE microcode/firmware address */
> -#define CONFIG_SYS_QE_FW_ADDR		0xefec0000
> -#define CONFIG_SYS_QE_FW_LENGTH		0x10000
> +#define CONFIG_SYS_QE_FMAN_FW_IN_NOR
> +#define CONFIG_SYS_QE_FMAN_FW_ADDR	0xefec0000
> +#define CONFIG_SYS_QE_FMAN_FW_LENGTH	0x10000

this is wrong, there is no FMAN on this device.

> #endif /* CONFIG_QE */
> 
> #ifdef CONFIG_P1025RDB
> -- 
> 1.7.3.4
> 
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot




More information about the U-Boot mailing list