IXP: add dynamic microcode addr
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Mon, 7 Jan 2008 07:41:34 +0000 (08:41 +0100)
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Fri, 18 Jan 2008 00:00:02 +0000 (01:00 +0100)
allow to load the microde from flash or ram by download it through
the serial or other.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Acked-by: Stefan Roese <sr@denx.de>
README
cpu/ixp/npe/IxNpeDlImageMgr.c

diff --git a/README b/README
index f2a4914923876bead95b28d8d55caf3c87221353..cc5527452c229d8c5a2766dd0617806e258318e0 100644 (file)
--- a/README
+++ b/README
@@ -2699,6 +2699,9 @@ Some configuration options can be set using Environment Variables:
                  Useful on scripts which control the retry operation
                  themselves.
 
+  npe_ucode    - see CONFIG_IXP4XX_NPE_EXT_UCOD
+                 if set load address for the npe microcode
+
   tftpsrcport  - If this is set, the value is used for TFTP's
                  UDP source port.
 
index c0e7349da436182a99779ef1bea4fdb8b06bb217..75b42f2f8faec1bb2057e168919e74ee7a0e2ff8 100644 (file)
@@ -140,6 +140,14 @@ static UINT32 *IxNpeMicroCodeImageLibrary = (UINT32 *)CONFIG_IXP4XX_NPE_EXT_UCOD
 static UINT32 *IxNpeMicroCodeImageLibrary = (UINT32 *)IxNpeMicrocode_array;
 #endif
 
+static UINT32* getIxNpeMicroCodeImageLibrary(void)
+{
+       char *s;
+       if ((s = getenv("npe_ucode")) != NULL)
+               return (UINT32*) simple_strtoul(s, NULL, 16);
+       else
+               return IxNpeMicroCodeImageLibrary;
+}
 
 /*
  * static function prototypes.
@@ -218,9 +226,9 @@ ixNpeDlImageMgrImageListExtract (
     IX_NPEDL_TRACE0 (IX_NPEDL_FN_ENTRY_EXIT, 
                     "Entering ixNpeDlImageMgrImageListExtract\n");
 
-    header = (IxNpeDlImageMgrImageLibraryHeader *) IxNpeMicroCodeImageLibrary;
+    header = (IxNpeDlImageMgrImageLibraryHeader *) getIxNpeMicroCodeImageLibrary();
 
-    if (ixNpeDlImageMgrSignatureCheck (IxNpeMicroCodeImageLibrary))
+    if (ixNpeDlImageMgrSignatureCheck (getIxNpeMicroCodeImageLibrary()))
     {
        /* for each image entry in the image header ... */
        while (header->entry[imageCount].eohMarker !=
@@ -291,9 +299,9 @@ ixNpeDlImageMgrImageLocate (
     IX_NPEDL_TRACE0 (IX_NPEDL_FN_ENTRY_EXIT,
                     "Entering ixNpeDlImageMgrImageLocate\n");
 
-    header = (IxNpeDlImageMgrImageLibraryHeader *) IxNpeMicroCodeImageLibrary;
+    header = (IxNpeDlImageMgrImageLibraryHeader *) getIxNpeMicroCodeImageLibrary();
 
-    if (ixNpeDlImageMgrSignatureCheck (IxNpeMicroCodeImageLibrary))
+    if (ixNpeDlImageMgrSignatureCheck (getIxNpeMicroCodeImageLibrary()))
     {
        /* for each image entry in the image library header ... */
        while (header->entry[imageCount].eohMarker !=
@@ -308,8 +316,9 @@ ixNpeDlImageMgrImageLocate (
                 * get pointer to the image in the image library using offset from
                 * 1st word in image library
                 */
+               UINT32 *tmp=getIxNpeMicroCodeImageLibrary();
                imageOffset = header->entry[imageCount].image.offset;
-               *imagePtr = &IxNpeMicroCodeImageLibrary[imageOffset];
+               *imagePtr = &tmp[imageOffset];
                /* get the image size */
                *imageSize = header->entry[imageCount].image.size;
                status = IX_SUCCESS;
@@ -354,9 +363,9 @@ ixNpeDlImageMgrLatestImageExtract (IxNpeDlImageId *imageId)
     IX_NPEDL_TRACE0 (IX_NPEDL_FN_ENTRY_EXIT,
                     "Entering ixNpeDlImageMgrLatestImageExtract\n");
                     
-    header = (IxNpeDlImageMgrImageLibraryHeader *) IxNpeMicroCodeImageLibrary;
+    header = (IxNpeDlImageMgrImageLibraryHeader *) getIxNpeMicroCodeImageLibrary();
     
-    if (ixNpeDlImageMgrSignatureCheck (IxNpeMicroCodeImageLibrary))
+    if (ixNpeDlImageMgrSignatureCheck (getIxNpeMicroCodeImageLibrary()))
     {
        /* for each image entry in the image library header ... */
        while (header->entry[imageCount].eohMarker !=
@@ -633,7 +642,7 @@ ixNpeDlImageMgrImageFind (
            imageLibrary = ixNpeMicrocode_binaryArray;
        }
 #else
-       imageLibrary = IxNpeMicroCodeImageLibrary;
+       imageLibrary = getIxNpeMicroCodeImageLibrary();
 #endif /* IX_NPEDL_READ_MICROCODE_FROM_FILE */
     }