On some Freescale reference boards for SOCs with Fman devices, the Fman
microcode is located at address 0xEF000000 in NOR flash.  Unfortunately,
this address is in the "middle of nowhere" and makes it difficult to
partition flash space for other images.

So we change the expected address to 0xEFF40000, which is the flash
sector adjacent to the environment.  To support older boards, we use macro
CONFIG_SYS_QE_FMAN_FW_ADDR_OLD to look for the microcode in the old location
if it cannot be found in the new one.

The code which uploads the microcode checks the new default location, and
if the microcode is not found, then it checks the old location.  This allows
newer U-Boots to work on older boards.  However, during boot, the error
messages are a bit confusing:

Net:   Fman1: Data at eff40000 is not a firmware
Fman1: Uploading microcode version 101.8.0
Fman2: Data at eff40000 is not a firmware
Fman2: Uploading microcode version 101.8.0

Signed-off-by: Timur Tabi <ti...@freescale.com>
---
 drivers/net/fm/fm.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c
index 0b8c33f..f148608 100644
--- a/drivers/net/fm/fm.c
+++ b/drivers/net/fm/fm.c
@@ -412,6 +412,13 @@ int fm_init_common(int index, struct ccsr_fman *reg)
 
        /* Upload the Fman microcode if it's present */
        rc = fman_upload_firmware(index, &reg->fm_imem, addr);
+#ifdef CONFIG_SYS_QE_FMAN_FW_ADDR_OLD
+       /* Check the old location in NOR flash  */
+       if (rc) {
+               addr = (void *)CONFIG_SYS_QE_FMAN_FW_ADDR_OLD;
+               rc = fman_upload_firmware(index, &reg->fm_imem, addr);
+       }
+#endif
        if (rc)
                return rc;
        sprintf(env_addr, "0x%lx", (long unsigned int)addr);
-- 
1.7.3.4


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to