Added support for C6657
authorIvan Pang <i-pang@ti.com>
Wed, 9 May 2012 21:40:40 +0000 (17:40 -0400)
committerIvan Pang <i-pang@ti.com>
Wed, 9 May 2012 21:40:40 +0000 (17:40 -0400)
38 files changed:
doc/build_instructions.txt
doc/evmc6657-instructions.txt [new file with mode: 0644]
doc/ibl_single_binary.txt
src/cfg/c665x/iblcfg.h [new file with mode: 0644]
src/device/c64x/make/makefile
src/device/c665x/c665x.c [new file with mode: 0644]
src/device/c665x/c665xinit.c [new file with mode: 0644]
src/device/c665x/c665xutil.c [new file with mode: 0644]
src/device/c665x/target.h [new file with mode: 0644]
src/device/c665x/tiboot_c665x.h [new file with mode: 0644]
src/device/c66x/c66xinit.c
src/device/c66x/target.h
src/hw/c64x/make/makefile
src/hw/c64x/make/makestg2
src/hw/ddrs/emif4/emif4.c
src/ibl.h
src/main/iblmain.c
src/make/Makefile
src/make/ibl_c665x/i2crom.map.pre [new file with mode: 0644]
src/make/ibl_c665x/ibl.cmd [new file with mode: 0644]
src/make/ibl_c665x/ibl.rmd [new file with mode: 0644]
src/make/ibl_c665x/ibl_common.inc [new file with mode: 0644]
src/make/ibl_c665x/ibl_init.cmd [new file with mode: 0644]
src/make/ibl_c665x/ibl_init.rmd [new file with mode: 0644]
src/make/ibl_c665x/ibl_init_image.rmd [new file with mode: 0644]
src/make/ibl_c665x/ibl_init_objs_template.inc [new file with mode: 0644]
src/make/ibl_c665x/ibl_objs_template.inc [new file with mode: 0644]
src/make/ibl_c665x/spiRom.map.pre [new file with mode: 0644]
src/make/makestg1
src/make/makestg2
src/util/i2cConfig/Makefile
src/util/i2cConfig/i2cConfig.gel
src/util/i2cConfig/makestg2
src/util/iblConfig/build/Makefile
src/util/iblConfig/src/device.c
src/util/iblConfig/src/device.h
src/util/romparse/romparse.c
src/util/romparse/romparse.h

index 3118464a4ec5521698b167ca73a3dccddcce677f..fbb30ee01997d539d98bba215cd45245cf0e66fe 100644 (file)
@@ -40,6 +40,20 @@ C6x Bootloader Build Instructions
          On a Linux Bash shell run  "source setupenvLnx.sh"
          On a MinGW-MSYS Bash shell "source setupenvMsys.sh"
     - Following are the commands for building IBL:
+
+       For C6657 Low Cost EVM:
+       
+        make evm_c6657_i2c ENDIAN=little I2C_BUS_ADDR=0x51 
+        Output images:
+        IBL image: bin/i2crom_0x51_c6657_le.dat (CCS data format)
+                 : bin/i2crom_0x51_c6657_le.bin (raw binary)
+
+        make evm_c6657_i2c ENDIAN=big I2C_BUS_ADDR=0x51 
+        Output images:
+        IBL image: bin/i2crom_0x51_c6657_be.dat (CCS data format)
+                 : bin/i2crom_0x51_c6657_be.bin (raw binary)
+
+
         For C6678 Low Cost EVM:
         
        make evm_c6678_i2c ENDIAN=little I2C_BUS_ADDR=0x51 
@@ -65,6 +79,7 @@ C6x Bootloader Build Instructions
         IBL image: bin/i2crom_0x51_c6670_be.dat (CCS data format)
                  : bin/i2crom_0x51_c6670_be.bin (raw binary)
 
+       
 
        For C6474 LC EVM
 
diff --git a/doc/evmc6657-instructions.txt b/doc/evmc6657-instructions.txt
new file mode 100644 (file)
index 0000000..68074af
--- /dev/null
@@ -0,0 +1,49 @@
+Steps to use IBL on the c6657 EVM
+
+1. Programing "IBL" on the EEPROM at bus address 0x51
+   (a) Use the I2C EEPROM writer for c6657 EVM from the MCSDK distribution.
+   (b) Program i2crom_0x51_c6657_le.bin (IBL image) to the EEPROM at I2C BUS 
+       address 0x51 following the EEPROM writer's procedure.
+
+2. Programming the application on NAND or NOR flash
+   NOTE: This step is not needed if the application is booted from Ethernet.
+   (a) Use the NAND or NOR writer c6657 EVM from the tools directory.
+   (a) Flash the Application to NAND or NOR. For instructions please follow 
+       the instructions given along with the NAND/NOR writer.
+
+3. Booting the Application using IBL
+   Supported boot modes:
+   IBL supports three I2C boot modes: NOR boot, NAND boot and EMAC boot. 
+   Both NOR boot and NAND boot support maximum 2 images, EMAC boot supports only 1 image. 
+   For all the I2C boot modes, user needs to set the boot dip switches to I2C master, bus address 0x51.
+
+   NOR Boot:
+   Set the dip switches (pin1, pin2, pin3, pin4, pin5, pin6, pin7, pin8) to: 
+
+    SW3(off, off, on, off, on, on, on, on), 
+    SW5(on, on, on, off, on, on, on, on),
+    
+   This will set the boot param index to 0 to boot the NOR image, by default
+   the boot configuration table sets the NOR offset address to be 0 and 
+   image format to be ELF for image 0.
+   
+   NAND Boot:
+   Set the dip switches (pin1, pin2, pin3, pin4, pin5, pin6, pin7, pin8) to: 
+    
+    SW3(off, off, on, off, on, off, on, on), 
+    SW5(on, on, on, off, on, on, on, on),
+
+   This will set the boot param index to 2 to boot the NAND image, by default
+   the boot configuration table sets the NAND offset address to be 16384 
+   (start of block 1) and image format to be BBLOB for image 0.
+
+   EMAC Boot:
+   Set the dip switches (pin1, pin2, pin3, pin4, pin5, pin6, pin7, pin8) to: 
+    
+    SW3(off, off, on, off, on, on, off, on), 
+    SW5(on, on, on, off, on, on, on, on),
+
+   This will set the boot param index to 4 to boot an image from a remote TFTP
+   server, by default the boot configuration table sets the server IP to be 
+   192.168.2.101, board IP to be 192.168.2.100 and image format to be BBLOB.
+
index 1f4c769c74361be0719762991ac9a252c06b3f38..44d8cc5f40e2c342e0659557da21202a08de4fc6 100644 (file)
@@ -90,6 +90,8 @@ make EVM=c6678l I2C_MAP_ADDR=0x500
 For C6670 
 make EVM=c6670l I2C_MAP_ADDR=0x500
 
+For C6657
+make EVM=c6670l I2C_MAP_ADDR=0x500
 
 - There will an '''iblConfig.out''' that gets generated.
 
diff --git a/src/cfg/c665x/iblcfg.h b/src/cfg/c665x/iblcfg.h
new file mode 100644 (file)
index 0000000..89e68da
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+
+
+/**************************************************************************
+ * FILE PURPOSE: Provide build time configurations for the IBL
+ **************************************************************************
+ * FILE NAME: iblcfg.h
+ *
+ * DESCRIPTION: Build time configuration
+ *
+ * @file iblcfg.h
+ *
+ * @brief
+ *      Build time configurations for the c66x ibl are defined
+ *
+ ***************************************************************************/
+#ifndef IBLCFG_H
+#define IBLCFG_H
+
+/**
+ * @brief  The maximum number of UDP sockets in the system
+ */
+#define MAX_UDP_SOCKET          3
+
+
+/**
+ * @brief The maximum number of timers in the system
+ */
+#define MAX_TIMER_BLOCKS        5
+
+
+/**
+ * @brief The size in bytes of the internal stream buffer
+ */
+#define MAX_SIZE_STREAM_BUFFER  1520
+
+
+/**
+ * @brief The maximum number of functions supported for BIS mode
+ */
+#define MAX_BIS_FUNCTION_SUPPORT    3
+
+
+/**
+ * @brief No I/O sections accepted in boot table format
+ */
+#define BOOTCONFIG_NO_BTBL_IO
+
+/**
+ * @brief Estimates of operating parameters. Actual values will be known once they are
+ *        read from the i2c.
+ */
+#define IBL_CFG_I2C_DEV_FREQ_MHZ           1000
+#define IBL_CFG_I2C_CLK_FREQ_KHZ            100
+#define IBL_CFG_I2C_OWN_ADDR                10
+#define IBL_CFG_I2C_ADDR_DELAY              0x100       /* Delay between sending the address and reading data */
+
+
+/**
+ *  @brief The default location for the i2c map information can be overridden during make
+ */
+#ifndef IBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR
+ #define IBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR 0x51
+#endif
+
+
+#ifndef IBL_CFG_I2C_MAP_TABLE_DATA_ADDR
+ #define IBL_CFG_I2C_MAP_TABLE_DATA_ADDR     0x420
+#endif
+
+
+/**
+ * @brief The default location for the spi map information can be overridden during make
+ */
+#ifndef IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_LSW
+ #define IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_LSW     0x400
+#endif
+
+#ifndef IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_MSW
+ #define IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_MSW     0
+#endif
+
+#define NAND_CLE_GPIO_PIN GPIO_8     /*High: Command Cycle occuring */
+#define NAND_ALE_GPIO_PIN GPIO_9     /* High: Address input cycle oddcuring */
+#define NAND_NWE_GPIO_PIN GPIO_10
+#define NAND_BSY_GPIO_PIN GPIO_11     /* NAND Ready/Busy pin */
+#define NAND_NRE_GPIO_PIN GPIO_12
+#define NAND_NCE_GPIO_PIN GPIO_13
+
+/**
+ *  @brief
+ *      The standard NAND delay must be big enough to handle the highest possible
+ *      operating frequency of the device */
+#define TARGET_NAND_STD_DELAY          50 // In cpu cycles
+#define NAND_WAIT_PIN_POLL_ST_DLY      (10000)
+
+
+#endif
+
+
index 38f9f4334dd004abb7d725d468754ad06a85b3a0..c4e184dcebe95010d2ec46b9c01c6692a687fc55 100644 (file)
@@ -68,8 +68,12 @@ else
        else
         ifeq ($(TARGET),c66x)
          CSRC= c66x.c c66xinit.c c66xutil.c
-     else
-      CSRC= c6472.c c6455.c c6474.c c6474l.c c6457.c c6472init.c c6455init.c c6474linit.c c6474init.c c66x.c c66xinit.c c66xutil.c
+        else
+      ifeq ($(TARGET),c665x)
+          CSRC= c665x.c c665xinit.c c665xutil.c 
+      else
+       CSRC= c6472.c c6455.c c6474.c c6474l.c c6457.c c6472init.c c6455init.c c6474linit.c c6474init.c c66x.c c66xinit.c c66xutil.c c665x.c c665xinit.c c665xutil.c
+      endif 
      endif
     endif 
    endif
diff --git a/src/device/c665x/c665x.c b/src/device/c665x/c665x.c
new file mode 100644 (file)
index 0000000..da68423
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ *
+ * Copyright (C) 2011-12 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+
+
+/************************************************************************************
+ * FILE PURPOSE: C66x Device Specific functions
+ ************************************************************************************
+ * FILE NAME: c66x.c
+ *
+ * DESCRIPTION: Implements the device specific functions for the IBL
+ *
+ * @file c66x.c
+ *
+ * @brief
+ *  This file implements the device specific functions for the IBL
+ *
+ ************************************************************************************/
+#include "ibl.h"
+#include "iblloc.h"
+#include "iblcfg.h"
+#include "device.h"
+#include "pllapi.h"
+#include "emif31api.h"
+#include "pscapi.h"
+#include "gpio.h"
+#include "qm_api.h"
+#include "cpdma_api.h"
+#include "pa_api.h"
+#include "serdes_api.h"
+#include "net.h"
+#include "nandhwapi.h"
+#include "nor_api.h"
+#include "spi_api.h"
+#include <string.h>
+#include <stdint.h>
+#include "target.h"
+#include "uart.h"
+
+#define PLL_DDR_INIT_LOOPMAX 10
+#define IBL_RESULT_CODE_STR_LEN 20
+#define IBL_RESULT_CODE_LOC 17
+
+extern cregister unsigned int DNUM;
+
+/**
+ *  @brief Determine if an address is local
+ *
+ *  @details
+ *    Examines an input address to determine if it is a local address. Using the largest
+ *    L2 size on the C6657.
+ */
+bool address_is_local (Uint32 addr)
+{
+    /* L2 */
+    if ((addr >= 0x00800000) && (addr < 0x00900000))
+        return (TRUE);
+
+    /* L1P */
+    if ((addr >= 0x00e00000) && (addr < 0x00e08000))
+        return (TRUE);
+
+    /* L2D */
+    if ((addr >= 0x00f00000) && (addr < 0x00f08000))
+        return (TRUE);
+
+    return (FALSE);
+
+}
+
+
+/**
+ * @brief  Convert a local l1d, l1p or l2 address to a global address
+ *
+ * @details
+ *  The global address is formed. If the address is not local then
+ *  the input address is returned
+ */
+Uint32 deviceLocalAddrToGlobal (Uint32 addr)
+{
+
+    if (address_is_local (addr))
+        addr = (1 << 28) | (DNUM << 24) | addr;
+
+    return (addr);
+
+}
+        
+        
+/**
+ * @brief
+ *   Enable the DDR
+ *
+ * @details
+ *   The DDR controller on the c66x is an emif 4.0. The controller is
+ *   initialized directly with the supplied values
+ */
+void deviceDdrConfig (void)
+{
+    uint32 loopcount=0;
+    int8  ddr_result_code_str[IBL_RESULT_CODE_STR_LEN] = "IBL Result code 0";
+    /* The emif registers must be made visible. MPAX mapping 2 is used */
+    DEVICE_REG_XMPAX_L(2) =  0x10000000 | 0xff;     /* replacement addr + perm*/
+    DEVICE_REG_XMPAX_H(2) =  0x2100000B;         /* base addr + seg size (64KB)*/      
+    
+    if (ibl.ddrConfig.configDdr != 0)
+        hwEmif4p0Enable (&ibl.ddrConfig.uEmif.emif4p0);
+
+}
+        
+
+
+/**
+ *  @brief  Enable EMIF25 or SPI interface to the NAND
+ *
+ */
+int32 deviceConfigureForNand(void)
+{
+
+    return (0);
+
+}
+
+/**
+ *  @brief
+ *      Return the base memory address for emif25 in a given chip select space
+ */
+uint32 deviceEmif25MemBase (int32 cs)
+{
+    switch (cs)  {
+
+        case 2:  return (TARGET_MEM_NAND_CS_2);
+
+        case 3:  return (TARGET_MEM_NAND_CS_3);
+
+        case 4:  return (TARGET_MEM_NAND_CS_4);
+
+        case 5:  return (TARGET_MEM_NAND_CS_5);
+
+    }
+
+    return (0xffffffff);
+
+}
+
+
+/**
+ *  @brief
+ *      Return the PSC number for NAND/NOR through emif. 
+ */
+Int32 deviceEmifPscNum (void)
+{
+    Uint32 v;
+
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    v &= DEVICE_JTAG_ID_MASK;
+    if (v == DEVICE_C6657_JTAG_ID_VAL)
+        return (TARGET_PWR_EMIF_C6657);
+
+    /* Return a negative number to indicate no PSC module is associated with NAND */
+    return (-1);
+
+}
+
+
+
+/**
+ *  @brief
+ *    The e-fuse mac address is loaded
+ */
+void deviceLoadDefaultEthAddress (uint8 *maddr)
+{
+    uint32 macA, macB;
+
+    /* Read the e-fuse mac address */
+    macA = *((uint32 *)0x2620110);
+    macB = *((uint32 *)0x2620114);
+
+    maddr[0] = (macB >>  8) & 0xff;
+    maddr[1] = (macB >>  0) & 0xff;
+    maddr[2] = (macA >> 24) & 0xff;
+    maddr[3] = (macA >> 16) & 0xff;
+    maddr[4] = (macA >>  8) & 0xff;
+    maddr[5] = (macA >>  0) & 0xff;
+}
+
+extern nandCtbl_t nandEmifCtbl;
+/**
+ *  @brief Return the NAND interface (GPIO, EMIF25 or SPI) used based on the value
+ *         of interface
+ */
+#ifndef EXCLUDE_NAND_GPIO
+nandCtbl_t nandGpioCtbl =  {
+
+    nandHwGpioDriverInit,
+    nandHwGpioDriverReadBytes,
+    nandHwGpioDriverReadPage,
+    nandHwGpioDriverClose
+
+};
+#endif
+
+#ifndef EXCLUDE_NAND_EMIF
+extern Int32 nandHwEmifDriverInit (int32 cs, void *vdevInfo);
+extern Int32 nandHwEmifDriverReadBytes (Uint32 block, Uint32 page, Uint32 byte, Uint32 nbytes, Uint8 *data);
+extern Int32 nandHwEmifDriverReadPage (Uint32 block, Uint32 page, Uint8 *data);
+extern Int32 nandHwEmifDriverClose (void);
+
+nandCtbl_t nandEmifCtbl =  {
+
+    nandHwEmifDriverInit,
+    nandHwEmifDriverReadBytes,
+    nandHwEmifDriverReadPage,
+    nandHwEmifDriverClose
+
+};
+#endif
+
+#ifndef EXCLUDE_NAND_SPI
+nandCtbl_t nandSpiCtbl =  {
+
+
+    nandHwSpiDriverInit,
+    nandHwSpiDriverReadBytes,
+    nandHwSpiDriverReadPage,
+    nandHwSpiDriverClose
+
+};
+#endif
+
+nandCtbl_t *deviceGetNandCtbl (int32 interface)
+{
+#ifndef EXCLUDE_NAND_GPIO
+
+    if (interface == ibl_PMEM_IF_GPIO)
+        return (&nandGpioCtbl);
+
+#endif
+
+#ifndef EXCLUDE_NAND_SPI
+
+    if (interface == ibl_PMEM_IF_SPI)
+        return (&nandSpiCtbl);
+
+#endif
+
+#ifndef EXCLUDE_NAND_EMIF
+
+    if ((interface >= ibl_PMEM_IF_CHIPSEL_2) && (interface <= ibl_PMEM_IF_CHIPSEL_5))
+        return (&nandEmifCtbl);
+
+#endif
+
+    return (NULL);
+
+}
+
+
+/**
+ * @brief
+ *      Get the nor call table for the specified nor interface
+ */
+
+#ifndef EXCLUDE_NOR_EMIF
+norCtbl_t norEmifCtbl = {
+    
+    norHwEmifDriverInit,
+    norHwEmifDriverReadBytes,
+    norHwEmifDriverClose
+
+};
+
+#endif
+
+#ifndef EXCLUDE_NOR_SPI
+
+norCtbl_t norSpiCtbl = {
+    
+    norHwSpiDriverInit,
+    norHwSpiDriverReadBytes,
+    norHwSpiDriverClose
+
+};
+
+#endif
+
+norCtbl_t *deviceGetNorCtbl (int32 interface)
+{
+
+#ifndef EXCLUDE_NOR_SPI
+    
+    if (interface == ibl_PMEM_IF_SPI)
+        return (&norSpiCtbl);
+
+#endif
+
+#ifndef EXCLUDE_NOR_EMIF
+   
+    if ((interface >= ibl_PMEM_IF_CHIPSEL_2) && (interface <= ibl_PMEM_IF_CHIPSEL_5))
+        return (&norEmifCtbl);
+
+#endif
+
+    return (NULL);
+
+}
+
+/**
+ *  @brief
+ *      Chip level SGMII serdes configuration
+ *
+ *  @details
+ *      Both lanes are always setup, regardless of the port value
+ */
+void targetSgmiiSerdesConfig (int32 port, void *viblSgmii)
+{
+  serdesConfig_t scfg;
+  iblSgmii_t     *sgmii = (iblSgmii_t *)viblSgmii;
+
+  scfg.cfg      = sgmii->auxConfig;
+  scfg.nLanes   = 2;
+  scfg.rxCfg[0] = scfg.rxCfg[1] = sgmii->rxConfig;
+  scfg.txCfg[0] = scfg.txCfg[1] = sgmii->txConfig;
+
+  hwSerdesConfig (TARGET_SGMII_SERDES_BASE, &scfg);
+
+  hwSerdesWaitLock (TARGET_SGMII_SERDES_STATUS_BASE);
+
+}
+    
+
+
+    
+
+
+
+
+
+    
+
+
+
+
+
+
+
+
+
diff --git a/src/device/c665x/c665xinit.c b/src/device/c665x/c665xinit.c
new file mode 100644 (file)
index 0000000..f0b946b
--- /dev/null
@@ -0,0 +1,456 @@
+/**
+ * @file c665xinit.c
+ *
+ * @brief
+ *             c66x functions used during the initial stage of the ibl load
+ *
+ */
+#include "ibl.h"
+#include "iblloc.h"
+#include "device.h"
+#include "pllapi.h"
+#include "spi_api.h"
+#include "spi_loc.h"
+#include "tiboot_c665x.h"       
+
+
+/**
+ * @brief Configure the PLLs
+ *
+ * @details
+ *   The three PLLs are enabled. Only the main PLL has the ability to configure
+ *   the multiplier and dividers.
+ */
+void devicePllConfig (void)
+{
+    /* Unlock the chip registers and leave them unlocked */
+    *((Uint32 *)0x2620038) = 0x83e70b13;
+    *((Uint32 *)0x262003c) = 0x95a4f1e0;
+
+    if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
+        hwPllSetPll (MAIN_PLL, 
+                     ibl.pllConfig[ibl_MAIN_PLL].prediv,
+                     ibl.pllConfig[ibl_MAIN_PLL].mult,
+                     ibl.pllConfig[ibl_MAIN_PLL].postdiv);
+
+    if (ibl.pllConfig[ibl_DDR_PLL].doEnable == TRUE)
+        hwPllSetCfg2Pll (DEVICE_PLL_BASE(DDR_PLL),
+                         ibl.pllConfig[ibl_DDR_PLL].prediv,
+                         ibl.pllConfig[ibl_DDR_PLL].mult,
+                         ibl.pllConfig[ibl_DDR_PLL].postdiv,
+                         ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz,
+                         ibl.pllConfig[ibl_DDR_PLL].pllOutFreqMhz);
+
+}
+
+
+/**
+ * @brief
+ *  Return the endian status of the device
+ *
+ * @details
+ *  Returns true if the device is executing in little endian mode
+ */
+extern cregister volatile unsigned int CSR;
+
+bool deviceIsLittleEndian (void)
+{
+    if ((CSR & (1 << 8)) == 0)    
+        return (FALSE);
+
+    return (TRUE);
+
+}
+
+
+/**
+ *  @brief
+ *      Return the device used for the second stage program load.
+ *      For SPI NAND a second stage loader is required and this
+ *      function must be changed to locate that fingerprint.
+ */
+int32 deviceReadBootDevice (void)
+{
+    uint32 v;
+    int32  w;
+
+    BOOT_PARAMS_COMMON_T *params;
+
+#if  (defined(EXCLUDE_NOR_SPI) && defined(EXCLUDE_NAND_SPI) && !defined(EXCLUDE_I2C))
+
+    return (BOOT_DEVICE_I2C);
+
+#elif (defined(EXCLUDE_NOR_SPI) && !defined(EXCLUDE_NAND_SPI) && defined(EXCLUDE_I2C))
+
+    return (BOOT_DEVICE_NAND_SPI);
+
+#elif (!defined(EXCLUDE_NOR_SPI) && defined(EXCLUDE_NAND_SPI) && defined(EXCLUDE_I2C))
+
+    return (BOOT_DEVICE_NOR_SPI);
+
+#endif
+
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    v &= DEVICE_JTAG_ID_MASK;
+
+    if (v == DEVICE_C6657_JTAG_ID_VAL)
+       params = (BOOT_PARAMS_COMMON_T *)ROM_BOOT_PARAMS_ADDR_C6657;    
+
+    switch (params->boot_mode)  {
+
+#ifndef EXCLUDE_I2C
+        case BOOT_MODE_I2C:   w = BOOT_DEVICE_I2C;
+                              break;
+#endif
+
+#ifndef EXCLUDE_NOR_SPI
+        case BOOT_MODE_SPI:   w = BOOT_DEVICE_SPI_NOR;
+                              break;
+#endif
+
+        default:              w = BOOT_DEVICE_INVALID;
+                              break;
+    
+    }
+
+    return (w);
+}
+
+#define L1PEDCMD           0x01846408
+#define L2EDCEN                    0x01846030
+#define L2EDCMD                    0x01846008
+#define SMEDCC             0x0BC00010
+/**
+ *  @brief
+ *      Enable the EDC for the local memory 
+ */
+void iblEnableEDC ()
+{
+    /* Enable L1P EDC */
+    *(volatile unsigned int *)(L1PEDCMD) = 0x1;        //Set EN(bit0)=1        
+
+    /* Enable EDC L2EDCEN, set DL2CEN(bit0),PL2CEN(bit1),DL2SEN(bit2),PL2SEN(bit3),SDMAEN(bit4)=1 */
+       *(volatile unsigned int *)(L2EDCEN) |= 0x1F;    
+
+    /* Enalble L2 EDC */
+    *(volatile unsigned int *)(L2EDCMD) = 0x1;
+
+    /* Enalbe MSMC EDC */
+    *(volatile unsigned int *)(SMEDCC) &= 0x7FFFFFFF;  //Clear SEN(bit31)=0    
+       *(volatile unsigned int *)(SMEDCC) |= 0x40000000;       //Set ECM(bit30)=1      
+}
+
+#ifdef IBL_ENABLE_PCIE_WORKAROUND
+
+/* undocumented register in data manual 
+ * Bit 0 of this register is supposed to give the status of PCIe PLL lock*/
+#define PCIE_STS_REG    0x262015C
+
+/* Workaround for PCIe boot mode support for C6678/C6670 */
+/* This is a temporary workaround should be removed once fixed in RBL */
+
+/* PCIe Config register base on C6678/C6670 */
+#define PCIE_BASE_ADDR 0x21800000
+
+/* PCIe Application registers */
+#define PCIE_APP_CMD_STATUS  0x4
+#define PCIE_APP_OB_SIZE     0x30
+#define PCIE_APP_SERDES_CFG0 0x390
+#define PCIE_APP_SERDES_CFG1 0x394
+
+/* PCIe Local Configuration registers */
+#define PCIE_VENDER_DEVICE_ID   0x1000
+#define PCIE_STATUS_CMD         0x1004
+#define PCIE_CLASSCODE_REVID    0x1008
+#define PCIE_BAR0               0x1010
+#define PCIE_BAR1               0x1014
+#define PCIE_BAR2               0x1018
+#define PCIE_BAR3               0x101c
+#define PCIE_DEVICE_CAP         0x1074
+#define PCIE_DEV_STAT_CTRL     0x1078
+#define PCIE_LINK_STAT_CTRL     0x1080
+#define PCIE_ACCR              0x1118
+#define PCIE_DEBUG0             0x1728
+#define PCIE_PL_GEN2            0x180C
+
+/* SERDES Configuration registers */
+#define PCIE_SERDES_CFG_PLL 0x2620358
+
+void waitForBoot(UINT32 MAGIC_ADDR)
+{
+    void (*exit)();
+    UINT32 i, entry_addr;
+       
+    while(1)
+    {
+        entry_addr = DEVICE_REG32_R(MAGIC_ADDR);
+        if (entry_addr != 0)
+        {
+            /* jump to the exit point, which will be the entry point for the full IBL */
+            exit = (void (*)())entry_addr;
+            (*exit)();
+        }
+        for (i=0; i < 100; i++)
+            asm("nop");
+       }
+}
+
+void iblPCIeWorkaround()
+{
+    UINT32  v, flag_6678 = 0, flag_6670 = 0, flag_6657 = 0, MAGIC_ADDR;
+    UINT32  i;
+
+     /* Power up PCIe */
+    devicePowerPeriph (TARGET_PWR_PCIE);
+    for(i=0; i<1000; i++) asm (" NOP");
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG0), 0x00062320);  /* ss clock */
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG1), 0x00022320);  /* ss clock */
+      
+    /* Wait for PCIe PLL lock */
+    while(!(DEVICE_REG32_R(PCIE_STS_REG) & 1));
+
+       /* Determine 6670 or 6678 */
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    v &= DEVICE_JTAG_ID_MASK;
+       
+    if (v == DEVICE_C6678_JTAG_ID_VAL) {
+               MAGIC_ADDR = 0x87fffc;
+               flag_6678 = 1;
+       } 
+       if (v == DEVICE_C6670_JTAG_ID_VAL) {
+        MAGIC_ADDR = 0x8ffffc;
+               flag_6670 = 1;
+       }
+       if (v == DEVICE_C6657_JTAG_ID_VAL) {
+                MAGIC_ADDR = 0x8ffffc;
+                flag_6657 = 1;
+        }
+
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_CLASSCODE_REVID), 0x04800001);  /* class 0x04, sub-class 0x80, Prog I/F 0x00, Other multimedia device */ 
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_LINK_STAT_CTRL), 0x10110080);  /* extended sync, slot_clk_cfg = 1 */
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_VENDER_DEVICE_ID), 0xb005104c);  /* Vendor and Device ID */
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEVICE_CAP), 0x288701); /* L0 = 4, L1 = 3 */
+
+       DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_OB_SIZE), 0x00000003);     /* OB_SIZE = 8M */ 
+       DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_PL_GEN2), 0x0000000F);   /* num_fts = 0xF*/
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0020); /* Set dbi_cs2 to allow access to the BAR registers */ 
+       if (flag_6678)  {
+               /* 6678 */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000FFF);   /* 4K */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x0007FFFF);   /* 512K */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR2), 0x003FFFFF);   /* 4M */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR3), 0x00FFFFFF);   /* 16M */
+       } 
+
+       if (flag_6670)  {
+               /* 6670 */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000FFF);   /* 4K */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x000FFFFF);   /* 1M */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR2), 0x001FFFFF);   /* 2M */
+               DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR3), 0x00FFFFFF);   /* 16M */
+        }      
+       if (flag_6657)  {
+                /* 6657 */
+                DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000FFF);   /* 4K */
+                DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x000FFFFF);   /* 1M */
+                DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR2), 0x001FFFFF);   /* 2M */
+                DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR3), 0x00FFFFFF);   /* 16M */
+        }
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0);    /* dbi_cs2=0 */
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_STATUS_CMD), 0x00100146); /* ENABLE mem access */
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEV_STAT_CTRL), 0x0000281F); /* Error control */
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_ACCR), 0x000001E0); /* Error control */
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0); /* non-prefetch, 32-bit, mem bar */
+
+    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0000007);    /* enable LTSSM, IN, OB */
+    while((DEVICE_REG32_R(PCIE_BASE_ADDR + PCIE_DEBUG0) & 0x11)!=0x11);    /* Wait for training to complete */
+    /* Wait for the Boot from Host */
+    DEVICE_REG32_W(MAGIC_ADDR, 0);
+       waitForBoot(MAGIC_ADDR);
+
+    /* Will never reach here */
+    return;
+}
+
+#endif  
+
+#define FPGA_BM_GPI_STATUS_LO_REG           4   /* Boot Mode GPI Status (07-00 Low Byte) Register */
+#define FPGA_BM_GPI_STATUS_HI_REG           5   /* Boot Mode GPI Status (15-08 High Byte) Register */
+#define FPGA_ICS557_SEL_CTRL_REG            0x50 /* ICS 557 Clock Selection
+                                                    Control Register*/
+#define FPGA_READ_REG_CMD(x)                ((x | 0x80) << 8)
+#define FPGA_WRITE_REG_CMD(addr,byte)       (((addr & 0x7f) << 8) | (byte & 0xff))
+
+/**
+ * @brief
+ *      Enter the ROM boot loader if the FPGA boot register
+ *      indicates it was not I2C address 0x51 boot, this is necessary
+ *      to apply the PLL workaround for non-I2C boot modes
+ */
+void iblEnterRom ()
+{
+    uint32      v, dev_stat, bm_lo, bm_hi;
+    void        (*exit)();
+
+       
+    /* Reset SPI */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR0, SPI_REG_VAL_SPIGCR0_RESET);
+
+    /* Release Reset */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR0, SPI_REG_VAL_SPIGCR0_ENABLE);
+
+    /* CS1, CLK, in and out are functional pins, FPGA uses SPI CS1 */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIPC0, 0xe02);
+
+    /* prescale=7, char len=16 */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIFMT(0), 0x710);
+
+    /* C2TDELAY=0x6, T2CDELAY=0x3 */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIDELAY, 0x6030000);
+
+    /* Clear the SPIDAT0 */
+    //DEVICE_REG32_R (DEVICE_SPI_BASE(0) + SPI_REG_SPIDAT0);
+
+    /* Master mode, enable SPI */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR1, 0x01000003);
+
+    /* Read the BM status lo register */
+       DEVICE_REG32_W(DEVICE_SPI_BASE(0) + SPI_REG_SPIDAT0, FPGA_READ_REG_CMD(FPGA_BM_GPI_STATUS_LO_REG));
+    chipDelay32(10000);
+    v = DEVICE_REG32_R(DEVICE_SPI_BASE(0) + SPI_REG_SPIFLG);
+    if ( v & 0x100)
+    {
+        bm_lo = DEVICE_REG32_R(DEVICE_SPI_BASE(0) + SPI_REG_SPIBUF) & 0xff;
+    }
+    else
+    {
+        return;
+    }
+
+    /* Read the BM status hi register */
+       DEVICE_REG32_W(DEVICE_SPI_BASE(0) + SPI_REG_SPIDAT0, FPGA_READ_REG_CMD(FPGA_BM_GPI_STATUS_HI_REG));
+    chipDelay32(10000);
+    v = DEVICE_REG32_R(DEVICE_SPI_BASE(0) + SPI_REG_SPIFLG);
+    if ( v & 0x100)
+    {
+        bm_hi = DEVICE_REG32_R(DEVICE_SPI_BASE(0) + SPI_REG_SPIBUF) & 0xff;
+    }
+    else
+    {
+        return;
+    }
+
+
+    if ( (BOOT_READ_BITFIELD(bm_lo,3,1) != 0x5)     ||
+         (BOOT_READ_BITFIELD(bm_hi,3,3) == 0x0) )    
+    { 
+        /* Not i2c boot or i2c boot with address 0x50 */
+
+        /* Update the DEVSTAT to v1 */
+        dev_stat = DEVICE_REG32_R(DEVICE_REG_DEVSTAT );
+        dev_stat &= ~(0x0000080E);
+        dev_stat |= ((bm_hi << 8) | bm_lo);
+        
+        /* Update the DEVSTAT register for the intended Boot Device and i2c Addr */
+        DEVICE_REG32_W (DEVICE_REG_DEVSTAT, dev_stat);
+
+#ifdef IBL_ENABLE_PCIE_WORKAROUND
+#define BOOT_DEVICE_MASK    0xE
+#define DEVSTAT_BOOTDEVICE_SHIFT    1
+#define PCI_BOOT_MODE   0x4
+
+        if (((dev_stat & BOOT_DEVICE_MASK)>>DEVSTAT_BOOTDEVICE_SHIFT) == PCI_BOOT_MODE) {
+            /* Write ICS 557 Clock Selection Control Register in the FPGA */
+            /* 1 : FPGA_ICS557_SEL s driven high */
+               DEVICE_REG32_W(DEVICE_SPI_BASE(0) + SPI_REG_SPIDAT0,
+                           FPGA_WRITE_REG_CMD(FPGA_ICS557_SEL_CTRL_REG,1));
+            chipDelay32(10000);
+            /* Reset SPI */
+            DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR0, SPI_REG_VAL_SPIGCR0_RESET);
+
+            iblPCIeWorkaround();
+            /* Will never reach here */
+        }
+#endif
+        /* Reset SPI */
+        DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR0, SPI_REG_VAL_SPIGCR0_RESET);
+
+        exit = (void (*)())BOOT_ROM_ENTER_ADDRESS;
+        (*exit)();        
+    }
+    else
+    {
+        /* Update the DEVSTAT register for the actual boot configuration */
+        DEVICE_REG32_W (DEVICE_REG_DEVSTAT, ((bm_hi << 8) | bm_lo));
+    }
+
+    /* Reset SPI */
+    DEVICE_REG32_W (DEVICE_SPI_BASE(0) + SPI_REG_SPIGCR0, SPI_REG_VAL_SPIGCR0_RESET);
+}
+
+#if (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI))
+/**
+ *  @brief
+ *      Return the default hardware configuration for SPI. If this information
+ *      is available in the boot ROM it is used, otherwise defaults are used.
+ */
+void deviceLoadInitSpiConfig (void *vcfg)
+{
+    uint32 v;
+
+    spiConfig_t *cfg = (spiConfig_t *)vcfg;
+
+    BOOT_PARAMS_COMMON_T *params;
+    BOOT_PARAMS_SPI_T    *spip;
+
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    v &= DEVICE_JTAG_ID_MASK;
+
+    if (v == DEVICE_C6657_JTAG_ID_VAL)
+        params = (BOOT_PARAMS_COMMON_T *)ROM_BOOT_PARAMS_ADDR_C6657;
+
+
+    /* SPI_ROM is a constant defined during make which enables the use of the
+     * parameters from the ROM boot loader */
+    if ((SPI_ROM == 1) && (params->boot_mode == BOOT_MODE_SPI))  {
+
+        spip = (BOOT_PARAMS_SPI_T *)params;
+
+        cfg->port      = 0;
+        cfg->mode      = spip->mode;
+        cfg->addrWidth = spip->addrWidth;
+        cfg->npin      = spip->nPins;
+        cfg->csel      = spip->csel;
+        cfg->c2tdelay  = spip->c2tdelay;
+
+       /* TODO:cpufreqMhz need update */
+        v = (UINT32)spip->cpuFreqMhz * 1000;  /* CPU frequency in kHz */ 
+        v = v / (DEVICE_SPI_MOD_DIVIDER * (((UINT32)(spip->busFreqMhz) * 1000) + spip->busFreqKhz));
+
+        if (v > DEVICE_SPI_MAX_DIVIDER)
+            v = DEVICE_SPI_MAX_DIVIDER;
+
+        cfg->clkdiv = v;
+
+    }  else  {
+
+        cfg->port      = 0;
+        cfg->mode      = SPI_MODE;
+        cfg->addrWidth = SPI_ADDR_WIDTH;
+        cfg->npin      = SPI_NPIN;
+        cfg->csel      = SPI_CSEL;
+        cfg->c2tdelay  = SPI_C2TDEL;
+        cfg->clkdiv    = SPI_CLKDIV;
+
+    }
+
+}
+#endif
+
diff --git a/src/device/c665x/c665xutil.c b/src/device/c665x/c665xutil.c
new file mode 100644 (file)
index 0000000..f9cc9ef
--- /dev/null
@@ -0,0 +1,182 @@
+/**
+ * @file c66xutil.c
+ *
+ * @brief
+ *       c66x functions used by both the ibl and utility programs
+ */
+
+#include "device.h"
+#include "target.h"
+#include "pllapi.h"
+#include "types.h"
+
+/**
+ *  @brief
+ *     Configure the predivider for the main PLL, which resides outside the PLL controller
+ */
+SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
+{
+    UINT32 reg;
+
+    reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
+    reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
+    DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
+
+
+    return (0);
+
+} /* chipPllSetExternalPrediv */
+
+
+/**
+ *  @brief
+ *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
+ */
+SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
+{
+    UINT32 reg;
+    UINT32 bwAdj;
+
+    bwAdj = (mult >> 1) - 1;
+
+    reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
+    reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
+    DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
+
+    reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
+    reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
+    DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
+
+    return (0);
+
+} /* chipPllExternalBwAdj */
+
+
+/**
+ *  @brief
+ *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
+ */
+UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
+{
+    UINT32 pmult;
+    UINT32 reg;
+    UINT32 v;
+
+
+    pmult = mult-1; 
+
+    v = BOOT_READ_BITFIELD(pmult, 12, 6);
+   
+
+    reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
+    reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
+    DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
+
+
+    v = BOOT_READ_BITFIELD(pmult, 5, 0);
+
+    return (v);
+
+} /* chipPllExternalMult */
+
+/**
+ *  @brief return the PSC module number for SPI
+ */
+int32 deviceEMACPscNum (void)
+{
+    uint32 v;
+
+    /* EMAC is module number 3 only on the c6657. */
+    v = *((Uint32 *)DEVICE_JTAG_ID_REG);
+    v &= DEVICE_JTAG_ID_MASK;
+    if (v == DEVICE_C6657_JTAG_ID_VAL)
+        return (3);
+
+    return (-1);  /* A negative number indicates the always on domain */
+}
+
+/**
+ *  @brief Power up a peripheral
+ *
+ *  @details
+ *    Boot peripherals are powered up
+ */
+int32 devicePowerPeriph (int32 modNum)
+{
+    int32 ret;
+
+    /* If the input value is < 0 there is nothing to power up */
+    if (modNum < 0)
+        return (0);
+
+
+    if (modNum >= TARGET_PWR_MAX_MOD)
+        return (-1);
+
+
+    return ((int32)pscEnableModule(modNum));
+        
+}
+
+/*
+ *  @brief
+ *     Selects multiplexed GPIO's functionality
+*/
+void configureGPIO(void)
+{
+     uint32   reg;
+
+     reg =  DEVICE_REG32_R (PIN_CONTROL_0);
+     reg = reg & 0x000f;
+     DEVICE_REG32_W (PIN_CONTROL_0, reg);      
+}
+
+#ifdef PLL_REINIT_WORKAROUND
+/**
+ *  @brief Simple DDR3 test
+ *
+ *  @details
+ *      This function performs a simple DDR3 test for a memory range
+ *      specified below and returns -1 for failure and 0 for success.
+ */
+
+
+UINT32 ddr3_memory_test (void)
+{
+        UINT32 index, value;
+
+       /* Write a pattern */
+       for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
+               *(VUint32 *) index = (UINT32)index;
+       }
+
+       /* Read and check the pattern */
+       for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
+
+               value = *(UINT32 *) index;
+
+               if (value  != index) {
+                       return -1;
+               }
+       }
+
+       /* Write a pattern for complementary values */
+       for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
+               *(VUint32 *) index = (UINT32)~index;
+       }
+
+       /* Read and check the pattern */
+       for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
+
+               value = *(UINT32 *) index;
+
+               if (value  != ~index) {
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
+#endif
+
diff --git a/src/device/c665x/target.h b/src/device/c665x/target.h
new file mode 100644 (file)
index 0000000..50ecc91
--- /dev/null
@@ -0,0 +1,377 @@
+/*
+ *
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+
+
+/**************************************************************************
+ * FILE PURPOSE: Target specific definitions
+ **************************************************************************
+ * FILE NAME: target.h
+ *
+ * DESCRIPTION: This file defines target specific values used by low level
+ *                             drivers.
+ *
+ * @file target.h
+ *
+ * @brief
+ *  Low level target specific values are defined
+ *
+ ***************************************************************************/
+
+#include "types.h"
+
+/** 
+ *  @brief
+ *   Device EMAC definitions
+ */
+#define TARGET_DEVICE_CPMAC
+
+#define TARGET_EMAC_N_PORTS            1
+
+#define TARGET_EMAC_BASE_ADDRESSES     { 0x02c08000u }
+#define TARGET_EMAC_DSC_BASE_ADDR      { 0x02c0a000u }
+
+#define TARGET_SGMII_BASE_ADDRESSES    { 0x02c08900u }
+
+/* SGMII offsets (at least the serdes configs, vary between devices, so
+ * they are defined here. */
+#define TARGET_SGMII_IDVER             0x000
+#define TARGET_SGMII_STATUS            0x014
+#define TARGET_SGMII_MR_LP_ADV_ABILITY 0x020
+#define TARGET_SGMII_TX_CFG            0x030
+#define TARGET_SGMII_RX_CFG            0x034
+#define TARGET_SGMII_AUX_CFG           0x038
+
+/* Leave mdio disabled */
+#define dev_mdio_open()     1
+
+/* No chip level reset required for ethernet, the function call is made a void statment */
+#define deviceSetEthResetState(x,y)
+
+/* The mac control register values */
+#define TARGET_MAC_CONTROL    ( 1 << 18)            /* EXT_EN              */     \
+                            | ( 0 << 9 )            /* Round robin         */     \
+                            | ( 1 << 7 )            /* GIG                 */     \
+                            | ( 0 << 6 )            /* TX pacing disabled  */     \
+                            | ( 1 << 5 )            /* GMII RX & TX        */     \
+                            | ( 0 << 4 )            /* TX flow disabled    */     \
+                            | ( 0 << 3 )            /* RX flow disabled    */     \
+                            | ( 0 << 1 )            /* Loopback enabled    */     \
+                            | ( 1 << 0 )            /* full duplex         */
+
+/**
+ *  @brief
+ *    Device Timer definitions
+ */
+#define TIMER0_BASE             0x02200000u
+
+#define TIMER_INPUT_DIVIDER     6           /* Timer driven from cpu clock / 6 */
+
+
+/**
+ *  @def MAIN_PLL
+ */
+#define MAIN_PLL        0   /**< The index to the main PLL */
+
+/**
+ * @def NET_PLL
+ */
+
+/**
+ *  @def DDR_PLL
+ */
+#define DDR_PLL         1   /**< The index to the DDR PLL */
+
+
+/**
+ *  @brief
+ *    Device PLL definitions
+ */
+#define DEVICE_PLL_BASE(x)      ((x) == MAIN_PLL ? 0x2310000 : 0x2620330)
+#define DEVICE_MAIN_PLL_CTL_0       0x2620328
+#define DEVICE_MAIN_PLL_CTL_1       0x262032c
+
+
+/**
+ *  @brief
+ *   The c66x devices use a register external to the PLL controller for prediv configuration
+ */
+#define chipPllExternalPrediv(x)    TRUE
+
+/**
+ * @brief 
+ *  Device PSC definitions
+ */
+#define DEVICE_PSC_BASE     0x02350000u
+
+/**
+ *  @brief
+ *    The SPI module base and module divider
+ */
+#define DEVICE_SPI_BASE(x)          0x20bf0000u
+#define DEVICE_SPI_MOD_DIVIDER      6
+#define DEVICE_SPI_MAX_DIVIDER      0xff     
+
+
+/**
+ * @brief
+ *  The PSC number for the EMAC */
+#define TARGET_PWR_ETH(x)   3
+
+/** 
+ * @brief
+ *   The PSC numbers for EMIF16 and SPI vary between devices. The devices are run time
+ *   identified by reading the JTAG ID register,
+ *   NOTE: Have the variant bits as zero while defining the JTAG ID 
+ */
+#define DEVICE_C6657_JTAG_ID_VAL   0xb97a02f   /* C6657 */     
+#define DEVICE_C6678_JTAG_ID_VAL   0x9e02f      /* C6678 */
+#define DEVICE_C6670_JTAG_ID_VAL   0xb94102f    /* C6670 */
+
+#define DEVICE_JTAG_ID_REG          0x2620018
+#define DEVICE_JTAG_ID_MASK         0x0fffffff /* exclude variant bits(31:28) */
+
+
+/**
+ *  @brief
+ *    The PSC number for NAND depends on the device
+ */
+#define TARGET_PWR_EMIF         deviceEmifPscNum()
+#define TARGET_PWR_EMIF_C6657   -1
+#define NAND_TYPE_LARGE
+/*
+ *  @brief
+ *     The PSC number for SPI depends on the device
+ */
+#define TARGET_PWR_SPI      -1
+
+/**
+ *  @brief
+ *      The PSC number for GPIO. GPIO is in the always on domain
+ */
+#define TARGET_PWR_GPIO     -1
+
+/**
+ *  @brief
+ *      The LPSC number for PCIe. PCIe is 10 for C6657
+ */
+#define TARGET_PWR_PCIE    10 
+
+/**
+ * @brief
+ *  Flag to indicate timer 0 power up requested. The time is always on in the 6472
+ */
+#define TARGET_PWR_TIMER_0  23
+
+/**
+ *  @brief
+ *    Device DDR controller definitions
+ */
+#define DEVICE_EMIF4_BASE  0x21000000
+#define targetEmifType()   ibl_EMIF_TYPE_40
+
+/**
+ *  @brief
+ *     Device EMIF 2.5 controller definitions
+ */
+#define DEVICE_EMIF25_BASE  0x20c00000
+
+/** 
+ *  @brief
+ *      NAND memory regions
+ */
+#define TARGET_MEM_NAND_CS_2    0x70000000 
+#define TARGET_MEM_NAND_CS_3    0x74000000 
+#define TARGET_MEM_NAND_CS_4    0x78000000 
+#define TARGET_MEM_NAND_CS_5    0x7c000000 
+uint32 deviceNandMemBase (int32 cs);
+#define TARGET_SHFL(x)  _shfl(x)  /* The shuffle intrinsic */
+
+
+/**
+ * @brief
+ *  The highest module number. The value for nyquist is used
+ */
+#define TARGET_PWR_MAX_MOD  30
+
+/**
+ * @brief
+ *   The base address of MDIO 
+ */
+#define TARGET_MDIO_BASE    0x2C080800
+
+/**
+ * @brief
+ *   The number of external ethernet ports
+ */
+#define TARGET_EMAC_N_PORTS     1
+
+/**
+ *  @brief
+ *    GPIO address
+ */
+#define GPIO_GPIOPID_REG       0x02320000
+#define GPIO_GPIOEMU_REG       0x02320004
+#define GPIO_BINTEN_REG                0x02320008
+#define GPIO_DIR_REG           0x02320010
+#define GPIO_OUT_DATA_REG      0x02320014
+#define GPIO_SET_DATA_REG      0x02320018
+#define GPIO_CLEAR_DATA_REG    0x0232001C
+#define GPIO_IN_DATA_REG       0x02320020
+#define GPIO_SET_RIS_TRIG_REG  0x02320024
+#define GPIO_CLR_RIS_TRIG_REG  0x02320028
+#define GPIO_SET_FAL_TRIG_REG  0x0232002C
+#define GPIO_CLR_FAL_TRIG_REG  0x02320030
+#define PIN_CONTROL_0          0x02620580
+#define PIN_CONTROL_1          0x02620584
+/**
+ *  @brief
+ *      The base address of the I2C peripheral, and the module divisor of the cpu clock
+ */
+#define DEVICE_I2C_BASE                 0x02530000
+#define DEVICE_I2C_MODULE_DIVISOR       6
+/**
+ * @brief
+ *      The address of the DEVSTAT register
+ */
+#define DEVICE_REG_DEVSTAT              0x02620020
+
+/**
+ * @brief
+ *     Prototypes for the PLL functions handled outside the main PLL registers
+ */
+SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal);
+SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult);
+UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult);
+void configureSPIpins(void);
+
+#define TARGET_SGMII_EXTERNAL_SERDES
+#define TARGET_SGMII_TYPE_2             /* Use second sgmii setup sequence */
+#define TARGET_SGMII_SERDES_BASE        0x2620340
+#define TARGET_SGMII_SERDES_STATUS_BASE 0x2620158
+#define TARGET_SGMII_SOFT_RESET         0x04
+#define TARGET_SGMII_CONTROL            0x10
+#define TARGET_SGMII_MR_ADV_ABILITY     0x18
+void targetSgmiiSerdesConfig (int32 port, void *cfg);
+#define chipKickOpenSerdes(x)           *((uint32 *)0x2620038) = 0x83e70b13; *((uint32 *)0x262003c) = 0x95a4f1e0
+#define chipKickClosedSerdes(x)         ;       /* never lock the registers */
+
+
+#define TARGET_SERDES_LOCK_DELAY        (1600*1000)
+
+#define ECC_BLOCK_SIZE                 256
+
+/* NAND address pack macro */
+#define PACK_ADDR(col, page, block) \
+        ((col & 0x000000ff) | ((page & 0x0000001f) << 9) | ((block & 0x00000fff) << 14))
+
+/**
+ *  @brief
+ *      Register access macros
+ */
+#define DEVICE_REG32_W(x,y)   *(volatile unsigned int *)(x)=(y)
+#define DEVICE_REG32_R(x)    (*(volatile unsigned int *)(x))
+
+#define BOOTBITMASK(x,y)      (   (   (  ((UINT32)1 << (((UINT32)x)-((UINT32)y)+(UINT32)1) ) - (UINT32)1 )   )   <<  ((UINT32)y)   )
+#define BOOT_READ_BITFIELD(z,x,y)   (((UINT32)z) & BOOTBITMASK(x,y)) >> (y)
+#define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
+
+/** 
+ *  @brief
+ *      Mpax configuration registers 
+ */
+#define DEVICE_REG_XMPAX_L(x) *((volatile unsigned int *)(0x08000000 + (8*(x))))
+#define DEVICE_REG_XMPAX_H(x) *((volatile unsigned int *)(0x08000004 + (8*(x))))
+
+
+/**
+ *  @brief
+ *      ROM boot loader boot modes and table locations
+ */
+#define BOOT_MODE_I2C               40
+#define BOOT_MODE_SPI               50
+
+#define ROM_BOOT_PARAMS_ADDR_C6678   0x873680
+#define ROM_BOOT_PARAMS_ADDR_C6657   0x8fff00
+#define ROM_BOOT_PARAMS_ADDR_C6670   0x8f3680
+
+/**
+ *  @brief
+ *      No device specific configuration required for NOR boot, so
+ *      the function call is defined to return success.
+ */
+#define deviceConfigureForNor()    0
+
+
+/****************************************************************
+ *
+ * NOTE: Following build flags enable DEVICE specific workarounds
+ * and have code which is specific to C6657 LC EVMs
+ *
+ ****************************************************************/
+
+/**
+ *  @brief
+ *      Support for PLL workaround to re-enter ROM boot loader.
+ */
+#define IBL_ENTER_ROM              1
+
+/**
+ *  @brief
+ *      Support for enabling EDC for internal memory.
+ */
+#define IBL_ENABLE_EDC             1 
+
+/**
+ *  @brief
+ *      Support for enabling PCIe workarond for C6678/C6670.
+ */
+#define IBL_ENABLE_PCIE_WORKAROUND 1 
+
+/**
+ *  @brief
+ *     DDR start and end address needed for DDR memory test 
+ */
+#define DDR3_TEST_START_ADDRESS 0x80000000
+#define DDR3_TEST_END_ADDRESS   (DDR3_TEST_START_ADDRESS + (128 *1024))
+
+UINT32 ddr3_memory_test();
+void configureGPIO(void);
+
+
diff --git a/src/device/c665x/tiboot_c665x.h b/src/device/c665x/tiboot_c665x.h
new file mode 100644 (file)
index 0000000..7bb080a
--- /dev/null
@@ -0,0 +1,1232 @@
+#ifndef __TIBOOT_H__
+#define __TIBOOT_H__
+/*
+ *
+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+/******************************************************************************
+ * FILE PURPOSE: Define Structures, MACROs and etc for TI Shared ROM Boot
+ ******************************************************************************
+ * FILE NAME:   tiboot.h
+ *
+ * DESCRIPTION: Define structures, macros and etc for the TI Shared ROM boot
+ *              process.
+ *
+ ******************************************************************************/
+#include "types.h"
+
+/*******************************************************************************
+ * Utility Macro definitions
+ ******************************************************************************/
+#define HEX_DIGIT(digit)        ((digit) + '0')
+#define BOOT_BIT_TO_MASK(bit)   (1 << (bit))
+
+/*******************************************************************************
+ * Data Definition: Error Handling relatBOOT_ENTRY_POINT_ADDRed definition:
+ *******************************************************************************
+ * Description: Define Handling related macros, constants
+ *
+ ******************************************************************************/
+/* Define Module IDs */
+#define BOOT_MODULE_ID_MAIN         0
+#define BOOT_MODULE_ID_BTBL         1
+#define BOOT_MODULE_ID_BETH         2
+#define BOOT_MODULE_ID_I2C          3
+#define BOOT_MODULE_ID_CHIP         4
+#define BOOT_MODULE_ID_HW           5
+
+/* Boot error codes */
+enum {
+  BOOT_NOERR                = 0,
+  BOOT_GEN_ERROR            = 1,    /* General error */
+  BOOT_INVALID_BOOT_MODE    = 2,    
+  BOOT_INVALID_I2C_DEV_ADDR = 3,
+  BOOT_INVALID_CHECKSUM     = 4,    /* Invalid checksum of the boot parameters */
+  BOOT_INVALID_PARAMS_SIZE  = 5,    /* the size of boot parameters is too big */
+  BOOT_RX_ETH_QUEUE_FULL    = 6,    /* ethmain.c, hw_rxPacket */
+  BOOT_CACHE_INIT_FAIL      = 7,    /* rmain.c, cache init failed */
+  BOOT_CACHE_DISABLE_FAIL   = 8,    /* rmain.c, cache disable failed */
+  BOOT_INVALID_CPPI_SIZE    = 9,    /* ethmain.c, invalid compile sizes */
+  BOOT_INVALID_CORE_ID      = 10,   /* Invalid core ID in cold boot */
+  BOOT_INVALID_MAC_ADDR     = 11,   /* Invalid MAC address (all 0's) */
+  BOOT_ETH_TX_SCRATCH       = 12,   /* tx scratch size invalid */
+  BOOT_ETH_TX_PACKET        = 13,   /* tx packet formation failure */
+  BOOT_ETH_MAC_INIT         = 14,   /* ethmain.c - mac init failed */
+  BOOT_PERIPH_POWER         = 15,   /* peripheral failed to powerup */
+  BOOT_MAIN_FAIL            = 16,   /* Failed in initial boot setup (wrong core) */
+  BOOT_SK_REGISTERSCWP      = 17,   /* Failed at SK_registerSCWP */
+  BOOT_SK_ALLOCSC           = 18,   /* Failed at SK_allocSC */       
+  BOOT_CPSGMII_CONFIGINDEX  = 19,   /* Failed at wrong CPSGMII config index */
+  BOOT_SRIO_CONFIGINDEX     = 20,   /* Failed at wrong SRIO config index */
+  BOOT_RETURN_FROM_CHAIN    = 21,   /* Code returned from boot main chaining, should never happen */
+  BOOT_INVALID_HIB_ADDR     = 22    /* Invalid hibernation return address */
+};
+
+/* Error tracking prototypes (functions in rmain.c)*/
+void bootException (UINT16 errorCode);
+void bootError (UINT16 errorCode);
+
+/* Error code = (module ID *  100) + module specific error */
+#define BOOT_ERROR_CODE(id, code)     ((UINT16)((id<<8) + code))
+#define BOOT_EXCEPTION(error_code)     bootException(error_code)
+#define BOOT_ERROR(error_code)         bootError(error_code) 
+
+/*******************************************************************************
+ * Begin Boot Parameter definitions
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Boot Parameter Common 
+ ******************************************************************************/
+typedef struct boot_params_common_s{
+   UINT16 length;       /* size of the entire boot parameters in bytes */
+   UINT16 checksum;     /* non-zero: 1's complement checksum of the boot 
+                         *           parameters
+                         * zero: checksum is not applicable
+                         */
+   UINT16 boot_mode;
+   UINT16 portNum;
+   
+#define BOOT_PARAMS_ALL_PORTS   0xffff  /* All ports on a device are configured */   
+   
+   UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+   UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+   
+   /*                                swPllCfg
+    *
+    *   /----------------------------------------------------------------\
+    *   |   31        30   | 29        16 | 15          8 | 7          0 |
+    *   |      PLL Ctl     |  multiplier  |  pre-divider  | post divider |
+    *   \----------------------------------------------------------------/
+    */
+    
+#define BOOT_PARAMS_PLL_CFG_CTL_MASK                0xc000
+#define BOOT_PARAMS_PLL_CFG_CTL_SHIFT               14
+
+#define BOOT_PARAMS_PLL_CFG_CTL_NO_INIT             0       /* Pll is not initialized */
+#define BOOT_PARAMS_PLL_CFG_CTL_INIT_CONDITIONAL    1       /* Initialize only if PLL is currently disabled or in bypass */
+#define BOOT_PARAMS_PLL_CFG_CTL_INIT                2       /* Initialize PLL regardless of current PLL state */
+#define BOOT_PARAMS_PLL_CFG_CTL_BYPASS              3       /* Put the PLL into bypass  */
+
+
+#define BOOT_PARAMS_PLL_CFG_MSW_MULT_MASK     0x3fff
+#define BOOT_PARAMS_PLL_CFG_MSW_MULT_SHIFT    0
+
+#define BOOT_PARAMS_PLL_CFG_LSW_PREDIV_MASK   0xff00
+#define BOOT_PARAMS_PLL_CFG_LSW_PREDIV_SHIFT  8
+
+#define BOOT_PARAMS_PLL_CFG_LSW_POSTDIV_MASK  0x00ff
+#define BOOT_PARAMS_PLL_CFG_LSW_POSTDIV_SHIFT 0
+   
+} BOOT_PARAMS_COMMON_T;
+
+typedef struct boot_params_ethernet_s{
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+     
+    /* Etherent specific portion of the Boot Parameters */
+    UINT16 options;
+    /*
+     * Ethernet Specific Options
+     *
+     * Bits 2:0 interface
+     *      000 - MII
+     *      001 - RMII
+     *      010 - GMII
+     *      011 - RGMII
+     *      100 - SMII
+     *      101 - S3MII
+     *      110 - RMII 10Mbs
+     *      111 - RMII 100Mbs
+     *
+     * Bit 3: HD:                                      
+     *        0 - Full Duplex                          
+     *        1 - Half Duplex                          
+     * Bit 4: SKIP TX                                           
+     *        0 - Send the Ethernet Ready Frame 
+     *        1 - Skip sending the Ethernet Ready Frame                                              
+     * Bits 6:5 - Ethernet Initialization
+     *      00 - Entire system configured
+     *      01 - No initialization of peripherals that are already enabled and running
+     *      10 - Reserved
+     *      11 - No initialization at all
+     *
+     * Other bits:  Reserved 
+     */ 
+     #define BOOT_PARAMS_ETH_OPTIONS_MII        0x0000
+     #define BOOT_PARAMS_ETH_OPTIONS_RMII       0x0001
+     #define BOOT_PARAMS_ETH_OPTIONS_GMII       0x0002
+     #define BOOT_PARAMS_ETH_OPTIONS_RGMII      0x0003
+     #define BOOT_PARAMS_ETH_OPTIONS_SMII       0x0004
+     #define BOOT_PARAMS_ETH_OPTIONS_S3MII      0x0005
+     #define BOOT_PARAMS_ETH_OPTIONS_RMII_10    0x0006
+     #define BOOT_PARAMS_ETH_OPTIONS_RMII_100   0x0007
+       
+       /* Faraday only supports SGMII */
+     #define BOOT_PARAMS_ETH_OPTIONS_SGMII      0x0006
+     
+     #define BOOT_PARAMS_ETH_OPTIONS_HD         0x0008
+     #define BOOT_PARAMS_ETH_OPTIONS_SKIP_TX    0x0010
+    
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT_MASK  0x0060
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT_SHIFT 5
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT(x)    (((x) & BOOT_PARAMS_ETH_OPTIONS_INIT_MASK) >> BOOT_PARAMS_ETH_OPTIONS_INIT_SHIFT)
+     
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT_FULL      0
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT_PARTIAL   1
+     #define BOOT_PARAMS_ETH_OPTIONS_INIT_NONE      3
+     
+     /* 
+      * he device MAC address to be used for Boot:
+      * All zero mac address indicates that the device E-fuse address should
+      *  be used.
+      */ 
+     UINT16 mac_addr_h;
+     UINT16 mac_addr_m;
+     UINT16 mac_addr_l;
+     
+     /* 
+      * The multicast or broadcast MAC address which should be accepted as
+      * a destination MAC address for boot table frames
+      */
+     UINT16 mmac_addr_h;
+     UINT16 mmac_addr_m;
+     UINT16 mmac_addr_l;
+        
+     UINT16 src_port;     /* Source UDP port number to be used during boot process */
+                          /* 0: allow any SRC UDP port */
+     UINT16 dest_port;    /* Destination UDP port number to be used during boot process */
+     
+     /* The Device ID to be included in the boot ready announcement frame */
+     UINT16 device_id_12;   
+     UINT16 device_id_34;   
+     #define BOOT_PARAMS_DEVICE_ID_HIGH_MASK     0xFF00
+     #define BOOT_PARAMS_DEVICE_ID_HIGH_SHIFT    8
+     #define BOOT_PARAMS_DEVICE_ID_LOW_MASK      0x00FF
+     #define BOOT_PARAMS_DEVICE_ID_LOW_SHIFT     0
+     #define BOOT_PARAMS_GET_DEVICE_ID_13(device_id)    \
+               (((device_id) & BOOT_PARAMS_DEVICE_ID_HIGH_MASK) > BOOT_PARAMS_DEVICE_ID_HIGH_SHIFT)
+     #define BOOT_PARAMS_GET_DEVICE_ID_24(device_id)    \
+               (((device_id) & BOOT_PARAMS_DEVICE_ID_LOW_MASK) > BOOT_PARAMS_DEVICE_ID_LOW_SHIFT)
+     /* 
+      * The destination MAC address used for the boot ready announce frame
+      */
+     UINT16 hmac_addr_h;
+     UINT16 hmac_addr_m;
+     UINT16 hmac_addr_l;
+
+        /*
+      *        The CPSGMII configurations for Faraday
+      */
+
+     UINT16 sgmiiConfig;
+
+     #define BOOT_PARAMS_SGMII_CONFIG_INDEX_MASK     0x0F     /* bit 3 to 0 is index */
+     #define BOOT_PARAMS_SGMII_CONFIG_DIRECT_CONFIG  (1<<4)   /* set to use direct configurations */
+     #define BOOT_PARAMS_SGMII_CONFIG_NO_CONFIG      (1<<5)   /* set to bypass CPSGMII config  */
+
+        UINT16 sgmiiControl;  
+     #define BOOT_PARAMS_SGMII_CONTROL_MASK 0x7F
+
+        UINT16 sgmiiMr_Adv_Ability;
+     #define BOOT_PARAMS_SGMII_ABILITY_MASK 0x0000FFFF
+
+     /* These registers are the serdes configuration registers */
+        UINT16 sgmiiTx_Cfg_h;
+        UINT16 sgmiiTx_Cfg_l;
+        UINT16 sgmiiRx_Cfg_h;
+        UINT16 sgmiiRx_Cfg_l;
+        UINT16 sgmiiAux_Cfg_h;
+        UINT16 sgmiiAux_Cfg_l;
+     
+     UINT16 pktPllCfg_msw;      /* Packet subsystem PLL configuration */
+     UINT16 pktPllCfg_lsw;
+     
+}   BOOT_PARAMS_ETHERNET_T;
+
+
+/**************************************************************************************
+ * Ethernet parameters used with bootp/tftp boot
+ **************************************************************************************/
+typedef struct boot_params_bootp_ethernet_s{
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+     
+    /* Etherent specific portion of the Boot Parameters */
+    UINT16 options;
+
+    /* The unicast mac address accepted by this device */
+    UINT16 mac_addr_h;
+    UINT16 mac_addr_m;
+    UINT16 mac_addr_l;
+    
+    /* The multicast mac address accepted by this device */
+    UINT16 mmac_addr_h;
+    UINT16 mmac_addr_m;
+    UINT16 mmac_addr_l;
+    
+    /* The number of milli-seconds to wait before timing out a bootp request and tftp packet */
+    UINT16 bootpTimeoutMs;        /* This is the initial value. After each failure the time is doubled */
+    UINT16 tftpAckTimeoutMs;      /* Time for an ack timeout */
+    UINT16 tftpTotalTimeoutSec;   /* Number of seconds after which a transfer is timed out */
+    
+    /* The number of times to resend the bootp/tftp ack before giving up */
+    UINT16 bootpRetryCount;
+    UINT16 tftpRetryCount;
+    
+    
+    /* The device string is sent in the bootp request vendor specific area
+     * and class code fields. Up to 32 bytes packed into 16 UINT16s, 0 terminated */
+    #define VENDOR_STRING_SIZE_UINT16       16
+    UINT16 vendorString[VENDOR_STRING_SIZE_UINT16];
+    
+    /* The client ID string is sent in the bootp request client identifier code (option code 61) */
+    #define CLIENT_ID_STRING_SIZE_UINT16     10
+    UINT16 clientIdString[CLIENT_ID_STRING_SIZE_UINT16];
+    
+    
+    /* SGMII configuration */
+       UINT16 sgmiiControl;  
+       UINT16 sgmiiMr_Adv_Ability;
+    
+     /* These registers are the serdes configuration registers */
+       UINT16 sgmiiTx_Cfg_h;
+       UINT16 sgmiiTx_Cfg_l;
+       UINT16 sgmiiRx_Cfg_h;
+       UINT16 sgmiiRx_Cfg_l;
+       UINT16 sgmiiAux_Cfg_h;
+       UINT16 sgmiiAux_Cfg_l;
+    
+    UINT16 pktPllCfg_msw;      /* Packet subsystem PLL configuration */
+    UINT16 pktPllCfg_lsw;
+    
+
+}   BOOT_PARAMS_BOOTP_ETHERNET_T;
+
+
+/**************************************************************************************
+ * NAND boot options
+ **************************************************************************************/
+typedef struct boot_params_nand_s {
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    
+    #define BOOT_PARAMS_NAND_OPTIONS_I2C_PARAMS  (1 << 0)
+    
+    UINT16 i2cClkFreqKhz;   /* Desired speed of the I2C bus */
+    UINT16 i2cTargetAddr;   /* I2C Bus address of the target */
+    UINT16 i2cLocalAddr;    /* I2C Bus address of this device */
+    UINT16 i2cDataAddr;     /* Where to read the configuration block */
+    UINT16 i2cWtoRDelay;    /* Delay between address writes and data reads, in I2C bus cycles */
+    
+    UINT16 csNum;           /* Chip select region to use */
+    
+    UINT16 firstBlock;      /* The first block to try to read */
+ } BOOT_PARAMS_NAND_T;
+
+
+/**************************************************************************************
+ * Utopia boot options
+ **************************************************************************************/
+typedef struct boot_params_utopia_s{
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+     
+    /* Utopia specific portion of the Boot Parameters */
+    /* Options 
+     *  ---------------------------------------------------------------
+     * | 15                          3  |    2    |    1    |    0    |
+     * ----------------------------------------------------------------
+     *          reserved                     |         |         \-> 0 = multi phy
+     *                                       |         |             1 = single phy
+     *                                       |         \-> 0 = 8 bit utopia
+     *                                       |             1 = 16 bit utopis
+     *                                       \-> 0 = Init port
+     *                                           1 = skip port init
+     */
+    UINT16 options;
+    
+    #define BOOT_PARAMS_UTOPIA_SINGLE_PHY    (1<<0)
+    #define BOOT_PARAMS_UTOPIA_16BIT         (1<<1)
+    #define BOOT_PARAMS_UTOPIA_SKIP_INIT     (1<<2)
+    
+    UINT16 cellSizeBytes;    /* Cell Size */
+    UINT16 busWidthBits;     /* Bus width (8 or 16) */
+    UINT16 slid;             /* Slave ID  */
+    UINT16 coreFreqMhz;      /* CPU frequency after pll mult */
+     
+    
+} BOOT_PARAMS_UTOPIA_T;
+
+typedef struct boot_params_i2c_s{
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    /* I2C specific portion of the Boot Parameters */
+    UINT16 options;
+    /*
+     * I2C Specific Options
+     * Bit 01-00: BT:                                      
+     *            00 - Boot Parameter Mode                            
+     *            01 - Boot Table Mode                     
+     *            10 - Boot Config mode
+     *            11 - Slave receive boot config
+     * Bit 04-02: EETYPE: EEPROM type             
+     * Other bits:  Reserved 
+     */ 
+     #define BOOT_PARAMS_I2C_OPTIONS_BP             0x0000
+     #define BOOT_PARAMS_I2C_OPTIONS_BT             0x0001
+     #define BOOT_PARAMS_I2C_OPTIONS_BC             0x0002
+     #define BOOT_PARAMS_I2C_OPTIONS_SLVOPT         0x0003
+     
+     #define BOOT_PARAMS_I2C_OPTIONS_MASK           0x0003
+     #define BOOT_PARAMS_I2C_OPTIONS_SHIFT          0
+     
+     #define BOOT_PARAMS_I2C_OPTIONS_EETYPE_MASK    0x001C
+     #define BOOT_PARAMS_I2C_OPTIONS_EETYPE_SHIFT   2 
+     
+     #define BOOT_PARAMS_I2C_IS_BOOTTBL_MODE(options) \
+             (((options) & BOOT_PARAMS_I2C_OPTIONS_MASK) == BOOT_PARAMS_I2C_OPTIONS_BT)
+             
+     #define BOOT_PARAMS_I2C_IS_BOOTCONFIG_MODE(options) \
+             (((options) & BOOT_PARAMS_I2C_OPTIONS_MASK) == BOOT_PARAMS_I2C_OPTIONS_BC)
+             
+     #define BOOT_PARAMS_I2C_IS_SLAVE_RCV_OPTIONS_MODE(options) \
+             (((options) & BOOT_PARAMS_I2C_OPTIONS_MASK) == BOOT_PARAMS_I2C_OPTIONS_SLVOPT)
+             
+     #define BOOT_PARAMS_I2C_IS_BOOTPARAM_MODE(options) \
+             (((options) & BOOT_PARAMS_I2C_OPTIONS_MASK) == BOOT_PARAMS_I2C_OPTIONS_BP)
+             
+     #define BOOT_PARAMS_I2C_SET_BOOTTBL_MODE(options, mode)               \
+             (options) = ((options) & ~BOOT_PARAMS_I2C_OPTIONS_MASK) |     \
+                         (((mode)   &  BOOT_PARAMS_I2C_OPTIONS_MASK) <<    \
+                                       BOOT_PARAMS_I2C_OPTIONS_SHIFT)
+             
+             
+     #define BOOT_PARAMS_I2C_GET_EETYPE(options)    \
+             (((options) & BOOT_PARAMS_I2C_OPTIONS_EETYPE_MASK) >> BOOT_PARAMS_I2C_OPTIONS_EETYPE_SHIFT)
+     #define BOOT_PARAMS_I2C_SET_EETYPE(options, ee_type)         \
+             (options) = (((options) & ~BOOT_PARAMS_I2C_OPTIONS_EETYPE_MASK) |  \
+                         (((ee_type) << BOOT_PARAMS_I2C_OPTIONS_EETYPE_SHIFT) & BOOT_PARAMS_I2C_OPTIONS_EETYPE_MASK))          
+        
+     /* The device address to be used for Boot */
+     UINT16 dev_addr;           /* 16-bit device address (low) */
+     UINT16 dev_addr_ext;       /* 16-bit extended device address (high) 
+                                 * set to zero if not used
+                                 * Note: some I2C device requires 32-bit 
+                                 * address
+                                 */ 
+     UINT16 multi_i2c_id;      /* Multi device master write boot ID */
+     UINT16 my_i2c_id;         /* This parts I2C address            */
+     
+     UINT16 core_freq_mhz;     /* Core frequency, MHz               */
+     UINT16 i2c_clk_freq_khz;  /* Desired I2C clock frequency, kHz  */
+     
+     UINT16 next_dev_addr;      /* Used only for the boot config mode.         */
+     UINT16 next_dev_addr_ext;  /* Copied into dev_addr* after config complete */
+     
+     UINT16 address_delay;      /* Rough number of cycles delay between address write
+                                 * and read to the i2c eeprom */
+     
+     
+} BOOT_PARAMS_I2C_T;   
+
+
+typedef struct boot_params_rapidio_s{
+
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    /* Options */
+    UINT16 options;
+    
+    #define BOOT_PARAMS_RIO_OPTIONS_TX_ENABLE    (1<<0)   /* set to enable transmit    */
+    #define BOOT_PARAMS_RIO_OPTIONS_BOOT_TABLE   (1<<1)   /* set to use boot tables    */
+    #define BOOT_PARAMS_RIO_OPTIONS_NO_CONFIG    (1<<2)   /* set to bypass port config */
+    #define BOOT_PARAMS_RIO_OPTIONS_NO_QM_CONFIG (1<<3)   /* set to bypass QM config   */
+    #define BOOT_PARAMS_RIO_OPTIONS_SRDS_PLL_SET (1<<4)   /* set to insert mult/rate into serdes registers */
+    
+    UINT16 lane_port_setup; /* Lane port configuration                        */
+    #define BOOT_PARAMS_RIO_LPS_1X_1X_1X_1X     0       /* 4 ports 1 lane each */
+    #define BOOT_PARAMS_RIO_LPS_2X_1X_1X        1       /* 3 ports, lanes 0,1 are a 2 lane port */
+    #define BOOT_PARAMS_RIO_LPS_1X_1X_2X        2       /* 3 ports, lanes 2,3 are a 2 lane port */
+    #define BOOT_PARAMS_RIO_LPS_2X_2X           3       /* 2 ports, each 2 lanes */
+    #define BOOT_PARAMS_RIO_LPS_4X              4       /* 1 port of 4 lanes */
+    
+    UINT16  rsvd;
+    
+    UINT16 node_id;         /* The node id for this device                    */
+    UINT16 serdes_ref_clk;  /* The serdes reference clock freq, in hundredths
+                             * of MHz (1 MHz would be 100)                    */
+    UINT16 link_rate;       /* Data link rate (mega bits per second           */
+    UINT16 pf_low;          /* Packet forward range, low                      */
+    UINT16 pf_high;         /* Packet forward range, high                     */
+    
+    UINT16 promiscuous_mask;    /* One bit set per master lane to indicate promiscuous mode */
+    
+    UINT16 serdes_aux_msw;      /* Serdes Auxillary config register */
+    UINT16 serdes_aux_lsw;
+    
+    UINT16 serdes_rx_lane0_msw; /*  Rx Lane 0 config */
+    UINT16 serdes_rx_lane0_lsw;
+    
+    UINT16 serdes_rx_lane1_msw; /*  Rx Lane 1 config */
+    UINT16 serdes_rx_lane1_lsw;
+    
+    UINT16 serdes_rx_lane2_msw; /*  Rx Lane 1 config */
+    UINT16 serdes_rx_lane2_lsw;
+    
+    UINT16 serdes_rx_lane3_msw; /*  Rx Lane 1 config */
+    UINT16 serdes_rx_lane3_lsw;
+    
+    UINT16 serdes_tx_lane0_msw; /*  Tx Lane 0 config */
+    UINT16 serdes_tx_lane0_lsw;
+    
+    UINT16 serdes_tx_lane1_msw; /*  Tx Lane 1 config */
+    UINT16 serdes_tx_lane1_lsw;
+    
+    UINT16 serdes_tx_lane2_msw; /*  Tx Lane 1 config */
+    UINT16 serdes_tx_lane2_lsw;
+    
+    UINT16 serdes_tx_lane3_msw; /*  Tx Lane 1 config */
+    UINT16 serdes_tx_lane3_lsw;
+    
+} BOOT_PARAMS_RIO_T;
+
+
+typedef struct boot_params_pcie_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    
+#define BOOT_PARAMS_PCIE_OPTIONS_COMPUTE_PLL_MASK    (1 << 2)
+#define BOOT_PARAMS_PCIE_OPTIONS_COMPUTE_PLL         (1 << 2)
+#define BOOT_PARAMS_PCIE_OPTIONS_NO_COMPUTE_PLL      (0 << 2)
+
+#define BOOT_PARAMS_PCIE_OPTIONS_NO_INIT_MASK        (1 << 1)
+#define BOOT_PARAMS_PCIE_OPTIONS_NO_INIT             (1 << 1)
+#define BOOT_PARAMS_PCIE_OPTIONS_INIT                (0 << 1)
+
+
+    UINT16 addressWidth;    /* The PCI address width. Valid values are 32 or 64 */
+    UINT16 linkRateMhz;     /* The serdes frequency. Valid values are 2500 and 5000 */
+    UINT16 refClock10kHz;   /* The reference clock in 10kHz units. Valid values are 10000, 12500, 15625, 25000, 31250 */
+    UINT16 window1Size;     /* Window 1 size, in units of megabytes */
+    UINT16 window2Size;     /* Window 2 size */
+    UINT16 window3Size;     /* Window 3 size. Valid only if the address width is 32 */
+    UINT16 window4Size;     /* Window 4 size. Valid only if the address width is 32 */
+    UINT16 window5Size;     /* Window 5 size. Valid only if the address width is 32 */
+    
+    UINT16 vendorId;             /* Vendor ID field */
+    UINT16 deviceId;             /* Device ID field */
+    UINT16 classCodeRevId_Msw;   /* Class code rev ID, MSW */
+    UINT16 classCodeRevId_Lsw;   /* Class code rev ID, LSW*/
+    
+    
+    
+    UINT16 serdesCfgMsw;    /* Serdes auxillary config, MSW */
+    UINT16 serdesCfgLsw;    /* Serdes auxillary config, LSW */
+    
+    UINT16 serdesCfgLane0Msw;   /* Serdes Lane 0 config, MSW */
+    UINT16 serdesCfgLane0Lsw;   /* Serdes Lane 0 config, LSW */
+    
+    UINT16 serdesCfgLane1Msw;   /* Serdes Lane 1 config, MSW */
+    UINT16 serdesCfgLane1Lsw;   /* Serdes Lane 1 config, LSW */
+    
+   
+} BOOT_PARAMS_PCIE_T;
+    
+    
+typedef struct boot_params_emif_nor_s  {
+    UINT16 waitEnable;
+    UINT16 asyncCfgMsw;
+    UINT16 asyncCfgLsw;
+} boot_params_emif_nor_t;
+    
+    
+typedef struct boot_params_emif_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    
+    
+#define BOOT_PARAMS_EMIF_OPTIONS_USE_ASYNC_MASK      (1 << 0)
+#define BOOT_PARAMS_EMIF_OPTIONS_USE_ASYNC           (1 << 1)
+#define BOOT_PARAMS_EMIF_OPTIONS_USE_ASYNC_DISABLED  (1 << 0)
+    
+    UINT16 type;
+#define BOOT_PARAMS_EMIF_TYPE_NOR  0
+
+    UINT16 branchAddrMsw;
+    UINT16 branchAddrLsw;
+    
+    UINT16 csNum;
+    UINT16 memWidth;
+    
+    union  {
+      boot_params_emif_nor_t nor;
+    } u;
+    
+} BOOT_PARAMS_EMIF_T;
+    
+    
+typedef struct boot_params_vusr_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+#define BOOT_PARAMS_VUSR_OPTIONS_NO_INIT_MASK        (1 << 1)
+#define BOOT_PARAMS_VUSR_OPTIONS_NO_INIT             (1 << 1)
+#define BOOT_PARAMS_VUSR_OPTIONS_INIT                (0 << 1)
+
+    UINT16 nLanes;          /* The number of lanes to configure */
+    
+    UINT16 serdesCfgMsw;    /* Serdes auxillary config, MSW */
+    UINT16 serdesCfgLsw;    /* Serdes auxillary config, LSW */
+    
+    UINT16 serdesCfgRxLane0Msw;   /* Serdes Rx Lane 0 config, MSW */
+    UINT16 serdesCfgRxLane0Lsw;   /* Serdes Rx Lane 0 config, LSW */
+    
+    UINT16 serdesCfgTxLane0Msw;   /* Serdes Tx Lane 0 config, MSW */
+    UINT16 serdesCfgTxLane0Lsw;   /* Serdes Tx Lane 0 config, LSW */
+    
+    
+    
+    UINT16 serdesCfgRxLane1Msw;   /* Serdes Rx Lane 1 config, MSW */
+    UINT16 serdesCfgRxLane1Lsw;   /* Serdes Rx Lane 1 config, LSW */
+    
+    UINT16 serdesCfgTxLane1Msw;   /* Serdes Tx Lane 1 config, MSW */
+    UINT16 serdesCfgTxLane1Lsw;   /* Serdes Tx Lane 1 config, LSW */
+    
+    
+    UINT16 serdesCfgRxLane2Msw;   /* Serdes Rx Lane 2 config, MSW */
+    UINT16 serdesCfgRxLane2Lsw;   /* Serdes Rx Lane 2 config, LSW */
+    
+    UINT16 serdesCfgTxLane2Msw;   /* Serdes Tx Lane 2 config, MSW */
+    UINT16 serdesCfgTxLane2Lsw;   /* Serdes Tx Lane 2 config, LSW */
+    
+    
+
+    UINT16 serdesCfgRxLane3Msw;   /* Serdes Rx Lane 3 config, MSW */
+    UINT16 serdesCfgRxLane3Lsw;   /* Serdes Rx Lane 3 config, LSW */
+    
+    UINT16 serdesCfgTxLane3Msw;   /* Serdes Tx Lane 3 config, MSW */
+    UINT16 serdesCfgTxLane3Lsw;   /* Serdes Tx Lane 3 config, LSW */
+    
+} BOOT_PARAMS_VUSR_T;    
+
+typedef struct boot_params_spi_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    /*
+     * SPI Specific Options
+     * Bit 01-00: BT:                                      
+     *            00 - Boot Parameter Mode                            
+     *            01 - Boot Table Mode                     
+     *            10 - Boot Config mode
+     *            11 - GP header blob
+     * Other bits:  Reserved 
+     */ 
+     #define BOOT_PARAMS_SPI_OPTIONS_BP             0x0000
+     #define BOOT_PARAMS_SPI_OPTIONS_BT             0x0001
+     #define BOOT_PARAMS_SPI_OPTIONS_BC             0x0002
+     #define BOOT_PARAMS_SPI_OPTIONS_GPHDR          0x0003
+     
+     #define BOOT_PARAMS_SPI_OPTIONS_MASK           0x0003
+     #define BOOT_PARAMS_SPI_OPTIONS_SHIFT          0
+     
+     #define BOOT_PARAMS_SPI_IS_BOOTTBL_MODE(options) \
+             (((options) & BOOT_PARAMS_SPI_OPTIONS_MASK) == BOOT_PARAMS_SPI_OPTIONS_BT)
+             
+     #define BOOT_PARAMS_SPI_IS_BOOTCONFIG_MODE(options) \
+             (((options) & BOOT_PARAMS_SPI_OPTIONS_MASK) == BOOT_PARAMS_SPI_OPTIONS_BC)
+             
+     #define BOOT_PARAMS_SPI_IS_BOOTPARAM_MODE(options) \
+             (((options) & BOOT_PARAMS_SPI_OPTIONS_MASK) == BOOT_PARAMS_SPI_OPTIONS_BP)
+             
+     #define BOOT_PARAMS_SPI_IS_GPHDR_MODE(options) \
+             (((options) & BOOT_PARAMS_SPI_OPTIONS_MASK) == BOOT_PARAMS_SPI_OPTIONS_GPHDR)
+             
+             
+     #define BOOT_PARAMS_SPI_SET_BOOTTBL_MODE(options, mode)               \
+             (options) = ((options) & ~BOOT_PARAMS_SPI_OPTIONS_MASK) |     \
+                         (((mode)   &  BOOT_PARAMS_SPI_OPTIONS_MASK) <<    \
+                                       BOOT_PARAMS_SPI_OPTIONS_SHIFT)
+             
+             
+     UINT16 addrWidth;          /* 16 or 24 are the only valid values */
+     UINT16 nPins;              /* 4 or 5 pins are the only valid values */
+     UINT16 csel;               /* only values 0b10 (cs0 low) or 0b01 (cs1 low) are valid */
+     UINT16 mode;               /* Clock phase/polarity. These are the standard SPI modes 0-3 */
+     UINT16 c2tdelay;           /* Setup time between chip select assert and the transaction */
+     
+     UINT16 cpuFreqMhz;         /* Speed the CPU is running after PLL configuration */
+     UINT16 busFreqMhz;         /* The speed of the SPI bus, the megahertz portion */
+     UINT16 busFreqKhz;         /* The KHz portion of the bus frequency. A frequency of 1.5 MHz would have the value 5 here */
+     
+     UINT16 read_addr_msw;      /* The base address to read from the SPI, upper 16 bits */
+     UINT16 read_addr_lsw;      /* The base address to read from the SPI, lower 16 bits */
+     
+     UINT16 next_csel;          /* The next chip select to use if in boot config mode, when the config is complete */
+     UINT16 next_read_addr_msw; /* The next read address to use if in boot config mode */
+     UINT16 next_read_addr_lsw; /* The next read address to use if in boot config mode */
+             
+} BOOT_PARAMS_SPI_T;             
+
+typedef struct boot_params_sleep_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    
+} BOOT_PARAMS_SLEEP_T;
+
+typedef struct boot_params_uart_s
+{
+    /* common portion of the Boot parameters */
+    UINT16 length;
+    UINT16 checksum;
+    UINT16 boot_mode;
+    UINT16 portNum;
+    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */
+    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */
+    
+    UINT16 options;
+    
+    UINT16 bootDataFormat;
+    #define BOOT_PARAMS_UART_DATA_FORMAT_BLOB   0
+    #define BOOT_PARAMS_UART_DATA_FORMAT_BTBL   1
+    
+    UINT16 protocol;
+    #define BOOT_PARAMS_UART_PROTOCOL_XMODEM    0
+    
+    UINT16 initialNackCount;        /* Number of nacks to send at start before giving up */
+    UINT16 maxErrCount;             /* Max number of consecutive receive errors          */
+    
+    UINT16 nackTimeoutSec;          /* Number of seconds for a nack timeout */
+    UINT16 charTimeoutMsec;         /* Inter-character timeout, milli-seconds */
+    
+    UINT16 nDataBits;               /* Number of data bits, currently only 8 supported */
+    UINT16 parity;
+    #define BOOT_PARAMS_UART_PARITY_NONE  0
+    #define BOOT_PARAMS_UART_PARITY_ODD   1
+    #define BOOT_PARAMS_UART_PARITY_EVEN  2
+    UINT16 nStopBitsx2;             /* Number of stop bits x2. Valid values are 2, 3, and 4 for 1, 1.5 and 2 stop bits */
+    UINT16 overSampleFactor;        /* Valid values are 13 and 16 times oversampling */
+    
+    UINT16 flowControl;
+    #define BOOT_PARAMS_FLOW_CONTROL_NONE       0
+    #define BOOT_PARAMS_FLOW_CONTROL_RTS_CTS    1
+    
+    UINT16 dataRateMsw;             /* Baud rate, MSW */
+    UINT16 dataRateLsw;             /* Baud rate, LSW */
+    
+    UINT16 timerRefMhz;             /* Timer referecnce frequency in MHz */
+    
+} BOOT_PARAMS_UART_T;
+    
+
+
+/*
+ * UNION of boot parameter structures in all modes
+ * Note: We need to make sure that the structures genertaed by the C-compiler
+ *       match with the boot parameter table data format i.e. a set of 16-bit
+ *       data array.
+ */ 
+#define BOOT_PARAMS_SIZE_IN_BYTES       128
+typedef union {
+   BOOT_PARAMS_COMMON_T          common;  
+   BOOT_PARAMS_ETHERNET_T        eth;
+   BOOT_PARAMS_BOOTP_ETHERNET_T  ethBootp;
+   BOOT_PARAMS_NAND_T            nand;
+   BOOT_PARAMS_I2C_T             i2c;
+   BOOT_PARAMS_UTOPIA_T          utopia;
+   BOOT_PARAMS_RIO_T             rio;
+   BOOT_PARAMS_PCIE_T            pcie;
+   BOOT_PARAMS_EMIF_T            emif;
+   BOOT_PARAMS_VUSR_T            vusr;
+   BOOT_PARAMS_SPI_T             spi;
+   BOOT_PARAMS_SLEEP_T           sleep;
+   BOOT_PARAMS_UART_T            uart;
+   UINT16                        parameter[BOOT_PARAMS_SIZE_IN_BYTES/2]; 
+} BOOT_PARAMS_T;
+
+
+/*******************************************************************************
+ * Definition: The time stamp and version number are placed into the stats. 
+ *             This will be two characters packed per 16bits . The length
+ *             value must be 32 bit divisible
+ *******************************************************************************/
+#define BOOT_VERSION_LEN_UINT16    32 
+typedef struct BOOT_VERSION_S {
+
+  UINT16 vstring[BOOT_VERSION_LEN_UINT16];
+  
+} BOOT_VERSION_T;
+extern BOOT_VERSION_T bootVersion;
+  
+
+/*******************************************************************************
+ * Definition: Runs time stats that are not initialized on cold boot entry
+ *   !!!!!! boot.s assumes that the nonInit stats are at the top of the structure
+ *   !!!!!! and that stage is the first element
+ *******************************************************************************/
+typedef struct BOOT_STATS_NONINIT_S {
+  UINT16  stage;            /* Record the SharedROM code execution stage */
+  #define BOOT_STAGE_ASM_START_UP               1
+  #define BOOT_STAGE_INIT_CACHE                 2
+  #define BOOT_STAGE_CHCHE_INITED               3
+  #define BOOT_STAGE_ENTER_WARMBOOT             4
+  #define BOOT_STAGE_INIT_CPGMAC                5
+  #define BOOT_STAGE_SEND_ERA_FRAME             6
+  #define BOOT_STAGE_ETH_MAIN_LOOP              7
+  #define BOOT_STAGE_I2C_BOOTTBL_LOOP           8
+  #define BOOT_STAGE_I2C_BOOTPARAM_LOOP         9
+  #define BOOT_STAGE_DISABLE_CACHE             10
+  #define BOOT_STAGE_CHCHE_DISABLED            11
+  #define BOOT_STAGE_EXIT                      12
+  #define BOOT_STAGE_ERROR_LOOP                13  
+  #define BOOT_STAGE_I2C_BOOTCONFIG_LOOP       14
+  #define BOOT_STAGE_I2C_SLV_RCV_OPTIONS_LOOP  15
+  #define BOOT_STAGE_UTOPIA_MAIN_LOOP          16
+  UINT16  coldBootEntries;
+  
+} BOOT_STATS_NONINIT_T;
+
+/*******************************************************************************
+ * Definition: Run time statistics and error counts. These stats are 
+ *             initialized on cold boot entry.
+ ******************************************************************************/
+typedef struct BOOT_STATS_COMMON_S  {
+  UINT32    bootStatus;
+  UINT16    nColdBootEntries;
+  UINT16    nBootReentries;
+  UINT16    nPllWarns;
+  UINT16    nResetWarns;
+} BOOT_STATS_COMMON_T;
+typedef struct BOOT_STATS_MAIN_S {
+  UINT16  errorCode;        /* (module ID <<8 ) + module specific error */
+  
+  /* I2C operation related statistics */
+  UINT16  numI2Cpkts;       /* number of I2C boot table packets processed */
+  UINT16  numI2CchksumError;/* number of I2C checksum errors */
+  UINT16  numI2ClengthError;/* number of I2C block length errors */
+  UINT16  numI2CotherError; /* number of I2C section with invalid length and etc */
+  UINT16  numI2Cretrys;     /* number of I2C retrys due to read access errors */
+  UINT16  numI2cWrites;     /* number of I2C master writes to passive devices */
+  UINT16  numI2cWriteError; /* number of I2C master write errors              */
+  
+  UINT16  warmBootEntry;    /* Count of entries into warm boot routine   */
+} BOOT_STATS_MAIN_T;
+
+
+
+/*****************************************************************************
+ * Definition: I2C stats, Boot table and Ethernrt stats initialized 
+ *             on cold boot entry
+ *****************************************************************************/
+typedef struct I2C_STATS_tag
+{
+    UINT16      num_trans;
+    UINT16      num_trys;
+    UINT16      num_try_ok;
+    UINT16      num_try_lost_arb;
+    UINT16      num_try_idle_to;
+    UINT16      num_try_no_ack;
+    UINT16      num_try_other_err;
+    UINT32      extra_idle_waits;
+    UINT32      extra_clock_waits;
+    UINT32      tx_bytes;
+    UINT32      rx_bytes;
+    UINT32      data_re_reads;
+} I2C_STATS_T;
+
+typedef struct BTBL_STATS_tag
+{
+  UINT16  num_sections;     /* number of boot table sections received */
+  UINT16  num_pdma_copies;  /* number of PDMA copies performed */
+} BTBL_STATS_T;
+
+typedef struct ETH_STATS_tag
+{
+  /* MAC packets related statistics */
+  UINT16  uniMacPkts;       /* Count of packets received with valid unicast mac 
+                               address   */
+  UINT16  multiMacPkts;     /* Count of packets received with valid multicast or
+                               broadcast mac address   */
+  UINT16  invalidMacPkts;   /* Count of packets received with invalid mac 
+                               address   */
+  UINT16  invalidLLCPkts;   /* Count of 802.3 packets with wrong LLC/SNAP header */
+  UINT16  nonIpPkts;        /* Count of non-IP packets received with valid 
+                               MAC address   */
+                               
+  /* IP packets related statistics */                             
+  UINT16  nEra;             /* Number of ERA packets transmitted */
+  UINT16  nonIP4Pkts;       /* Count of non-IP4 packets        */
+  UINT16  ipfragments;      /* Count of IP fragments received      */
+  UINT16  ipTruncatedError; /* Count of truncated IP frame */
+  UINT16  nonUDPPkts;       /* Count of IP packets with non-UDP paylaod  */
+  
+  /* UDP packets related statistics */
+  UINT16  udpSizeError;     /* Count of UDP packet with invalid (odd) size */
+  UINT16  udpPortError;     /* Count of UDP packets with invalid port number */
+  UINT16  udpChksumError;   /* Count of UDP packets with checksum error */
+  
+  /* Boot table packets related statistics */
+  UINT16  nonBtblPkts;      /* Count of UDP packets with invalid boot table paylaod */
+  UINT16  outSeqPkts;       /* Count of out of sequence boot table packets received       
+                               i.e. packets with unexpected seq_num      */
+  UINT16  expSeqNum;        /* Expected Sequence Number */
+  UINT16  lastSeqNum;       /* Last sequence number received */                             
+
+  /* Driver errors */
+  UINT16  sizeZeroPackets;  /* Count of packets arriving with 0 size */
+} ETH_STATS_T;
+
+typedef struct PCI_EEAI_STATS_tag
+{
+  UINT16  pciI2cReads;         /* Count of block reads of i2c eeprom */
+  UINT16  pciI2cRetries;       /* Count of i2c read retries          */
+  UINT16  pciChkSumErr;        /* Count of block check sum errors    */
+  UINT16  pciEeaiFail;         /* Count of aborted pci attempts      */
+} PCI_EEAI_STATS_T;
+
+/* Rapid I/O stats */
+typedef struct RAPIDIO_STATS_tag
+{
+  UINT16 rapidIoFailReady;     /* If set rapid I/O peripheral failed to report ready */
+  UINT16 rapidIoBtblBlocks;    /* Count of number of boot table blocks received */
+  UINT16 rapidIoBtblBadBlocks; /* Count of boot table blocks rejected */
+  UINT16 rapidIoDescrEmpty;    /* Count of times ROM found rx descriptor queue empty */
+} RAPIDIO_STATS_T;
+
+typedef struct HPI_STATS_Tag
+{
+  UINT16 hpiBtblBlocks;        /* Count of boot table blocks received */
+  UINT16 hpiBtblBadBlocks;     /* Count of boot table blocks rejected */
+} HPI_STATS_T;
+
+/* Utopia stats */
+typedef struct UTOPIA_STATS_tag
+{
+  UINT16 cellCount;            /* Count of cells received   */
+  UINT16 invalidPtr;           /* Count of invalid pointers received in processing */
+  UINT16 invalidSize;          /* Count of cells that were too small               */
+  UINT16 cellMagicCount;       /* Count of cells received with valid magic         */
+  UINT16 cellMagicFailed;      /* Count of cells received with invalid magic       */
+  UINT16 trapNoCellMem;        /* Trapped due to no cell space in memory           */
+  UINT16 possibleOverrun;      /* Count of possible cell buffer overruns           */
+} UTOPIA_STATS_T;
+
+/* Ethernet bootp stats */
+typedef struct ETH_BP_STATS_tag
+{
+    UINT16 rxCount;
+    UINT16 bootpTimeout;
+    UINT16 tftpAckTimeout;
+    UINT16 downloadTimeout;
+} ETH_BP_STATS_T;
+
+/*******************************************************************************
+ * Definition: The statistics
+ *
+ *   !!!!!! boot.s assumes that the nonInit stats are at the top of the structure!
+ *******************************************************************************/
+typedef struct BOOT_STATS_S {
+
+ BOOT_STATS_COMMON_T   common;
+ BOOT_STATS_NONINIT_T  nonInit;
+ BOOT_STATS_MAIN_T     main;
+ I2C_STATS_T           i2c;
+ BTBL_STATS_T          btbl;
+ union  {
+   ETH_STATS_T           eth;
+   ETH_BP_STATS_T        ethBp;
+   PCI_EEAI_STATS_T      pci_eeai;
+   RAPIDIO_STATS_T       rapidIo;
+   UTOPIA_STATS_T        utopia;
+   HPI_STATS_T           hpi;
+ } u;
+} BOOT_STATS_T;
+
+extern BOOT_STATS_T bootStats;
+
+/*******************************************************************************
+ * Definition: The magic start address, known to all modules
+ *******************************************************************************/
+extern volatile UINT32 *p_boot_entry_addr;
+
+
+/*******************************************************************************
+ * Emif4 (DDR3) configuration table
+ *******************************************************************************/
+typedef struct bootEmif4Tbl_s  {
+
+    UINT32  configSelect_msw;               /* Bit map defining which registers to set */
+    UINT32  configSelect_slsw;              /* Bit map defining which registers to set */
+    UINT32  configSelect_lsw;               /* Bit map defining which registers to set */
+    
+    UINT32  pllPrediv;                      /* Values of all 0s will disable the pll */
+    UINT32  pllMult;
+    UINT32  pllPostDiv;
+
+    UINT32  sdRamConfig;                /* Controlled by bit 1 of configSelect_msw */
+    UINT32  sdRamConfig2;               /* Bit 2 */
+    UINT32  sdRamRefreshCtl;            /* Bit 3 */
+    UINT32  sdRamTiming1;               /* Bit 4 */
+    UINT32  sdRamTiming2;               /* Bit 5 */
+    UINT32  sdRamTiming3;               /* Bit 6 */
+    UINT32  lpDdrNvmTiming;             /* Bit 7 */
+    UINT32  powerManageCtl;             /* Bit 8 */
+    UINT32  iODFTTestLogic;             /* Bit 9 */
+    UINT32  performCountCfg;            /* Bit 10 */
+    UINT32  performCountMstRegSel;      /* Bit 11 */
+    UINT32  readIdleCtl;                /* Bit 12 */
+    UINT32  sysVbusmIntEnSet;           /* Bit 13 */
+    UINT32  sdRamOutImpdedCalCfg;       /* Bit 14 */
+    UINT32  tempAlterCfg;               /* Bit 15 */
+    UINT32  ddrPhyCtl1;                 /* Bit 16 */
+    UINT32  ddrPhyCtl2;                 /* Bit 17 */
+    UINT32  priClassSvceMap;            /* Bit 18 */
+    UINT32  mstId2ClsSvce1Map;          /* Bit 19 */
+    UINT32  mstId2ClsSvce2Map;          /* Bit 20 */
+    UINT32  eccCtl;                     /* Bit 21 */
+    UINT32  eccRange1;                  /* Bit 22 */
+    UINT32  eccRange2;                  /* Bit 23 */
+    UINT32  rdWrtExcThresh;             /* Bit 24 */
+    
+    UINT32 chipConfig[64];
+    
+} BOOT_EMIF4_TBL_T;
+
+#define BOOT_EMIF4_ENABLE_MSW_pllCtl                      (1 <<  0)  
+
+#define BOOT_EMIF4_ENABLE_MSW_sdRamConfig                 (1 <<  1)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamConfig2                (1 <<  2)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamRefreshCtl             (1 <<  3)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamTiming1                (1 <<  4)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamTiming2                (1 <<  5)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamTiming3                (1 <<  6)
+#define BOOT_EMIF4_ENABLE_MSW_lpDdrNvmTiming              (1 <<  7)
+#define BOOT_EMIF4_ENABLE_MSW_powerManageCtl              (1 <<  8)
+#define BOOT_EMIF4_ENABLE_MSW_iODFTTestLogic              (1 <<  9)
+#define BOOT_EMIF4_ENABLE_MSW_performCountCfg             (1 << 10)
+#define BOOT_EMIF4_ENABLE_MSW_performCountMstRegSel       (1 << 11)
+#define BOOT_EMIF4_ENABLE_MSW_readIdleCtl                 (1 << 12)
+#define BOOT_EMIF4_ENABLE_MSW_sysVbusmIntEnSet            (1 << 13)
+#define BOOT_EMIF4_ENABLE_MSW_sdRamOutImpdedCalCfg        (1 << 14)
+#define BOOT_EMIF4_ENABLE_MSW_tempAlterCfg                (1 << 15)
+#define BOOT_EMIF4_ENABLE_MSW_ddrPhyCtl1                  (1 << 16)
+#define BOOT_EMIF4_ENABLE_MSW_ddrPhyCtl2                  (1 << 17)
+#define BOOT_EMIF4_ENABLE_MSW_priClassSvceMap             (1 << 18)
+#define BOOT_EMIF4_ENABLE_MSW_mstId2ClsSvce1Map           (1 << 19)
+#define BOOT_EMIF4_ENABLE_MSW_mstId2ClsSvce2Map           (1 << 20)
+#define BOOT_EMIF4_ENABLE_MSW_eccCtl                      (1 << 21)
+#define BOOT_EMIF4_ENABLE_MSW_eccRange1                   (1 << 22)
+#define BOOT_EMIF4_ENABLE_MSW_eccRange2                   (1 << 23)
+#define BOOT_EMIF4_ENABLE_MSW_rdWrtExcThresh              (1 << 24)
+
+
+#define BOOT_EMIF_ENABLE_SLSW_config0                      (1 <<  0)
+#define BOOT_EMIF_ENABLE_SLSW_config1                      (1 <<  1)
+#define BOOT_EMIF_ENABLE_SLSW_config2                      (1 <<  2)
+#define BOOT_EMIF_ENABLE_SLSW_config3                      (1 <<  3)
+#define BOOT_EMIF_ENABLE_SLSW_config4                      (1 <<  4)
+#define BOOT_EMIF_ENABLE_SLSW_config5                      (1 <<  5)
+#define BOOT_EMIF_ENABLE_SLSW_config6                      (1 <<  6)
+#define BOOT_EMIF_ENABLE_SLSW_config7                      (1 <<  7)
+#define BOOT_EMIF_ENABLE_SLSW_config8                      (1 <<  8)
+#define BOOT_EMIF_ENABLE_SLSW_config9                      (1 <<  9)
+#define BOOT_EMIF_ENABLE_SLSW_config10                     (1 << 10)
+#define BOOT_EMIF_ENABLE_SLSW_config11                     (1 << 11)
+#define BOOT_EMIF_ENABLE_SLSW_config12                     (1 << 12)
+#define BOOT_EMIF_ENABLE_SLSW_config13                     (1 << 13)
+#define BOOT_EMIF_ENABLE_SLSW_config14                     (1 << 14)
+#define BOOT_EMIF_ENABLE_SLSW_config15                     (1 << 15)
+#define BOOT_EMIF_ENABLE_SLSW_config16                     (1 << 16)
+#define BOOT_EMIF_ENABLE_SLSW_config17                     (1 << 17)
+#define BOOT_EMIF_ENABLE_SLSW_config18                     (1 << 18)
+#define BOOT_EMIF_ENABLE_SLSW_config19                     (1 << 19)
+#define BOOT_EMIF_ENABLE_SLSW_config20                     (1 << 20)
+#define BOOT_EMIF_ENABLE_SLSW_config21                     (1 << 21)
+#define BOOT_EMIF_ENABLE_SLSW_config22                     (1 << 22)
+#define BOOT_EMIF_ENABLE_SLSW_config23                     (1 << 23)
+#define BOOT_EMIF_ENABLE_SLSW_config24                     (1 << 24)
+#define BOOT_EMIF_ENABLE_SLSW_config25                     (1 << 25)
+#define BOOT_EMIF_ENABLE_SLSW_config26                     (1 << 26)
+#define BOOT_EMIF_ENABLE_SLSW_config27                     (1 << 27)
+#define BOOT_EMIF_ENABLE_SLSW_config28                     (1 << 28)
+#define BOOT_EMIF_ENABLE_SLSW_config29                     (1 << 29)
+#define BOOT_EMIF_ENABLE_SLSW_config30                     (1 << 30)
+#define BOOT_EMIF_ENABLE_SLSW_config31                     (1u << 31)
+
+
+#define BOOT_EMIF_ENABLE_LSW_config32                    (1 <<  0)
+#define BOOT_EMIF_ENABLE_LSW_config33                    (1 <<  1)
+#define BOOT_EMIF_ENABLE_LSW_config34                    (1 <<  2)
+#define BOOT_EMIF_ENABLE_LSW_config35                    (1 <<  3)
+#define BOOT_EMIF_ENABLE_LSW_config36                    (1 <<  4)
+#define BOOT_EMIF_ENABLE_LSW_config37                    (1 <<  5)
+#define BOOT_EMIF_ENABLE_LSW_config38                    (1 <<  6)
+#define BOOT_EMIF_ENABLE_LSW_config39                    (1 <<  7)
+#define BOOT_EMIF_ENABLE_LSW_config40                    (1 <<  8)
+#define BOOT_EMIF_ENABLE_LSW_config41                    (1 <<  9)
+#define BOOT_EMIF_ENABLE_LSW_config42                    (1 <<  10)
+#define BOOT_EMIF_ENABLE_LSW_config43                    (1 <<  11)
+#define BOOT_EMIF_ENABLE_LSW_config44                    (1 <<  12)
+#define BOOT_EMIF_ENABLE_LSW_config45                    (1 <<  13)
+#define BOOT_EMIF_ENABLE_LSW_config46                    (1 <<  14)
+#define BOOT_EMIF_ENABLE_LSW_config47                    (1 <<  15)
+#define BOOT_EMIF_ENABLE_LSW_config48                    (1 <<  16)
+#define BOOT_EMIF_ENABLE_LSW_config49                    (1 <<  17)
+#define BOOT_EMIF_ENABLE_LSW_config50                    (1 <<  18)
+#define BOOT_EMIF_ENABLE_LSW_config51                    (1 <<  19)
+#define BOOT_EMIF_ENABLE_LSW_config52                    (1 <<  20)
+#define BOOT_EMIF_ENABLE_LSW_config53                    (1 <<  21)
+#define BOOT_EMIF_ENABLE_LSW_config54                    (1 <<  22)
+#define BOOT_EMIF_ENABLE_LSW_config55                    (1 <<  23)
+#define BOOT_EMIF_ENABLE_LSW_config56                    (1 <<  24)
+#define BOOT_EMIF_ENABLE_LSW_config57                    (1 <<  25)
+#define BOOT_EMIF_ENABLE_LSW_config58                    (1 <<  26)
+#define BOOT_EMIF_ENABLE_LSW_config59                    (1 <<  27)
+#define BOOT_EMIF_ENABLE_LSW_config60                    (1 <<  28)
+#define BOOT_EMIF_ENABLE_LSW_config61                    (1 <<  29)
+#define BOOT_EMIF_ENABLE_LSW_config62                    (1 <<  30)
+#define BOOT_EMIF_ENABLE_LSW_config63                    (1u <<  31)
+
+
+#define BOOT_EMIF4_ENABLE_ALL_MSW                     0x01ffffff
+#define BOOT_EMIF4_ENABLE_ALL_SLSW                    0xffffffff
+#define BOOT_EMIF4_ENABLE_ALL_LSW                     0xffffffff
+    
+    
+    
+    
+/* Hibernation function control */    
+#define TIBOOT_CTL_HIBERNATION_MODE1        1
+#define TIBOOT_CTL_HIBERNATION_MODE2        2
+
+
+/* Hibernation function return */
+#define TIBOOT_ERR_HIBERNATION_MODE_INVALID     -1
+#define TIBOOT_ERR_HIBERNATION_ADDR_MISALIGNED  -2
+#define TIBOOT_ERR_HIBERNATION_ADDR_INVALID     -3
+
+/* Boot mode values */
+#define BOOT_MODE_I2C               40
+#define BOOT_MODE_SPI               50
+
+/* ROM boot loader enter address */
+#define BOOT_ROM_ENTER_ADDRESS      0x20b00000
+
+
+#endif  /* __TIBOOT_H__ */
+
+/* nothing past this point */
index eb2dd36ffbe9978d0c1777cd5b4400e25b63ccc6..691e263a2c9183a76cddc374bad4221b2bf17288 100755 (executable)
@@ -103,8 +103,10 @@ int32 deviceReadBootDevice (void)
 
     if (v == DEVICE_C6678_JTAG_ID_VAL)
         params = (BOOT_PARAMS_COMMON_T *)ROM_BOOT_PARAMS_ADDR_C6678;
-    else
+    else if (v == DEVICE_C6670_JTAG_ID_VAL)
         params = (BOOT_PARAMS_COMMON_T *)ROM_BOOT_PARAMS_ADDR_C6670;
+    else
+       params = (BOOT_PARAMS_COMMON_T *)ROM_BOOT_PARAMS_ADDR_C6657;    
 
     switch (params->boot_mode)  {
 
index 560d7968b0a0a40b4aee8c5ef0b4431648ec3fb5..4109f82ebbedfa1be6913720fbf8fa3db374d095 100644 (file)
  */
 #define DEVICE_C6678_JTAG_ID_VAL   0x9e02f      /* C6678 */     
 #define DEVICE_C6670_JTAG_ID_VAL   0xb94102f    /* C6670 */     
+#define DEVICE_C6657_JTAG_ID_VAL   0xb97a02f    /* C6657 */
 
 #define DEVICE_JTAG_ID_REG          0x2620018
 #define DEVICE_JTAG_ID_MASK         0x0fffffff /* exclude variant bits(31:28) */
@@ -366,6 +367,7 @@ Int32 targetMacRcv (void *ptr_device, UINT8 *buffer);
 
 
 #define ROM_BOOT_PARAMS_ADDR_C6678   0x873680
+#define ROM_BOOT_PARAMS_ADDR_C6657   0x87ff00
 #define ROM_BOOT_PARAMS_ADDR_C6670   0x8f3680
 
 /**
index 94f80d35827c88996121159a1feee48483c33e48..fc3ba4a9f263f5601d91d9a22bb517448ff82e9f 100644 (file)
@@ -61,13 +61,18 @@ else
    else
     ifeq ($(TARGET),c6455)
      CSRC= t64.c cpmacdrv.c pll.c emif31.c mdio.c gpio.c nandgpio.c i2c.c null_uart.c
-       else
-        ifeq ($(TARGET),c66x)
-         CSRC= t64.c pll.c cfgpll.c cfgpll2.c mdio.c i2c.c psc.c cpsw.c qm.c cpdma.c pa.c sgmii.c serdes.c gmacsl.c emif4.c gpio.c
-         CSRC+= nandemif25.c nandgpio.c spi.c nandspi.c noremif25.c norspi.c emif25.c spiutil.c c66x_uart.c
-     else
-      CSRC= t64.c cpmacdrv.c pll.c psc.c emif31.c mdio.c gpio.c nandgpio.c i2c.c sgmii.c cfgpll.c cfgpll2.c
-         CSRC+= qm.c cpdma.c pa.c serdes.c gmacsl.c emif4.c nandemif25.c spi.c nandspi.c noremif25.c norspi.c emif25.c spiutil.c
+        else
+         ifeq ($(TARGET),c66x)
+           CSRC= t64.c pll.c cfgpll.c cfgpll2.c mdio.c i2c.c psc.c cpsw.c qm.c cpdma.c pa.c sgmii.c serdes.c gmacsl.c emif4.c gpio.c
+           CSRC+= nandemif25.c nandgpio.c spi.c nandspi.c noremif25.c norspi.c emif25.c spiutil.c c66x_uart.c
+             else
+              ifeq ($(TARGET),c665x)
+                CSRC= t64.c pll.c cfgpll.c cfgpll2.c mdio.c i2c.c psc.c mdio.c serdes.c sgmii.c emif4.c gpio.c cpmacdrv.c
+                CSRC+= nandemif25.c nandgpio.c spi.c nandspi.c noremif25.c norspi.c emif25.c spiutil.c c66x_uart.c     
+         else
+          CSRC= t64.c cpmacdrv.c pll.c psc.c emif31.c mdio.c gpio.c nandgpio.c i2c.c sgmii.c cfgpll.c cfgpll2.c
+          CSRC+= qm.c cpdma.c pa.c serdes.c gmacsl.c emif4.c nandemif25.c spi.c nandspi.c noremif25.c norspi.c emif25.c spiutil.c
+      endif
      endif
     endif
    endif
@@ -203,6 +208,25 @@ ifeq ($(TARGET),c66x)
  vpath % $(ECODIR)/uart/c66x_uart
 endif
 
+ifeq ($(TARGET),c665x)
+ vpath % $(ECODIR)/plls/pll014phi
+ vpath % $(ECODIR)/mdio
+ vpath % $(ECODIR)/i2c
+ vpath % $(ECODIR)/pscs/psc2
+ vpath % $(ECODIR)/sgmii
+ vpath % $(ECODIR)/serdes
+ vpath % $(ECODIR)/gpio
+ vpath % $(ECODIR)/macs/cpmac
+ vpath % $(ECODIR)/ddrs/emif4
+ vpath % $(ECODIR)/nands/emif25
+ vpath % $(ECODIR)/nands/gpio
+ vpath % $(ECODIR)/nands/spi
+ vpath % $(ECODIR)/spi
+ vpath % $(ECODIR)/nors/emif25
+ vpath % $(ECODIR)/nors/spi
+ vpath % $(ECODIR)/emif25
+ vpath % $(ECODIR)/uart/c66x_uart
+endif
 
 hw: gen_cdefdep makefile $(OBJS)
 
index 74ae4921ecd053ec6d6f84d07889663df1faae64..c0eb7c10cafc796226a6c51128e9fd80bd78183f 100644 (file)
@@ -8,7 +8,7 @@
 #*********************************************************************************
 
 
-DEVICES= c6455 c6472 c6474 c6474l c6457 c66x
+DEVICES= c6455 c6472 c6474 c6474l c6457 c66x c665x
 
 ifndef IBL_ROOT
  IBL_ROOT=../..
index 32e60bda94865f1ebe56e60b3484efa58eaa60fd..1e6a18dad35597974ed167c6f41e36d83ba61ae6 100755 (executable)
@@ -218,6 +218,123 @@ SINT16 hwEmif4p0Enable (iblEmif4p0_t *cfg)
           thereby, 3ms=3000us=4201680 */
        ddr3_wait(4201680); //Wait 3ms for leveling to complete
     }
+    else if (v == DEVICE_C6657_JTAG_ID_VAL)
+    {
+       KICK0 = KICK0_UNLOCK;
+       KICK1 = KICK1_UNLOCK;
+        
+       /**************** 3.3 Leveling register configuration ********************/
+        DDR3_CONFIG_REG_0 &= ~(0x007FE000);  // clear ctrl_slave_ratio field
+        DDR3_CONFIG_REG_0 |= 0x00200000;     // set ctrl_slave_ratio to 0x100
+        DDR3_CONFIG_REG_12 |= 0x08000000;    // Set invert_clkout = 1
+        DDR3_CONFIG_REG_0 |= 0xF;            // set dll_lock_diff to 15
+        DDR3_CONFIG_REG_23 |= 0x00000200;    // See section 4.2.1, set for partial automatic levelling
+            
+      /**************** 3.3 Partial Automatic Leveling ********************/
+      DATA0_WRLVL_INIT_RATIO = 0x00;
+      DATA1_WRLVL_INIT_RATIO = 0x00;
+      DATA2_WRLVL_INIT_RATIO = 0x00;
+      DATA3_WRLVL_INIT_RATIO = 0x00;
+      DATA4_WRLVL_INIT_RATIO = 0x33;
+      DATA5_WRLVL_INIT_RATIO = 0x3A;
+      DATA6_WRLVL_INIT_RATIO = 0x2C;
+      DATA7_WRLVL_INIT_RATIO = 0x2C;
+      DATA8_WRLVL_INIT_RATIO = 0x1C;
+
+      DATA0_GTLVL_INIT_RATIO = 0x00;
+      DATA1_GTLVL_INIT_RATIO = 0x00;
+      DATA2_GTLVL_INIT_RATIO = 0x00;
+      DATA3_GTLVL_INIT_RATIO = 0x00;
+      DATA4_GTLVL_INIT_RATIO = 0xB7;
+      DATA5_GTLVL_INIT_RATIO = 0xB1;
+      DATA6_GTLVL_INIT_RATIO = 0xA4;
+      DATA7_GTLVL_INIT_RATIO = 0xA4;
+      DATA8_GTLVL_INIT_RATIO = 0x98;
+  
+      //Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0
+      DDR_DDRPHYC &= ~(0x00008000);
+      DDR_DDRPHYC |= (0x00008000);
+      DDR_DDRPHYC &= ~(0x00008000);
+
+      /***************** 3.4 Basic Controller and DRAM configuration ************/
+      DDR_SDRFC    = 0x0000515C;    // enable configuration
+
+      /* DDR_SDTIM1   = 0x1113783C; */
+       TEMP = 0;
+       TEMP |= 0x9 << 25; // T_RP bit field 28:25
+       TEMP |= 0x9 << 21; // T_RCD bit field 24:21
+       TEMP |= 0x9 << 17; // T_WR bit field 20:17
+       TEMP |= 0x17 << 12; // T_RAS bit field 16:12
+       TEMP |= 0x20 << 6; // T_RC bit field 11:6
+       TEMP |= 0x1 << 3; // T_RRD bit field 5:3
+       TEMP |= 0x4; // T_WTR bit field 2:0
+       DDR_SDTIM1 = TEMP;
+
+      /* DDR_SDTIM2   = 0x304F7FE3; */
+       TEMP = 0;
+       TEMP |= 0x3 << 28; // T_XP bit field 30:28
+       TEMP |= 0x71 << 16; // T_XSNR bit field 24:16
+       TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6
+       TEMP |= 0x4 << 3; // T_RTP bit field 5:3
+       TEMP |= 0x3; // T_CKE bit field 2:0
+       DDR_SDTIM2 = TEMP;
+
+      /*  DDR_SDTIM3   = 0x559F849F; */
+       TEMP = 0;
+       TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)
+       TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)
+       TEMP |= 0x4 << 21; // T_CKESR bit field 23:21
+       TEMP |= 0x3f << 15; // T_ZQCS bit field 20:15
+       TEMP |= 0x6A << 4; // T_RFC bit field 12:4
+       TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)
+       DDR_SDTIM3 = TEMP; 
+
+        DDR_DDRPHYC  = 0x0010010F;
+     
+        DDR_ZQCFG    = 0x70074C1F; 
+
+        DDR_PMCTL    = 0x0;
+     
+        DDR_SDRFC = 0x0000515C; // enable configuration
+
+        /* DDR_SDCFG    = 0x63062A32; */
+        /* New value with DYN_ODT disabled and SDRAM_DRIVE = RZQ/7 //0x63222A32;    // last config write DRAM init occurs */
+        TEMP = 0;
+        TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)
+        TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27
+        TEMP |= 0x2 << 24; // DDR_TERM bit field 26:24
+        TEMP |= 0x2 << 21; // DYN_ODT bit field 22:21
+        TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18
+        TEMP |= 0x3 << 16; // CWL bit field 17:16
+        TEMP |= 0x1 << 14; // NM bit field 15:14
+        TEMP |= 0xE << 10; // CL bit field 13:10
+        TEMP |= 0x5 << 7; // ROWSIZE bit field 9:7
+        TEMP |= 0x3 << 4; // IBANK bit field 6:4
+        TEMP |= 0x0 << 3; // EBANK bit field 3:3
+        TEMP |= 0x2; // PAGESIZE bit field 2:0
+        DDR_SDCFG = TEMP;
+
+       /* assuming max device speed, 1.4GHz, 1 cycle = 0.714 ns *
+       * so, 100 us = 100000 ns = 140056 cycles
+          thereby, 600us=840336 */
+         ddr3_wait(840336);             //Wait 600us for HW init to complete
+
+        DDR_SDRFC = 0x0000144F;       //Refresh rate = (7.8*666MHz]
+
+      /***************** 4.2.1 Partial automatic leveling ************/
+        DDR_RDWR_LVL_RMP_CTRL = 0x80000000; //enable automatic leveling
+   
+        /*Trigger automatic leveling - This ignores read DQS leveling result and uses ratio forced value
+          Wait for min 1048576 DDR clock cycles for leveling to complete = 1048576 * 1.5ns = 1572864ns = 1.57ms.
+          Actual time = ~10-15 ms */
+        DDR_RDWR_LVL_CTRL = 0x80000000; 
+
+       /* assuming max device speed, 1.4GHz, 1 cycle = 0.714 ns *
+       * so, 100 us = 100000 ns = 140056 cycles
+          thereby, 3ms=3000us=4201680 */
+       ddr3_wait(4201680); //Wait 3ms for leveling to complete
+    
+    }          
     else
     {
         /* C64x configuration */
index 8130d8f45172da9388aa431fade6905bec57f1d2..202c3686184ebad358f6b3d0eeb12189780a3b3d 100644 (file)
--- a/src/ibl.h
+++ b/src/ibl.h
@@ -702,7 +702,7 @@ typedef struct iblBoot_s
 #define ibl_EVM_C6474M  0x41   /**< C6474 Mez EVM */
 #define ibl_EVM_C6670L  0x50   /**< C6670 Low Cost EVM */
 #define ibl_EVM_C6678L  0x60   /**< C6678 Low Cost EVM */
-
+#define ibl_EVM_C6657L  0x70    /**< C6657 Low Cost EVM */
 
 /**
  *  @brief
index e7ef5c55e2444eedf7bfd784bf468ce2b753747e..61fe96dc5c49faf2fb97cca1de6b52c33b5ccabb 100755 (executable)
@@ -279,7 +279,8 @@ void main (void)
         v &= DEVICE_JTAG_ID_MASK;
         if (
             (v == DEVICE_C6678_JTAG_ID_VAL)         || 
-            (v == DEVICE_C6670_JTAG_ID_VAL)
+            (v == DEVICE_C6670_JTAG_ID_VAL)        ||
+           (v == DEVICE_C6657_JTAG_ID_VAL)     
            )
         {
             IER = 0;
index c68aca9a7b03f92b44ecb2c461a265ab3e041e42..d59ddb8bde179d866889455bba3c5dabddb22aea 100644 (file)
@@ -80,7 +80,7 @@
 #*                     make test_build
 #*******************************************************************************************
 
-IBLS_C6X= c6455 c6472 c6474 c6474l c6457 c66x
+IBLS_C6X= c6455 c6472 c6474 c6474l c6457 c66x c665x
 EVMS_C6X= evm_c6455 evm_c6472 evm_c6474 evm_c6474l
 
 
@@ -248,8 +248,8 @@ SPI_DEFS+= SPI_CLKDIV=$(SPI_CLKDIV)
 SPI_DEFS+= SPI_ROM=$(SPI_ROM)
 
 
-.PHONY: all $(IBLS_C6X) evm_c6455 evm_c6472 evm_c6474 evm_c6474l evm_c6457 evm_c6678_i2c evm_c6670_i2c 
-.PHONY: test_c66x test_c6455 test_c6472 test_c6474 test_c6457 clean
+.PHONY: all $(IBLS_C6X) evm_c6455 evm_c6472 evm_c6474 evm_c6474l evm_c6457 evm_c6678_i2c evm_c6670_i2c evm_c6657_i2c
+.PHONY: test_c66x test_c665x test_c6455 test_c6472 test_c6474 test_c6457 clean
 
 
 all:
@@ -341,6 +341,26 @@ test_c66x:
        make -f makestg1 ARCH=c64x TARGET=c66x ENDIAN_MODE=both CEXCLUDES='SPI NOR_SPI NAND_SPI' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c66x
        make -f makestg1 ARCH=c64x TARGET=c66x ENDIAN_MODE=both CEXCLUDES=I2C SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' c66x
 
+evm_c6657_spi:
+       make -f makestg1 ARCH=c64x TARGET=c665x I2C=no I2C_BUS_ADDR=0x51 I2C_MAP_ADDR=0x500 ENDIAN_MODE=little CEXCLUDES=I2C SPI_DEFS='$(EVM_667x_SPI_DEFS)' c66x
+
+evm_c6657_i2c:
+       make -f makestg1 I2C_BUS_ADDR=$(I2C_BUS_ADDR) I2C_MAP_ADDR=$(I2C_MAP_ADDR) \
+ENDIAN_MODE=$(ENDIAN) ARCH=c64x TARGET=c665x EVM=c6657l SPI=no SPI_DEFS='$(EVM_667x_SPI_DEFS)' \
+CEXCLUDES='COFF BIS NAND_GPIO' c665x
+       cp -f ibl_c665x/i2crom.dat bin/i2crom_$(I2C_BUS_ADDR)_c6657_$(ENDIAN_SFX).dat
+       cp -f ibl_c665x/i2crom.bin bin/i2crom_$(I2C_BUS_ADDR)_c6657_$(ENDIAN_SFX).bin
+       cp -f ../util/i2cConfig/i2cparam_c665x_$(ENDIAN_SFX).out bin/i2cparam_$(I2C_BUS_ADDR)_c6657_$(ENDIAN_SFX)_$(I2C_MAP_ADDR).out
+
+test_c665x:
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='NOR_SPI' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='NAND_SPI' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='NOR_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='NAND_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='NAND_EMIF NOR_EMIF' SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES='SPI NOR_SPI NAND_SPI' I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=no c665x
+       make -f makestg1 ARCH=c64x TARGET=c665x ENDIAN_MODE=both CEXCLUDES=I2C SPI_DEFS='SPI_ROM=1 SPI_MODE=3 SPI_ADDR_WIDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=8 SPI_CLKDIV=0x20' c665x
+
 # Test - builds all the targets, with single component exclusion
 
 test_c6455:
@@ -380,7 +400,7 @@ test_c6474:
        make -f makestg1 ARCH=c64x TARGET=c6474 I2C_BUS_ADDR=0x50 I2C_MAP_ADDR=$(I2C_MAP_ADDR) COMPACT_I2C=yes ENDIAN_MODE=both CEXCLUDES=BLOB      c6474
 
 
-test_build: test_c6455 test_c6457 test_c6472 test_c6474 test_c66x
+test_build: test_c6455 test_c6457 test_c6472 test_c6474 test_c66x test_c665x
 
 
 # will need to add a line for each additional ARCH type added
@@ -392,6 +412,7 @@ clean:
        make -f makestg2 cleant  ARCH=c64x TARGET=c6455
        make -f makestg2 cleant  ARCH=c64x TARGET=c6457
        make -f makestg2 cleant  ARCH=c64x TARGET=c66x
+       make -f makestg2 cleant  ARCH=c64x TARGET=c665x
        make -C ../util/bconvert       clean
        make -C ../util/btoccs         clean
        make -C ../util/i2cConfig      clean    ARCH=c64x TARGET=c6455
@@ -400,6 +421,7 @@ clean:
        make -C ../util/i2cConfig      clean    ARCH=c64x TARGET=c6474l
        make -C ../util/i2cConfig      clean    ARCH=c64x TARGET=c6457
        make -C ../util/i2cConfig      clean    ARCH=c64x TARGET=c66x
+       make -C ../util/i2cConfig      clean    ARCH=c64x TARGET=c665x  
        make -C ../util/romparse       clean
        make -C ../util/iblConfig/build    clean
        make -C ../test/test1              clean
diff --git a/src/make/ibl_c665x/i2crom.map.pre b/src/make/ibl_c665x/i2crom.map.pre
new file mode 100644 (file)
index 0000000..cf22cc0
--- /dev/null
@@ -0,0 +1,214 @@
+#include "iblcfg.h"
+;  This file is run through the C preprocessor to get the build time layout information
+;  The following values must be defined:
+;     I2C_BUS_ADDR   - The I2C bus address of the eeprom holding the ROM boot info and the layout info
+;        INIT_EXE_FILE  - The I2C blocked stage 1 of the ibl
+;     EXE_FILE_1     - The I2C blocked stage 2 of the ibl, must be the little endian version
+;     EXE_FILE_2        - The I2C blocked stage 2 of the ibl, must be the big endian version
+;     PAD_FILE_ID_1  - This pad holds the IBL configuration structure for the little endian version
+;     PAD_FILE_ID_2  - This pad holds the IBL configuration structure for the big endian version
+;
+;  The section statement directs the ROM boot loader to load the initial endian independent 
+;  portion of the IBL
+section 
+{
+  param_index    = 0
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 1
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 2
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 3
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 4
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 5
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 6
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+section 
+{
+  param_index    = 7
+  boot_mode      = 40
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  options        = 1
+
+  core_freq_mhz    = 100
+  i2c_clk_freq_khz = 200
+
+  dev_addr_ext = I2C_BUS_ADDR
+
+  multi_i2c_id = 0
+  my_i2c_id    = 1
+  address_delay = 0
+  exe_file = INIT_EXE_FILE
+}
+
+; The layout statement defines how the resulting I2C image is layed out. The base address
+; of this (given in the dev_addr) statement must be known to the initial IBL program
+; at compile time. The layout block is simple a group of 32 bit i2c addresses, so 
+; the order of the exe_file and pad_file_id statements must be configured so as to
+; match the definition of struct iblI2cMap_t defined in ibl.h.
+layout
+{
+  dev_addr     = IBL_CFG_I2C_MAP_TABLE_DATA_ADDR               ; Defined in iblcfg.h
+  dev_addr_ext = I2C_BUS_ADDR
+  file_align   = 0x80
+
+  exe_file    = EXE_FILE_1
+  pad_file_id = PAD_FILE_ID_1
+
+
+  exe_file    = EXE_FILE_2
+  pad_file_id = PAD_FILE_ID_2
+}
+
+; The pad statements simply provide space for the IBL configuration structures. It is valid to
+; have a single configuration structure which is used for both endian values.
+pad
+{
+  pad_file_id  = 1
+  dev_addr     = 0x500
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+
+#if (PAD_FILE_ID_1 != PAD_FILE_ID_2)
+pad
+{
+  pad_file_id  = 2
+  dev_addr     = 0x800
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = 0x300
+}
+#endif
+
+
+
+
diff --git a/src/make/ibl_c665x/ibl.cmd b/src/make/ibl_c665x/ibl.cmd
new file mode 100644 (file)
index 0000000..d31d8e2
--- /dev/null
@@ -0,0 +1,37 @@
+/************************************************************************************
+ * FILE PURPOSE: Define the memory usage of the ibl module for the c66x
+ ************************************************************************************
+ * FILE NAME: ibl.cmd
+ *
+ * DESCRIPTION: The memory placement for the IBL is defined
+ *
+ ************************************************************************************/
+
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_objs.inc"
+
+
+/* Symbols from the 1st portion of the load, generated by the make process */
+#include "ibl_init_symbols.inc"
+
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
+
+SECTIONS
+{
+       .cinit  > TEXT
+       .const  > TEXT
+       .text   > TEXT
+       .switch > TEXT
+       .far    > DATA
+       .bss    > DATA
+
+       .linkram    > LINKRAM
+       .cppi       > CPPIRAM
+       .mac_buffer > PKTRAM
+
+}
+
diff --git a/src/make/ibl_c665x/ibl.rmd b/src/make/ibl_c665x/ibl.rmd
new file mode 100644 (file)
index 0000000..41c1b87
--- /dev/null
@@ -0,0 +1,11 @@
+-a
+-boot
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x0400, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c665x/ibl_common.inc b/src/make/ibl_c665x/ibl_common.inc
new file mode 100644 (file)
index 0000000..229e812
--- /dev/null
@@ -0,0 +1,42 @@
+/************************************************************************************
+ * FILE PURPOSE: Provide common memory and sections definitions for ibl_init and ibl
+ ************************************************************************************
+ * FILE NAME: ibl_common.inc
+ *
+ * DESCRIPTION: Defines the common memory map and section placement required
+ *                         to get ibl and ibl_init to work together in a two stage load
+ *                             process.
+ *************************************************************************************/
+
+-c
+-stack 0x800
+-heap  0x8000
+
+
+MEMORY
+{
+       TEXT_INIT :  origin = 0x800000, length = 0x4200
+       TEXT      :  origin = 0x804200, length = 0xbe00
+       STACK     :  origin = 0x810000, length = 0x0800
+       HEAP      :  origin = 0x810800, length = 0x8000
+       DATA_INIT :  origin = 0x818800, length = 0x0400
+       DATA      :  origin = 0x818c00, length = 0x2c00
+       CFG       :  origin = 0x81b800, length = 0x0300
+       STAT      :  origin = 0x81bb00, length = 0x0200
+
+       LINKRAM   :  origin = 0x1081be00, length = 0x0200
+       CPPIRAM   :  origin = 0x1081c000, length = 0x0200
+       PKTRAM    :  origin = 0x1081c200, length = 0x0800
+}
+
+
+SECTIONS
+{
+       .stack  > STACK
+       .sysmem > HEAP
+
+       .ibl_config_table > CFG
+       .ibl_status_table > STAT
+
+}
+
diff --git a/src/make/ibl_c665x/ibl_init.cmd b/src/make/ibl_c665x/ibl_init.cmd
new file mode 100644 (file)
index 0000000..4be6e46
--- /dev/null
@@ -0,0 +1,31 @@
+/************************************************************************************
+ * FILE PURPOSE: Define the memory usage of the ibl module for the c6472
+ ************************************************************************************
+ * FILE NAME: ibl.cmd
+ *
+ * DESCRIPTION: The memory placement for the IBL is defined
+ *
+ ************************************************************************************/
+
+/* In order to speed build time during debug, the object files are saved in
+ * both big and little endian format. The include file is generated by
+ * make to use the correct endian object files
+ */
+#include "ibl_init_objs.inc"
+
+
+/* Common memory and section areas between ibl_init and ibl */
+#include "ibl_common.inc"
+
+
+SECTIONS
+{
+       .cinit  > TEXT_INIT
+       .const  > TEXT_INIT
+       .text   > TEXT_INIT
+       .switch > TEXT_INIT
+       .far    > DATA_INIT
+       .bss    > DATA_INIT
+
+}
+
diff --git a/src/make/ibl_c665x/ibl_init.rmd b/src/make/ibl_c665x/ibl_init.rmd
new file mode 100644 (file)
index 0000000..41c1b87
--- /dev/null
@@ -0,0 +1,11 @@
+-a
+-boot
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x0400, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c665x/ibl_init_image.rmd b/src/make/ibl_c665x/ibl_init_image.rmd
new file mode 100644 (file)
index 0000000..e137e36
--- /dev/null
@@ -0,0 +1,10 @@
+-a
+-e _c_int00
+
+ROMS
+{
+       ROM1:  org = 0x800000, length = 0x20000, memwidth = 32, romwidth = 32
+       files = { ibl_le.b }
+}
+
+
diff --git a/src/make/ibl_c665x/ibl_init_objs_template.inc b/src/make/ibl_c665x/ibl_init_objs_template.inc
new file mode 100644 (file)
index 0000000..61003b7
--- /dev/null
@@ -0,0 +1,31 @@
+/* ibl_init_objs_template.inc
+ *
+ *  list of object files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblinit.ENDIAN_TAG.oc
+../device/c64x/make/c665xinit.ENDIAN_TAG.oc
+../device/c64x/make/c665xutil.ENDIAN_TAG.oc
+../device/c64x/make/c64x.ENDIAN_TAG.oa
+../hw/c64x/make/pll.ENDIAN_TAG.oc
+../hw/c64x/make/cfgpll.ENDIAN_TAG.oc
+../hw/c64x/make/cfgpll2.ENDIAN_TAG.oc
+../interp/c64x/make/btblwrap.ENDIAN_TAG.oc
+../interp/c64x/make/btblpr.ENDIAN_TAG.oc
+../interp/c64x/make/gem.ENDIAN_TAG.oc
+../hw/c64x/make/psc.ENDIAN_TAG.oc
+
+#ifndef EXCLUDE_I2C
+../main/c64x/make/ibliniti2c.ENDIAN_TAG.oc
+../hw/c64x/make/i2c.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_SPI_NOR
+../main/c64x/make/iblinitspinor.ENDIAN_TAG.oc
+../hw/c64x/make/spi.ENDIAN_TAG.oc
+#endif
+
+
+
+
+
diff --git a/src/make/ibl_c665x/ibl_objs_template.inc b/src/make/ibl_c665x/ibl_objs_template.inc
new file mode 100644 (file)
index 0000000..fd48eb1
--- /dev/null
@@ -0,0 +1,103 @@
+/* ibl_objs_template.inc
+ *
+ * list of oject files tagged with the endian field for replacement during make
+ */
+
+../main/c64x/make/iblmain.ENDIAN_TAG.oc
+../device/c64x/make/c665x.ENDIAN_TAG.oc
+../device/c64x/make/c665xutil.ENDIAN_TAG.oc
+../driver/c64x/make/timer.ENDIAN_TAG.oc
+../hw/c64x/make/t64.ENDIAN_TAG.oc
+../hw/c64x/make/psc.ENDIAN_TAG.oc
+../hw/c64x/make/emif4.ENDIAN_TAG.oc
+../device/c64x/make/c64x.ENDIAN_TAG.oa
+../hw/c64x/make/pll.ENDIAN_TAG.oc
+../hw/c64x/make/cfgpll.ENDIAN_TAG.oc
+../hw/c64x/make/cfgpll2.ENDIAN_TAG.oc
+../hw/c64x/make/c66x_uart.ENDIAN_TAG.oc
+
+#ifndef EXCLUDE_BIS
+../interp/c64x/make/bis.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_COFF
+../interp/c64x/make/cload.ENDIAN_TAG.oc
+../interp/c64x/make/osal.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_BLOB
+../interp/c64x/make/blob.ENDIAN_TAG.oc
+#endif
+
+#ifndef EXCLUDE_ELF
+../interp/c64x/make/dload.ENDIAN_TAG.oc
+../interp/c64x/make/elfwrap.ENDIAN_TAG.oc
+../interp/c64x/make/dlw_client.ENDIAN_TAG.oc
+../interp/c64x/make/dload_endian.ENDIAN_TAG.oc
+../interp/c64x/make/ArrayList.ENDIAN_TAG.oc
+#endif
+
+
+#ifndef EXCLUDE_ETH
+../ethboot/c64x/make/ethboot.ENDIAN_TAG.oc
+../driver/c64x/make/net.ENDIAN_TAG.oc
+../driver/c64x/make/arp.ENDIAN_TAG.oc
+../driver/c64x/make/ip.ENDIAN_TAG.oc
+../driver/c64x/make/udp.ENDIAN_TAG.oc
+../driver/c64x/make/stream.ENDIAN_TAG.oc
+../driver/c64x/make/bootp.ENDIAN_TAG.oc
+../driver/c64x/make/tftp.ENDIAN_TAG.oc
+../hw/c64x/make/mdio.ENDIAN_TAG.oc
+../hw/c64x/make/serdes.ENDIAN_TAG.oc
+../hw/c64x/make/sgmii.ENDIAN_TAG.oc
+../hw/c64x/make/cpmacdrv.ENDIAN_TAG.oc
+#endif
+
+
+/* -------------- */
+#if (!defined(EXCLUDE_NAND_EMIF) || !defined(EXCLUDE_NAND_SPI) || !defined(EXCLUDE_NAND_GPIO))
+
+../nandboot/c64x/make/nandboot.ENDIAN_TAG.oc
+../driver/c64x/make/nand.ENDIAN_TAG.oc
+../ecc/c64x/make/3byte_ecc.ENDIAN_TAG.oc
+
+ #ifndef EXCLUDE_NAND_EMIF
+ ../hw/c64x/make/nandemif25.ENDIAN_TAG.oc
+ #endif
+
+ #ifndef EXCLUDE_NAND_GPIO
+ ../hw/c64x/make/gpio.ENDIAN_TAG.oc
+ ../hw/c64x/make/nandgpio.ENDIAN_TAG.oc
+ #endif
+ #ifndef EXCLUDE_NAND_SPI
+  ../hw/c64x/make/nandspi.ENDIAN_TAG.oc
+ #endif
+
+#endif
+/* -------------- */
+
+
+
+/* -------------- */
+#if (!defined(EXCLUDE_NOR_EMIF) || !defined(EXCLUDE_NOR_SPI))
+
+../norboot/c64x/make/norboot.ENDIAN_TAG.oc
+../driver/c64x/make/nor.ENDIAN_TAG.oc
+../hw/c64x/make/emif25.ENDIAN_TAG.oc
+
+ #ifndef EXCLUDE_NOR_SPI
+ ../hw/c64x/make/norspi.ENDIAN_TAG.oc
+ #endif
+
+ #ifndef EXCLUDE_NOR_EMIF
+ ../hw/c64x/make/noremif25.ENDIAN_TAG.oc
+ #endif
+
+#endif
+/* -------------- */
+
+
+#if (!defined(EXCLUDE_NOR_SPI) || !defined(EXCLUDE_NAND_SPI))
+../hw/c64x/make/spi.ENDIAN_TAG.oc
+#endif
diff --git a/src/make/ibl_c665x/spiRom.map.pre b/src/make/ibl_c665x/spiRom.map.pre
new file mode 100644 (file)
index 0000000..2568761
--- /dev/null
@@ -0,0 +1,80 @@
+#include "iblcfg.h"
+;  This file is run through the C preprocessor to get the build time layout information
+;  The following values must be defined:
+;     SPI_CSEL       - The SPI chip select of the eeprom holding the ROM boot info and the layout info
+;     SPI_ADDR_WIDTH - Number of bits in the SPI address
+;     SPI_NPINS                 - Number of pins used by the interface (4 or 5)
+;     SPI_MODE       - SPI operation mode (0-3)
+;        INIT_EXE_FILE  - The SPI blocked stage 1 of the ibl
+;     EXE_FILE_1     - The SPI blocked stage 2 of the ibl, must be the little endian version
+;     EXE_FILE_2        - The SPI blocked stage 2 of the ibl, must be the big endian version
+;     PAD_FILE_ID_1  - This pad holds the IBL configuration structure for the little endian version
+;     PAD_FILE_ID_2  - This pad holds the IBL configuration structure for the big endian version
+;
+;  The section statement directs the ROM boot loader to load the initial endian independent 
+;  portion of the IBL
+section 
+{
+  param_index    = 0
+  boot_mode      = 50
+  sw_pll_prediv         = 0
+  sw_pll_mult    = 0
+  sw_pll_postdiv = 0
+  sw_pll_flags   = 0
+
+  options        = 1
+  core_freq_mhz  = 800
+
+  bus_freq_mhz     = 1
+  bus_freq_khz     = 0
+
+  addr_width   = SPI_ADDR_WIDTH
+  n_pins       = SPI_NPIN
+  mode         = SPI_MODE
+  csel         = SPI_CSEL
+
+  exe_file = INIT_EXE_FILE
+}
+
+; The layout statement defines how the resulting SPI image is layed out. The base address
+; of this (given in the dev_addr) statement must be known to the initial IBL program
+; at compile time. The layout block is simple a group of 32 bit i2c addresses, so 
+; the order of the exe_file and pad_file_id statements must be configured so as to
+; match the definition of struct iblI2cMap_t defined in ibl.h.
+layout
+{
+  dev_addr     = IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_LSW           ; Defined in iblcfg.h
+  dev_addr_ext = IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_MSW
+  file_align   = 0x80
+
+  exe_file    = EXE_FILE_1
+  pad_file_id = PAD_FILE_ID_1
+
+
+  exe_file    = EXE_FILE_2
+  pad_file_id = PAD_FILE_ID_2
+}
+
+; The pad statements simply provide space for the IBL configuration structures. It is valid to
+; have a single configuration structure which is used for both endian values.
+pad
+{
+  pad_file_id  = 1
+  dev_addr     = 0x500
+  dev_addr_ext = IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_MSW
+  len          = 0x300
+}
+
+#if (PAD_FILE_ID_1 != PAD_FILE_ID_2)
+pad
+{
+  pad_file_id  = 2
+  dev_addr     = 0x800
+  dev_addr_ext = I2C_BUS_ADDR
+  len          = IBL_CFG_SPI_MAP_TABLE_DATA_ADDR_MSW
+}
+#endif
+
+
+
+
index 08a43bde23146cff4159027429105e167ab76808..e3e34cb364ec35723f8eab15942b985fbb304f3d 100644 (file)
@@ -10,7 +10,7 @@
 #*                     [COMPACT_I2C=yes] [I2C_SIZE_BYTES=..]
 #*******************************************************************************************
 
-IBLS_C6X= c6455 c6472 c6474 c6474l c6457 c66x
+IBLS_C6X= c6455 c6472 c6474 c6474l c6457 c66x c665x
 
 
 # Excluding functions from the build reduces the I2C eeprom memory used and
index 7f21da7764a84974d673a70bd534b2c9d155ca05..d587664263d0ef805c39ded3f0800f87ebf9f63a 100644 (file)
@@ -19,7 +19,7 @@ CLEAN_MODULES=$(addprefix clean_,$(subst hw,,$(MODULES)))
 CLEAN_MODULES+=$(addprefix clean_,$(CFG_MODULES))
 
 
-TARGETS= c6472 c6474 c6474l c6455 c6457 c66x
+TARGETS= c6472 c6474 c6474l c6455 c6457 c66x c665x
 
 # The main module needs to know the device address of the i2c where the image map resides
 MAINDEFS=-DIBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR=$(I2C_BUS_ADDR)
@@ -60,7 +60,7 @@ export I2C_MAP_ADDR
 
 $(TARGETS): iblMain
 
-ifeq ($(TARGET),c66x)
+ifeq (($(TARGET),c66x) || $(TARGET),c665x )
     HAS_SPI=1
 else
     HAS_SPI=0
@@ -180,7 +180,7 @@ iblInit: $(CFG_MODULES) $(MODULES)
        ../util/btoccs/b2i2c ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl.i2c.b
        ../util/btoccs/b2ccs ibl_$(TARGET)/ibl.i2c.b ibl_$(TARGET)/ibl_init.i2c.$(IEXT).ccs
 
-       sed -e 's/\\r//' ../util/symExtract/symExtract > ../util/symExtract/symExtract_unix
+       sed -e 's/\r//' ../util/symExtract/symExtract > ../util/symExtract/symExtract_unix
        bash ../util/symExtract/symExtract_unix ibl_$(TARGET)/ibl_$(TARGET)_init.map ibl_$(TARGET)/ibl_init_symbols.inc $(COMMON_SYMBOLS)
        rm -f ../util/symExtract/symExtract_unix
 
index 4f4689becfd3d7f98b662b3c51642454782e326d..b5982250bbb549dcda64354eb41da990e38fe244 100644 (file)
@@ -43,7 +43,7 @@
 #*
 #***************************************************************
 
-DEVICES= c6455 c6472 c6474 c6474l c6457 c66x
+DEVICES= c6455 c6472 c6474 c6474l c6457 c66x c665x
 
 all:
        @echo must specify a target [ $(DEVICES) ]
index ef702969c503fff0123b155f8e411fd07eb1b4b8..b1a2842c2826ee3d6b798ff770035777eaf6e74a 100755 (executable)
@@ -76,7 +76,7 @@
 #define ibl_EVM_C6474M  0x41   /**< C6474 Mez EVM */
 #define ibl_EVM_C6670L  0x50   /**< C6670 Low Cost EVM */
 #define ibl_EVM_C6678L  0x60   /**< C6678 Low Cost EVM */
-    
+#define ibl_EVM_C6657L  0x70   /**< C6657 Low Cost EVM */    
 /* @} */  
 
 menuitem "EVM c6472 IBL";
@@ -1196,3 +1196,218 @@ hotmenu setConfig_c6670_main()
     ibl.chkSum = 0;
 }
 
+menuitem "EVM c6657 IBL";
+
+hotmenu setConfig_c6657_main()
+{
+       ibl.iblMagic = ibl_MAGIC_VALUE;
+       ibl.iblEvmType = ibl_EVM_C6657L;
+
+       /* Main PLL: 100 MHz reference, 1GHz output */
+       ibl.pllConfig[ibl_MAIN_PLL].doEnable      = 1;
+       ibl.pllConfig[ibl_MAIN_PLL].prediv        = 1;
+       ibl.pllConfig[ibl_MAIN_PLL].mult          = 20;
+       ibl.pllConfig[ibl_MAIN_PLL].postdiv       = 2;
+       ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 1000;
+
+       /* DDR PLL: */
+       ibl.pllConfig[ibl_DDR_PLL].doEnable       = 1; 
+       ibl.pllConfig[ibl_DDR_PLL].prediv         = 3;
+       ibl.pllConfig[ibl_DDR_PLL].mult           = 40;
+       ibl.pllConfig[ibl_DDR_PLL].postdiv        = 2;
+       ibl.pllConfig[ibl_DDR_PLL].pllOutFreqMhz  = 1333;
+
+    /* Net PLL: 100 MHz reference, 1050 MHz output (followed by a built in divide by 3 to give 350 MHz to PA) */
+
+       ibl.pllConfig[ibl_NET_PLL].doEnable       = 0;
+
+
+       ibl.ddrConfig.configDdr = TRUE;
+       ibl.ddrConfig.uEmif.emif4p0.registerMask = ibl_EMIF4_ENABLE_sdRamConfig | ibl_EMIF4_ENABLE_sdRamRefreshCtl | ibl_EMIF4_ENABLE_sdRamTiming1 | ibl_EMIF4_ENABLE_sdRamTiming2 | ibl_EMIF4_ENABLE_sdRamTiming3 | ibl_EMIF4_ENABLE_ddrPhyCtl1;
+
+       ibl.ddrConfig.uEmif.emif4p0.sdRamConfig                         = 0x62477AB2;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamConfig2                        = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamRefreshCtl                     = 0x000030D4;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming1                        = 0x1333780C;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming2                        = 0x30717FE3;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming3                        = 0x559F86AF;
+       ibl.ddrConfig.uEmif.emif4p0.lpDdrNvmTiming                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.powerManageCtl                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.iODFTTestLogic                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.performCountCfg                     = 0;
+       ibl.ddrConfig.uEmif.emif4p0.performCountMstRegSel               = 0;
+       ibl.ddrConfig.uEmif.emif4p0.readIdleCtl                         = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sysVbusmIntEnSet                    = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamOutImpdedCalCfg                = 0;
+       ibl.ddrConfig.uEmif.emif4p0.tempAlterCfg                        = 0;
+       ibl.ddrConfig.uEmif.emif4p0.ddrPhyCtl1                          = 0x0010010F;
+       ibl.ddrConfig.uEmif.emif4p0.ddrPhyCtl2                          = 0;
+       ibl.ddrConfig.uEmif.emif4p0.priClassSvceMap                     = 0;
+       ibl.ddrConfig.uEmif.emif4p0.mstId2ClsSvce1Map                   = 0;
+       ibl.ddrConfig.uEmif.emif4p0.mstId2ClsSvce2Map                   = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccCtl                              = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccRange1                           = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccRange2                           = 0;
+       ibl.ddrConfig.uEmif.emif4p0.rdWrtExcThresh                      = 0;
+
+       /* SGMII 0 is present */
+        ibl.sgmiiConfig[0].configure = TRUE;
+        ibl.sgmiiConfig[0].adviseAbility = 0x1;
+        ibl.sgmiiConfig[0].control       = 0x1;
+        ibl.sgmiiConfig[0].txConfig      = 0x00000e21;
+        ibl.sgmiiConfig[0].rxConfig      = 0x00081021;
+        ibl.sgmiiConfig[0].auxConfig     = 0x0000000b;
+
+        /* There is no port 1 on the 6657 */
+        ibl.sgmiiConfig[1].configure = FALSE;
+
+        /* MDIO configuration */
+        ibl.mdioConfig.nMdioOps = 0;
+        ibl.mdioConfig.mdioClkDiv = 0xa5;
+        ibl.mdioConfig.interDelay = 3000;   /* ~2ms at 1000 MHz */
+
+        ibl.spiConfig.addrWidth  = 24;
+       ibl.spiConfig.nPins      = 5;
+       ibl.spiConfig.mode       = 1;   /* TODO: Confirm SPI Mode */
+       ibl.spiConfig.csel       = 2;
+       ibl.spiConfig.c2tdelay   = 1;
+       ibl.spiConfig.busFreqMHz = 20;
+
+       ibl.emifConfig[0].csSpace    = 2;
+       ibl.emifConfig[0].busWidth   = 8;
+       ibl.emifConfig[0].waitEnable = 0;
+
+       ibl.emifConfig[1].csSpace    = 0;
+       ibl.emifConfig[1].busWidth   = 0;
+       ibl.emifConfig[1].waitEnable = 0;
+
+       ibl.bootModes[0].bootMode = ibl_BOOT_MODE_NOR;
+       ibl.bootModes[0].priority = ibl_HIGHEST_PRIORITY;
+       ibl.bootModes[0].port     = 0;
+
+       ibl.bootModes[0].u.norBoot.bootFormat   = ibl_BOOT_FORMAT_ELF;
+       ibl.bootModes[0].u.norBoot.bootAddress[0][0]    = 0;            /* Image 0 NOR offset byte address in LE mode */ 
+       ibl.bootModes[0].u.norBoot.bootAddress[0][1]    = 0xA00000;     /* Image 1 NOR offset byte address in LE mode  */
+       ibl.bootModes[0].u.norBoot.bootAddress[1][0]    = 0;            /* Image 0 NOR offset byte address in BE mode */ 
+       ibl.bootModes[0].u.norBoot.bootAddress[1][1]    = 0xA00000;     /* Image 1 NOR offset byte address in BE mode  */
+       ibl.bootModes[0].u.norBoot.interface    = ibl_PMEM_IF_SPI;
+    ibl.bootModes[0].u.norBoot.blob[0][0].startAddress  = 0x80000000;       /* Image 0 load start address in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][0].sizeBytes     = 0xA00000;         /* Image 0 size (10 MB) in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].startAddress  = 0x80000000;       /* Image 1 load start address in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].sizeBytes     = 0xA00000;         /* Image 1 size (10 MB) in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].startAddress  = 0x80000000;       /* Image 0 load start address in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].sizeBytes     = 0xA00000;         /* Image 0 size (10 MB) in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].startAddress  = 0x80000000;       /* Image 1 load start address in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].sizeBytes     = 0xA00000;         /* Image 1 size (10 MB) in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in BE mode */
+
+    ibl.bootModes[1].bootMode = ibl_BOOT_MODE_NAND;
+    ibl.bootModes[1].priority = ibl_HIGHEST_PRIORITY;
+    ibl.bootModes[1].port     = 0;
+
+    ibl.bootModes[1].u.nandBoot.bootFormat        = ibl_BOOT_FORMAT_BBLOB;
+    ibl.bootModes[1].u.nandBoot.bootAddress[0][0]        = 0x20000;         /* Image 0 NAND offset address (block 1) in LE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[0][1]        = 0x4000000;      /* Image 1 NAND offset address (block 512) in LE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[1][0]        = 0x20000;        /* Image 0 NAND offset address (block 1) in BE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[1][1]        = 0x4000000;      /* Image 1 NAND offset address (block 512) in BE mode */
+    ibl.bootModes[1].u.nandBoot.interface         = ibl_PMEM_IF_CHIPSEL_2;
+
+    ibl.bootModes[1].u.nandBoot.blob[0][0].startAddress  = 0x80000000;       /* Image 0 load start address in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][0].sizeBytes     = 0xFFC000;         /* Image 0 size in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].startAddress  = 0x80000000;       /* Image 1 load start address in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].sizeBytes     = 0xFFC000;         /* Image 1 size in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].startAddress  = 0x80000000;       /* Image 0 load start address in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].sizeBytes     = 0xFFC000;         /* Image 0 size in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].startAddress  = 0x80000000;       /* Image 1 load start address in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].sizeBytes     = 0xFFC000;         /* Image 1 size in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in BE mode */
+
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.busWidthBits  = 8;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageSizeBytes = 2048;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageEccBytes  = 64;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pagesPerBlock = 64;
+    ibl.bootModes[1].u.nandBoot.nandInfo.totalBlocks   = 1024;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.addressBytes  = 4;
+    ibl.bootModes[1].u.nandBoot.nandInfo.lsbFirst      = TRUE;
+    ibl.bootModes[1].u.nandBoot.nandInfo.blockOffset   = 22;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageOffset    = 16;
+    ibl.bootModes[1].u.nandBoot.nandInfo.columnOffset  = 0;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[0]  = 0;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[1]  = 1;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[2]  = 2;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[3]  = 3;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[4]  = 4;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[5]  = 6;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[6]  = 7;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[7]  = 13;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[8]  = 14;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[9]  = 15;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.badBlkMarkIdx[0]= 0;
+    ibl.bootModes[1].u.nandBoot.nandInfo.badBlkMarkIdx[1]= 0xff;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.resetCommand    = 0xff;
+    ibl.bootModes[1].u.nandBoot.nandInfo.readCommandPre  = 0x00;
+    ibl.bootModes[1].u.nandBoot.nandInfo.readCommandPost = 0x30;
+    ibl.bootModes[1].u.nandBoot.nandInfo.postCommand     = TRUE;
+
+
+       ibl.bootModes[2].bootMode = ibl_BOOT_MODE_TFTP;
+       ibl.bootModes[2].priority = ibl_HIGHEST_PRIORITY+1;
+       ibl.bootModes[2].port     = ibl_PORT_SWITCH_ALL;
+
+       ibl.bootModes[2].u.ethBoot.doBootp          = TRUE;
+       ibl.bootModes[2].u.ethBoot.useBootpServerIp = TRUE;
+       ibl.bootModes[2].u.ethBoot.useBootpFileName = TRUE;
+       ibl.bootModes[2].u.ethBoot.bootFormat       = ibl_BOOT_FORMAT_BBLOB;
+
+
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.ipAddr,    192,168,1,3);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.serverIp,  192,168,1,2);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.gatewayIp, 192,168,1,1);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.netmask,   255,255,255,0);
+
+    /* Use the e-fuse value */
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[0] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[1] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[2] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[3] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[4] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[5] = 0;
+
+
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[0]  = 'c';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[1]  = '6';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[2]  = '6';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[3]  = '5';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[4]  = '7';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[5]  = '-';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[6]  = 'l';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[7]  = 'e';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[8]  = '.';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[9]  = 'b';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[10] = 'i';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[11] = 'n';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[12] = '\0';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[13] = '\0';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[14] = '\0';
+
+    ibl.bootModes[2].u.ethBoot.blob.startAddress  = 0x80000000;       /* Load start address */
+    ibl.bootModes[2].u.ethBoot.blob.sizeBytes     = 0x20000000;
+    ibl.bootModes[2].u.ethBoot.blob.branchAddress = 0x80000000;       /* Branch address after loading */
+
+    ibl.chkSum = 0;
+
+}
+
+
+
index 0a06392f515fe989bb9662a39bc715d2894a7526..6f24e4ccb9a97ad1feaf99cd441e0d47bd7fbf9b 100644 (file)
@@ -7,7 +7,7 @@
 #*
 #**************************************************************************
 
-DEVICES= c6455 c6472 c6474 c6474l c6457 c66x
+DEVICES= c6455 c6472 c6474 c6474l c6457 c66x c665x
 
 ifndef IBL_ROOT
  IBL_ROOT=../..
@@ -22,20 +22,30 @@ endif
 
 # The PLL object files are device specific
 PLL_PATH= ../../hw/c64x/make
-ifeq ($(TARGET),c66x)
+ifeq ($(TARGET),c66x) 
  PLL_OBJS=  $(PLL_PATH)/pll.$(IEXT).oc $(PLL_PATH)/cfgpll.$(IEXT).oc $(PLL_PATH)/cfgpll2.$(IEXT).oc
  PLL_OBJS+= ../../device/c64x/make/c64x.$(IEXT).oa
  PSC_OBJS= ../../hw/c64x/make/psc.$(IEXT).oc
 else
- PLL_OBJS= $(PLL_PATH)/pll.$(IEXT).oc
+ ifeq ($(TARGET),c665x) 
+ PLL_OBJS=  $(PLL_PATH)/pll.$(IEXT).oc $(PLL_PATH)/cfgpll.$(IEXT).oc $(PLL_PATH)/cfgpll2.$(IEXT).oc
+ PLL_OBJS+= ../../device/c64x/make/c64x.$(IEXT).oa
+ PSC_OBJS= ../../hw/c64x/make/psc.$(IEXT).oc
+ else
+  PLL_OBJS= $(PLL_PATH)/pll.$(IEXT).oc
+ endif 
 endif
 
 # Device specific helper utilities
 
 
 ECODIR= $(IBL_ROOT)/util/i2cConfig
-ifeq ($(TARGET),c66x)
+ifeq ($(TARGET),c66x) 
  TFILES= ../../device/c64x/make/$(TARGET)util.$(IEXT).oc
+else
+ ifeq ($(TARGET),c665x) 
+  TFILES= ../../device/c64x/make/$(TARGET)util.$(IEXT).oc
+ endif
 endif
 
 MODULES= hw 
index a4842841e16af53c9bb3485690b37585b6d40434..fa8d12e63ab7a72bf4a3fda061262c347b4f5a7f 100644 (file)
@@ -34,7 +34,9 @@ endif
 ifeq ($(EVM),c6670l)
        DEVICE_ID = 7
 endif
-
+ifeq ($(EVM),c6657l)
+       DEVICE_ID = 8
+endif
 LNK_OPTS +=
 
 ###############################################################################
index 0efed6b505a1d8133d6e78deaeb4c6516b674cec..885f67c617e4d69e356545c9d12d685d84c784e2 100644 (file)
@@ -1148,4 +1148,219 @@ ibl_t c6670_ibl_config(void)
 
     return(ibl);
 }
+ibl_t c6657_ibl_config(void)
+{
+       ibl_t ibl;
+    memset(&ibl, 0, sizeof(ibl_t));
+    
+       ibl.iblMagic = ibl_MAGIC_VALUE;
+       ibl.iblEvmType = ibl_EVM_C6657L;
+
+       /* Main PLL: 100 MHz reference, 1GHz output */
+       ibl.pllConfig[ibl_MAIN_PLL].doEnable      = 1;
+       ibl.pllConfig[ibl_MAIN_PLL].prediv        = 1;
+       ibl.pllConfig[ibl_MAIN_PLL].mult          = 20;
+       ibl.pllConfig[ibl_MAIN_PLL].postdiv       = 2;
+       ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 1000;
+
+       /* DDR PLL: */
+       ibl.pllConfig[ibl_DDR_PLL].doEnable       = 1; 
+       ibl.pllConfig[ibl_DDR_PLL].prediv         = 3;
+       ibl.pllConfig[ibl_DDR_PLL].mult           = 40;
+       ibl.pllConfig[ibl_DDR_PLL].postdiv        = 2;
+       ibl.pllConfig[ibl_DDR_PLL].pllOutFreqMhz  = 1333;
+
+    /* Net PLL: 100 MHz reference, 1050 MHz output (followed by a built in divide by 3 to give 350 MHz to PA) */
+
+       ibl.pllConfig[ibl_NET_PLL].doEnable       = 0;
+
+
+       ibl.ddrConfig.configDdr = TRUE;
+       ibl.ddrConfig.uEmif.emif4p0.registerMask = ibl_EMIF4_ENABLE_sdRamConfig | ibl_EMIF4_ENABLE_sdRamRefreshCtl | ibl_EMIF4_ENABLE_sdRamTiming1 | ibl_EMIF4_ENABLE_sdRamTiming2 | ibl_EMIF4_ENABLE_sdRamTiming3 | ibl_EMIF4_ENABLE_ddrPhyCtl1;
+
+       ibl.ddrConfig.uEmif.emif4p0.sdRamConfig                         = 0x62477AB2;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamConfig2                        = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamRefreshCtl                     = 0x000030D4;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming1                        = 0x1333780C;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming2                        = 0x30717FE3;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamTiming3                        = 0x559F86AF;
+       ibl.ddrConfig.uEmif.emif4p0.lpDdrNvmTiming                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.powerManageCtl                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.iODFTTestLogic                      = 0;
+       ibl.ddrConfig.uEmif.emif4p0.performCountCfg                     = 0;
+       ibl.ddrConfig.uEmif.emif4p0.performCountMstRegSel               = 0;
+       ibl.ddrConfig.uEmif.emif4p0.readIdleCtl                         = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sysVbusmIntEnSet                    = 0;
+       ibl.ddrConfig.uEmif.emif4p0.sdRamOutImpdedCalCfg                = 0;
+       ibl.ddrConfig.uEmif.emif4p0.tempAlterCfg                        = 0;
+       ibl.ddrConfig.uEmif.emif4p0.ddrPhyCtl1                          = 0x0010010F;
+       ibl.ddrConfig.uEmif.emif4p0.ddrPhyCtl2                          = 0;
+       ibl.ddrConfig.uEmif.emif4p0.priClassSvceMap                     = 0;
+       ibl.ddrConfig.uEmif.emif4p0.mstId2ClsSvce1Map                   = 0;
+       ibl.ddrConfig.uEmif.emif4p0.mstId2ClsSvce2Map                   = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccCtl                              = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccRange1                           = 0;
+       ibl.ddrConfig.uEmif.emif4p0.eccRange2                           = 0;
+       ibl.ddrConfig.uEmif.emif4p0.rdWrtExcThresh                      = 0;
+
+       /* SGMII 0 is present */
+       ibl.sgmiiConfig[0].configure     = 1;
+        ibl.sgmiiConfig[0].adviseAbility = 1;
+        ibl.sgmiiConfig[0].control       = 1;
+        ibl.sgmiiConfig[0].txConfig      = 0x108a1;
+        ibl.sgmiiConfig[0].rxConfig      = 0x700621;
+        ibl.sgmiiConfig[0].auxConfig     = 0x51;
+
+        /* There is no port 1 on the 6657 */
+        ibl.sgmiiConfig[1].configure = FALSE;
+
+        /* MDIO configuration */
+        ibl.mdioConfig.nMdioOps = 0;
+        ibl.mdioConfig.mdioClkDiv = 0xa5;
+        ibl.mdioConfig.interDelay = 3000;   /* ~2ms at 1000 MHz */
+
+        ibl.spiConfig.addrWidth  = 24;
+       ibl.spiConfig.nPins      = 5;
+       ibl.spiConfig.mode       = 1;   
+       ibl.spiConfig.csel       = 2;
+       ibl.spiConfig.c2tdelay   = 1;
+       ibl.spiConfig.busFreqMHz = 20;
+
+       ibl.emifConfig[0].csSpace    = 2;
+       ibl.emifConfig[0].busWidth   = 8;
+       ibl.emifConfig[0].waitEnable = 0;
+
+       ibl.emifConfig[1].csSpace    = 0;
+       ibl.emifConfig[1].busWidth   = 0;
+       ibl.emifConfig[1].waitEnable = 0;
+
+       ibl.bootModes[0].bootMode = ibl_BOOT_MODE_NOR;
+       ibl.bootModes[0].priority = ibl_HIGHEST_PRIORITY;
+       ibl.bootModes[0].port     = 0;
+
+       ibl.bootModes[0].u.norBoot.bootFormat   = ibl_BOOT_FORMAT_ELF;
+       ibl.bootModes[0].u.norBoot.bootAddress[0][0]    = 0;            /* Image 0 NOR offset byte address in LE mode */ 
+       ibl.bootModes[0].u.norBoot.bootAddress[0][1]    = 0xA00000;     /* Image 1 NOR offset byte address in LE mode  */
+       ibl.bootModes[0].u.norBoot.bootAddress[1][0]    = 0;            /* Image 0 NOR offset byte address in BE mode */ 
+       ibl.bootModes[0].u.norBoot.bootAddress[1][1]    = 0xA00000;     /* Image 1 NOR offset byte address in BE mode  */
+       ibl.bootModes[0].u.norBoot.interface    = ibl_PMEM_IF_SPI;
+    ibl.bootModes[0].u.norBoot.blob[0][0].startAddress  = 0x80000000;       /* Image 0 load start address in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][0].sizeBytes     = 0xA00000;         /* Image 0 size (10 MB) in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].startAddress  = 0x80000000;       /* Image 1 load start address in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].sizeBytes     = 0xA00000;         /* Image 1 size (10 MB) in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[0][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in LE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].startAddress  = 0x80000000;       /* Image 0 load start address in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].sizeBytes     = 0xA00000;         /* Image 0 size (10 MB) in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].startAddress  = 0x80000000;       /* Image 1 load start address in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].sizeBytes     = 0xA00000;         /* Image 1 size (10 MB) in BE mode */
+    ibl.bootModes[0].u.norBoot.blob[1][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in BE mode */
+
+    ibl.bootModes[1].bootMode = ibl_BOOT_MODE_NAND;
+    ibl.bootModes[1].priority = ibl_HIGHEST_PRIORITY;
+    ibl.bootModes[1].port     = 0;
+
+    ibl.bootModes[1].u.nandBoot.bootFormat        = ibl_BOOT_FORMAT_BBLOB;
+    ibl.bootModes[1].u.nandBoot.bootAddress[0][0]        = 0x20000;         /* Image 0 NAND offset address (block 1) in LE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[0][1]        = 0x4000000;      /* Image 1 NAND offset address (block 512) in LE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[1][0]        = 0x20000;        /* Image 0 NAND offset address (block 1) in BE mode */
+    ibl.bootModes[1].u.nandBoot.bootAddress[1][1]        = 0x4000000;      /* Image 1 NAND offset address (block 512) in BE mode */
+    ibl.bootModes[1].u.nandBoot.interface         = ibl_PMEM_IF_CHIPSEL_2;
+
+    ibl.bootModes[1].u.nandBoot.blob[0][0].startAddress  = 0x80000000;       /* Image 0 load start address in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][0].sizeBytes     = 0xFFC000;         /* Image 0 size in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].startAddress  = 0x80000000;       /* Image 1 load start address in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].sizeBytes     = 0xFFC000;         /* Image 1 size in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[0][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in LE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].startAddress  = 0x80000000;       /* Image 0 load start address in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].sizeBytes     = 0xFFC000;         /* Image 0 size in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][0].branchAddress = 0x80000000;       /* Image 0 branch address after loading in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].startAddress  = 0x80000000;       /* Image 1 load start address in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].sizeBytes     = 0xFFC000;         /* Image 1 size in BE mode */
+    ibl.bootModes[1].u.nandBoot.blob[1][1].branchAddress = 0x80000000;       /* Image 1 branch address after loading in BE mode */
+
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.busWidthBits  = 8;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageSizeBytes = 2048;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageEccBytes  = 64;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pagesPerBlock = 64;
+    ibl.bootModes[1].u.nandBoot.nandInfo.totalBlocks   = 1024;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.addressBytes  = 4;
+    ibl.bootModes[1].u.nandBoot.nandInfo.lsbFirst      = TRUE;
+    ibl.bootModes[1].u.nandBoot.nandInfo.blockOffset   = 22;
+    ibl.bootModes[1].u.nandBoot.nandInfo.pageOffset    = 16;
+    ibl.bootModes[1].u.nandBoot.nandInfo.columnOffset  = 0;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[0]  = 0;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[1]  = 1;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[2]  = 2;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[3]  = 3;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[4]  = 4;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[5]  = 6;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[6]  = 7;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[7]  = 13;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[8]  = 14;
+    ibl.bootModes[1].u.nandBoot.nandInfo.eccBytesIdx[9]  = 15;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.badBlkMarkIdx[0]= 5;
+    ibl.bootModes[1].u.nandBoot.nandInfo.badBlkMarkIdx[1]= 0xff;
+
+    ibl.bootModes[1].u.nandBoot.nandInfo.resetCommand    = 0xff;
+    ibl.bootModes[1].u.nandBoot.nandInfo.readCommandPre  = 0x00;
+    ibl.bootModes[1].u.nandBoot.nandInfo.readCommandPost = 0x30;
+    ibl.bootModes[1].u.nandBoot.nandInfo.postCommand     = TRUE;
+
+
+       ibl.bootModes[2].bootMode = ibl_BOOT_MODE_TFTP;
+       ibl.bootModes[2].priority = ibl_HIGHEST_PRIORITY+1;
+       ibl.bootModes[2].port     = 0;
+
+       ibl.bootModes[2].u.ethBoot.doBootp          = TRUE;
+       ibl.bootModes[2].u.ethBoot.useBootpServerIp = TRUE;
+       ibl.bootModes[2].u.ethBoot.useBootpFileName = TRUE;
+       ibl.bootModes[2].u.ethBoot.bootFormat       = ibl_BOOT_FORMAT_BBLOB;
+
+
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.ipAddr,    192,168,1,3);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.serverIp,  192,168,1,2);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.gatewayIp, 192,168,1,1);
+    SETIP(ibl.bootModes[2].u.ethBoot.ethInfo.netmask,   255,255,255,0);
+
+    /* Use the e-fuse value */
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[0] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[1] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[2] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[3] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[4] = 0;
+    ibl.bootModes[2].u.ethBoot.ethInfo.hwAddress[5] = 0;
+
+
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[0]  = 'c';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[1]  = '6';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[2]  = '6';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[3]  = '5';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[4]  = '7';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[5]  = '-';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[6]  = 'l';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[7]  = 'e';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[8]  = '.';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[9]  = 'b';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[10] = 'i';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[11] = 'n';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[12] = '\0';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[13] = '\0';
+    ibl.bootModes[2].u.ethBoot.ethInfo.fileName[14] = '\0';
+
+    ibl.bootModes[2].u.ethBoot.blob.startAddress  = 0x80000000;       /* Load start address */
+    ibl.bootModes[2].u.ethBoot.blob.sizeBytes     = 0x20000000;
+    ibl.bootModes[2].u.ethBoot.blob.branchAddress = 0x80000000;       /* Branch address after loading */
+
+    ibl.chkSum = 0;
+
+    return(ibl);
+}
+
 
index 5bd1096ce22adc4b09506984ea525d13a57c37d7..5495906d15384d564491550040d9cf0c80cc2a37 100644 (file)
@@ -67,7 +67,7 @@
  * @brief
  *  The version number, 1.0.0.9
  */
-#define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,9)
+#define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,10)
 
 #define SETIP(array,i0,i1,i2,i3)      array[0]=(i0);  \
                                       array[1]=(i1);  \
@@ -704,7 +704,7 @@ typedef struct iblBoot_s
 #define ibl_EVM_C6474M  0x41   /**< C6474 Mez EVM */
 #define ibl_EVM_C6670L  0x50   /**< C6670 Low Cost EVM */
 #define ibl_EVM_C6678L  0x60   /**< C6678 Low Cost EVM */
-
+#define ibl_EVM_C6657L  0x70   /**< C6657 Low Cost EVM */
 
 /**
  *  @brief
@@ -909,7 +909,7 @@ ibl_t c6457_ibl_config(void);
 ibl_t c6472_ibl_config(void);
 ibl_t c6678_ibl_config(void);
 ibl_t c6670_ibl_config(void);
-
+ibl_t c6657_ibl_config(void);
 
 
 
index c147d885a3bc9d3e8cebbffcef1de2f94cc0af7b..9035a1839d9f59db8cde33cf361e414b2a1c3d9b 100644 (file)
@@ -314,7 +314,7 @@ void section (void)
 
   current_table.common.length   = 30;
 
-  #ifdef c66x
+  #if (defined(c66x) || defined(c665x))
     if (current_table.common.boot_mode == BOOT_MODE_SPI)
         current_table.common.length   = sizeof(BOOT_PARAMS_SPI_T);
     else
@@ -475,7 +475,7 @@ void assignKeyVal (int field, int value)
                                break;
 
         case CORE_FREQ_MHZ:    
-                               #ifdef c66x
+                               #if (defined(c66x) || defined(c665x))
                                    if (current_table.common.boot_mode == BOOT_MODE_SPI)  {
                                         current_table.spi.cpuFreqMhz = value;
                                         break;
@@ -498,12 +498,12 @@ void assignKeyVal (int field, int value)
         case ADDRESS_DELAY:    current_table.i2c.address_delay = value;
                                break;
 
-#if (!defined(c6455) && !defined(c66x))
+#if (!defined(c6455) && !defined(c66x) && !defined(c665x))
         case SWPLL:            current_table.i2c.swPll = value;
                                break;
 #endif
 
-#ifdef c66x
+#if (defined(c66x) || defined(c665x))
         case SWPLL_PREDIV:    current_table.common.swPllCfg_lsw &= 0x00ff;
                               current_table.common.swPllCfg_lsw |= ((value & 0xff) << 16);
                               break;
@@ -529,7 +529,7 @@ void assignKeyVal (int field, int value)
                                break;
 
 
-#ifdef c66x
+#if (defined(c66x) || defined(c665x))
         case N_PINS:           current_table.spi.nPins = value;
                                break;
 
@@ -899,7 +899,7 @@ void createOutput (void)
     for (j = 0; j < NUM_BOOT_PARAM_TABLES; j++)  {
       if (progFile[i].tag[j] >= 0)  {
         
-        #ifdef c66x
+        #if (defined(c66x) || defined(c665x))
           if (boot_params[progFile[i].tag[j]].common.boot_mode == BOOT_MODE_SPI)  {
             boot_params[progFile[i].tag[j]].spi.read_addr_lsw = (progFile[i].addressBytes & 0xffff);
             boot_params[progFile[i].tag[j]].spi.read_addr_msw = (progFile[i].addressBytes  >> 16) & 0xffff;
index b179f3543d364adfcc725c6bd89143c78742d5f9..b8a3262a2a3106b36069e1d1602ddfd97257cb56 100644 (file)
@@ -58,6 +58,8 @@
  #include "tiboot_c6457.h"
 #elif defined(c66x)
  #include "tiboot_c66x.h"
+#elif defined(c665x)
+ #include "tiboot_c665x.h"
 #else
  #error invalid or missing device specification
 #endif