SPI NAND flash added
[keystone-rtos/ibl.git] / src / ibl.h
1 /*
2  *
3  * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
4  * 
5  * 
6  *  Redistribution and use in source and binary forms, with or without 
7  *  modification, are permitted provided that the following conditions 
8  *  are met:
9  *
10  *    Redistributions of source code must retain the above copyright 
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  *    Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the 
15  *    documentation and/or other materials provided with the   
16  *    distribution.
17  *
18  *    Neither the name of Texas Instruments Incorporated nor the names of
19  *    its contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
23  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
24  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
26  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
27  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
28  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
31  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
32  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34 */
38 /********************************************************************************************************
39  * FILE PURPOSE: IBL configuration and control definitions
40  ********************************************************************************************************
41  * FILE NAME: ibl.h
42  *
43  * DESCRIPTION: Defines the data structure used to handle initial configuration and control
44  *                              of the ibl. This data structure resides at a fixed location in the device memory
45  *                              map. It is initially populated either during the rom boot. The table can be
46  *                              over-written during the ibl process to redirect the boot. For example the ibl
47  *                              can initially load from an i2c which repopulates this table with parameters
48  *                              for an ethernet boot.
49  *
50  *  @file  ibl.h
51  *
52  *  @brief
53  *      This file defines the configuration and control of the IBL
54  *  
55  *
56  ********************************************************************************************************/
57 #ifndef IBL_H
58 #define IBL_H
60 #include "types.h"
63 #define ibl_MAKE_VERSION(a,b,c,d)  ((a << 24) | (b << 16) | (c << 8) | (d << 0))
66 /**
67  * @brief
68  *  The version number, 1.0.0.0
69  */
70 #define ibl_VERSION  ibl_MAKE_VERSION(1,0,0,0)
72 /* Information used to make generate a bootp request */
73 /**
74  * @brief
75  *    Defines parameters used for making a bootp request
76  *
77  * @details
78  *    The bootp request parameters are created from these fields
79  */
80 typedef struct iblBootp_s
81 {
82     uint8   hwAddress[6]; /**< The hardware (mac) address of this device. If set to 0
83                                the ibl will values from e-fuse */
84     
85     uint8   ipDest[4];    /**< The IP address of this device. This is typically set
86                                to IP broadcast */
87     
88 } iblBootp_t;
91 /**
92  * @brief
93  *   This structure contains information used for tftp boot. 
94  *
95  * @details These fields are typically filled in by the bootp packet, but 
96  *          can be provided if bootp will not be used.
97  */
98 typedef struct iblEthBootInfo_s
99 {
100     uint8   ipAddr[4];      /**< The IP address of this device */
101     uint8   serverIp[4];    /**< The IP address of the tftp server */
102     uint8   gatewayIp[4];   /**< The IP address of the gateway */
103     uint8   netmask[4];     /**< The IP netmask */
104     uint8   hwAddress[6];   /**< The hardware (mac) address of this device */
105     char8   fileName[128];  /**< The file name to load */
107 } iblEthBootInfo_t;
108     
109     
110 /**
111  * @def ibl_ETH_PORT_FROM_RBL
112  */
113 #define ibl_ETH_PORT_FROM_RBL   -1  /**< The ethernet port used is the same one used 
114                                          during the ROM boot load process. */
115                                          
116 /**
117  *  @def ibl_PORT_SWITCH_ALL
118  */
119 #define ibl_PORT_SWITCH_ALL     -2  /**< The ethernet subsystem is connected to a switch, and
120                                          all ports on the subsystem should be configured */
123 /**
124  * @defgroup iblBootFormats
125  *
126  * @ingroup iblBootFormats
127  * @{
128  */ 
129 #define ibl_BOOT_FORMAT_AUTO    0   /**< Auto determine the boot format from the data */
130 #define ibl_BOOT_FORMAT_NAME    1   /**< Determines the boot format based on file name (bootp/tftp only) */
131 #define ibl_BOOT_FORMAT_BIS     2   /**< Boot TI AIS format */
132 #define ibl_BOOT_FORMAT_COFF    3   /**< Boot a COFF file */
133 #define ibl_BOOT_FORMAT_ELF     4   /**< Boot an ELF file */
134 #define ibl_BOOT_FORMAT_BBLOB   5   /**< Boot a binary blob */
135 #define ibl_BOOT_FORMAT_BTBL    6   /**< Boot a TI boot table file */
137 /* @} */
138  
139 /**
140  * @defgroup iblPeriphPriority  Defines the boot sequence
141  *
142  * @ingroup iblPeriphPriority
143  * @{
144  *    @def  ibl_LOWEST_PRIORITY
145  */
146 #define ibl_LOWEST_PRIORITY     10  /**< The lowest priority assignable to a peripheral for boot */
148 /**
149  *    @def  ibl_HIGHEST_PRIORITY
150  */
151 #define ibl_HIGHEST_PRIORITY     1  /**< The highest priority assignable to a peripheral for boot */
153 /**
154  *    @def  ibl_DEVICE_NOBOOT
155  */
156 #define ibl_DEVICE_NOBOOT       20  /**< Indicates that the device is not to be used for boot */
158 /* @} */  
161 /**
162  *  @brief
163  *      Emif controller 3.1 configuration
164  *
165  *  @details
166  *      The paramters are directly placed into the emif controller
167  */
168 typedef struct iblEmif3p1_s
170     uint32 sdcfg;           /**< SD configuration register */
171     uint32 sdrfc;           /**< Refresh timing register   */
172     uint32 sdtim1;          /**< DDR timing register 1 */
173     uint32 sdtim2;          /**< DDR timing register 2 */
174     uint32 dmcctl;          /**< CAS match timing */
175     
176 } iblEmif3p1_t;
179 /**
180  *  @brief
181  *      Emif controller 4.0 configuration
182  *
183  *  @details
184  *      The parameters are placed directly into the emif controller
185  */
186 typedef struct iblEmif4p0_s
188     uint32  registerMask;               /**< Identifies which registers will be configured */
189     uint32  sdRamConfig;                /**< SDRAM Config Register */
190     uint32  sdRamConfig2;               /**< SDRAM Config2 Register */
191     uint32  sdRamRefreshCtl;            /**< SDRAM Refresh Control Register */
192     uint32  sdRamTiming1;               /**< SDRAM Timing 1 Register */
193     uint32  sdRamTiming2;               /**< SDRAM Timing 2 Register */
194     uint32  sdRamTiming3;               /**< SDRAM Timing 3 Register */
195     uint32  lpDdrNvmTiming;             /**< LPDDR2-NVM Timing Register */
196     uint32  powerManageCtl;             /**< Power Management Control Register */
197     uint32  iODFTTestLogic;             /**< IODFT Test Logic Global Control Register */
198     uint32  performCountCfg;            /**< Performance Counter Config Register */
199     uint32  performCountMstRegSel;      /**< Performance Counter Master Region Select Register */
200     uint32  readIdleCtl;                /**< Read Idle Control Register */
201     uint32  sysVbusmIntEnSet;           /**< VBUSM Interrupt Enable Set Register */
202     uint32  sdRamOutImpdedCalCfg;       /**< SDRAM Output Impedance Calibratin Config Register */
203     uint32  tempAlterCfg;               /**< Temperature Alert Config Register */
204     uint32  ddrPhyCtl1;                 /**< DDR PHY Control 1 Register */
205     uint32  ddrPhyCtl2;                 /**< DDR PHY Control 2 Register */
206     uint32  priClassSvceMap;            /**< DDR Priority to Class of Service Mapping Register */
207     uint32  mstId2ClsSvce1Map;          /**< Master ID to Class of Service 1 Mapping Register */
208     uint32  mstId2ClsSvce2Map;          /**< Master ID to Class of Service 2 Mapping Register */
209     uint32  eccCtl;                     /**< ECC Control Register */
210     uint32  eccRange1;                  /**< ECC Address Range 1 Register */
211     uint32  eccRange2;                  /**< ECC Address Range 2 Register */
212     uint32  rdWrtExcThresh;             /**< Read Write Execution Threshold Register */
213    
214 } iblEmif4p0_t;
217 /**
218  * @defgroup iblEmif4Select Defines the EMIF4 registers configured by IBL
219  *
220  * @ingroup iblEmif4Select
221  * @{
222  *    @def  ibl_EMIF4_ENABLE_sdRamConfig
223  */
224 #define ibl_EMIF4_ENABLE_sdRamConfig                 (1 <<  0)
226 /** @def ibl_EMIF4_ENABLE_sdRamConfig2 */
227 #define  ibl_EMIF4_ENABLE_sdRamConfig2                (1 <<  1)
229 /** @def ibl_EMIF4_ENABLE_sdRamRefreshCtl */
230 #define  ibl_EMIF4_ENABLE_sdRamRefreshCtl             (1 <<  2)
232 /** @def ibl_EMIF4_ENABLE_sdRamTiming1 */
233 #define  ibl_EMIF4_ENABLE_sdRamTiming1                (1 <<  3)
235 /** @def ibl_EMIF4_ENABLE_sdRamTiming2 */
236 #define  ibl_EMIF4_ENABLE_sdRamTiming2                (1 <<  4)
238 /** @def ibl_EMIF4_ENABLE_sdRamTiming3 */
239 #define  ibl_EMIF4_ENABLE_sdRamTiming3                (1 <<  5)
241 /** @def ibl_EMIF4_ENABLE_lpDdrNvmTiming */
242 #define  ibl_EMIF4_ENABLE_lpDdrNvmTiming              (1 <<  6)
244 /** @def ibl_EMIF4_ENABLE_powerManageCtl */
245 #define  ibl_EMIF4_ENABLE_powerManageCtl              (1 <<  7)
247 /** @def ibl_EMIF4_ENABLE_iODFTTestLogic */
248 #define  ibl_EMIF4_ENABLE_iODFTTestLogic              (1 <<  8)
250 /** @def ibl_EMIF4_ENABLE_performCountCfg */
251 #define  ibl_EMIF4_ENABLE_performCountCfg             (1 <<  9)
253 /** @def ibl_EMIF4_ENABLE_performCountMstRegSel */
254 #define  ibl_EMIF4_ENABLE_performCountMstRegSel       (1 << 10)
256 /** @def ibl_EMIF4_ENABLE_readIdleCtl */
257 #define  ibl_EMIF4_ENABLE_readIdleCtl                 (1 << 11)
259 /** @def ibl_EMIF4_ENABLE_sysVbusmIntEnSet */
260 #define  ibl_EMIF4_ENABLE_sysVbusmIntEnSet            (1 << 12)
262 /** @def ibl_EMIF4_ENABLE_sdRamOutImpdedCalCfg */
263 #define  ibl_EMIF4_ENABLE_sdRamOutImpdedCalCfg        (1 << 13)
265 /** @def ibl_EMIF4_ENABLE_tempAlterCfg */
266 #define  ibl_EMIF4_ENABLE_tempAlterCfg                (1 << 14)
268 /** @def ibl_EMIF4_ENABLE_ddrPhyCtl1 */
269 #define  ibl_EMIF4_ENABLE_ddrPhyCtl1                  (1 << 15)
271 /** @def ibl_EMIF4_ENABLE_ddrPhyCtl2 */
272 #define  ibl_EMIF4_ENABLE_ddrPhyCtl2                  (1 << 16)
274 /** @def ibl_EMIF4_ENABLE_priClassSvceMap */
275 #define  ibl_EMIF4_ENABLE_priClassSvceMap             (1 << 17)
277 /** @def ibl_EMIF4_ENABLE_mstId2ClsSvce1Map */
278 #define  ibl_EMIF4_ENABLE_mstId2ClsSvce1Map           (1 << 18)
280 /** @def ibl_EMIF4_ENABLE_mstId2ClsSvce2Map */
281 #define  ibl_EMIF4_ENABLE_mstId2ClsSvce2Map           (1 << 11)
283 /** @def ibl_EMIF4_ENABLE_eccCtl */
284 #define  ibl_EMIF4_ENABLE_eccCtl                      (1 << 19)
286 /** @def ibl_EMIF4_ENABLE_eccRange1 */
287 #define  ibl_EMIF4_ENABLE_eccRange1                   (1 << 20)
289 /** @def ibl_EMIF4_ENABLE_eccRange2 */
290 #define  ibl_EMIF4_ENABLE_eccRange2                   (1 << 21)
292 /** @def ibl_EMIF4_ENABLE_rdWrtExcThresh */
293 #define  ibl_EMIF4_ENABLE_rdWrtExcThresh              (1 << 22)
295 /** @def BOOT_EMIF4_ENABLE_ALL */
296 #define  BOOT_EMIF4_ENABLE_ALL                         0x007fffff
297     
298 /* @} */  
299     
300     
301 /**
302  * @defgroup iblEmifType Defines the EMIF4 type on a device
303  *
304  * @ingroup iblEmifType
305  * @{
306  */
307 /** @def ibl_EMIF_TYPE_31 */
308 #define  ibl_EMIF_TYPE_31           31
310 /** @def ibl_EMIF_TYPE_40 */
311 #define  ibl_EMIF_TYPE_40           40
313 /* @} */
315 /**
316  * @brief
317  *    This structure is used to configure the DDR interface
318  *
319  * @details
320  *    The DDR configuration parameters are setup
321  *
322  */
323 typedef struct idblDdr_s
325     bool configDdr;                  /**<  Set to non-zero to enable EMIF configuration */
326     
327     union  {
328     
329         iblEmif3p1_t  emif3p1;       /**<  Configuration of devices with emif controller version 3.1 */
330         iblEmif4p0_t  emif4p0;       /**<  Configuration of devices with emif controller version 4.0 */
331     } uEmif;
333 } iblDdr_t;
335 /**
336  *  @brief
337  *      This structure is used to identify binary blob load parameters.
338  *
339  *  @details
340  *      Since binary blob is formatless the start address, size and branch to address
341  *      can be specified. In the case of network boot, boot will terminate when no
342  *      more data is received (or timed out), even if the size is not reached.
343  */
344 typedef struct iblBinBlob_s
346     uint32   startAddress;          /**< Where the loaded data is placed */
347     uint32   sizeBytes;             /**< How much data to load */
348     uint32   branchAddress;         /**< Where to branch to when the load is complete */
350 } iblBinBlob_t;
352 /**
353  * @brief
354  *   This structure is used to control the operation of the ibl ethernet boot.
355  *
356  * @details
357  *   The ethernet port and bootp request are controlled through this structure.
358  */
359 typedef struct iblEth_s
361     uint32   ethPriority;       /**< The ethernet boot priority. @ref iblPeriphPriority */
362     int32    port;              /**< The ethernet port to use, or @ref ibl_ETH_PORT_FROM_RBL */
363     bool     doBootp;           /**< If true a bootp request is generated. If false the @ref iblEthBootInfo_t
364                                      table must be populated before the ibl begins execution */
365     bool     useBootpServerIp;  /**< If TRUE then the server IP received from the bootp server
366                                      is used, if FALSE the one in the ethInfo field is used */
367     bool     useBootpFileName;  /**< If TRUE then the file name received from the bootp server
368                                      is used, if FALSE the one in the ethInfo field is used */
369     int32    bootFormat;        /**< The format of the boot data file. @ref iblBootFormats */                            
370     
371     iblBinBlob_t blob;          /**< Used only if the format is ibl_BOOT_FORMAT_BBLOB */
372     
373     iblEthBootInfo_t  ethInfo;  /**< Low level ethernet information */
374     
375 } iblEth_t;
378 /**
379  *  @brief
380  *      This structure is used to control the operation of the ibl sgmii ports
381  *
382  *  @details
383  *      The physical register configuration is provided
384  */
385 typedef struct iblSgmii_s
387     uint32  adviseAbility;      /**< The advise ability register */
388     uint32  control;            /**< The control register        */
389     uint32  txConfig;           /**< Serdes Tx config            */
390     uint32  rxConfig;           /**< Serdes Rx config            */
391     uint32  auxConfig;          /**< Serdes Aux config           */
392   
393 } iblSgmii_t;
396 /**
397  *  @def ibl_N_ETH_PORTS
398  */
399 #define ibl_N_ETH_PORTS     2  /**< The number of ethernet port configurations available */
401 /**
402  *  @def ibl_N_MDIO_CFGS
403  */
404 #define ibl_N_MDIO_CFGS     16  /**< The maximum number of mdio configurations */
405  
407 /**
408  * @brief
409  *      This structure is used to configure phys through the mdio interface
410  *
411  * @details
412  *      Defines optional configuration through MDIO.
413  *
414  *      The mdio transaction values are mapped as follows:
415  *
416  *      /-------------------------------------------------------------\
417  *      |  31  |  30   | 29  26 | 25      21 | 20      16 | 15       0|
418  *      | rsvd | write |  rsvd  |  register  |  phy addr  |     data  |
419  *      \-------------------------------------------------------------/
420  */
421 typedef struct iblMdio_s
423     int16  nMdioOps;         /**< The number of mdio writes to perform  */
424     uint16 mdioClkDiv;       /**< The divide down of the mac clock which drives the mdio */
425     
426     uint32 interDelay;       /**< The number of cpu cycles to wait between mdio writes */
427     
428     uint32 mdio[ibl_N_MDIO_CFGS];   /* The MDIO transactions */
430 } iblMdio_t;
433 /** 
434  *  @brief
435  *      This structure defines the physical parameters of the NAND device
436  */
437 typedef struct nandDevInfo_s
439     uint32  busWidthBits;       /**< 8 or 16 bit bus width */
440     uint32  pageSizeBytes;      /**< The size of each page */
441     uint32  pageEccBytes;       /**< Number of ecc bytes in each page */
442     uint32  pagesPerBlock;      /**< The number of pages in each block */
443     uint32  totalBlocks;        /**< The total number of blocks in a device */
444     
445     uint32  addressBytes;       /**< Number of bytes in the address */
446     bool    lsbFirst;           /**< Set to true if the LSB is output first, otherwise msb is first */
447     uint32  blockOffset;        /**< Address bits which specify the block number */
448     uint32  pageOffset;         /**< Address bits which specify the page number */
449     uint32  columnOffset;       /**< Address bits which specify the column number */
450     
451     uint8   resetCommand;       /**< The command to reset the flash */
452     uint8   readCommandPre;     /**< The read command sent before the address */
453     uint8   readCommandPost;    /**< The read command sent after the address */
454     bool    postCommand;        /**< If TRUE the post command is sent */
455     
456 } nandDevInfo_t;
457     
458     
459 /**
460  *  @brief
461  *      This structure is used to control the operation of the NAND boot
462  *
463  */
464 typedef struct iblNand_s
467     uint32   nandPriority;      /**< The nand boot priority. @ref iblPeriphPriority */
468     int32    bootFormat;        /**< The format of the boot data file. @ref iblBootFormats */                            
469     int32    interface;         /**< The nand interface @ref iblNandIf */
470     iblBinBlob_t blob;          /**< Used only if the format is ibl_BOOT_FORMAT_BBLOB */
471     
472     
473     nandDevInfo_t nandInfo;     /** Low level device info */
475 } iblNand_t;
477 /**
478  * @defgroup iblNandIf defines the interface used for NAND memory. Not all values
479  *           are valid for all devices.
480  *
481  * @ingroup iblNandIf
482  * @{
483  */
484 /** @def ibl_NAND_IF_GPIO - GPIO interface */
485 #define  ibl_NAND_IF_GPIO           0
487 /** @def ibl_NAND_IF_CHIPSEL_2 - EMIF interface using chip select 2 */
488 #define  ibl_NAND_IF_CHIPSEL_2      2
490 /** @def ibl_NAND_IF_CHIPSEL_3 - EMIF interface using chip select 3 */
491 #define ibl_NAND_IF_CHIPSEL_3       3
493 /** @def ibl_NAND_IF_CHIPSEL_4 - EMIF interface using chip select 4 */
494 #define ibl_NAND_IF_CHIPSEL_4       4
496 /** @def ibl_NAND_IF_CHIPSEL_5 - EMIF interface using chip select 5 */
497 #define ibl_NAND_IF_CHIPSEL_5       5
499 /** @def ibl_NAND_IF_SPI - NAND interface through SPI */
500 #define  ibl_NAND_IF_SPI            100
503 /* @} */
506 /**
507  *  @brief
508  *      SPI configuration used for either NOR or NAND
509  */
510 typedef struct iblSpi_s
512     int16  addrWidth;       /**<  16 or 24 are the only valid values */
513     int16  nPins;           /**<  4 or 5 are the only valid values */
514     int16  mode;            /**<  Clock / data polarities (valid values 0-3) */
515     int16  csel;            /**<  Chip select value (5 pin). Only 0b10 and 0b01 are valid */
516     uint16 c2tdelay;        /**<  Setup time between chip select and the transaction */
517     uint16 busFreqMHz;      /**<  Bus speed */
518     
519 } iblSpi_t;
520     
521     
522     
523 /**
524  *  @brief
525  *      This structure is used to control the programming of the device PLL
526  *
527  *  @details
528  *      The system PLLs are optionally configured
529  */
530 typedef struct iblPll_s  {
532     bool    doEnable;       /**< If true the PLL is configured */
533     
534     Uint32  prediv;         /**< The pll pre-divisor */
535     Uint32  mult;           /**< The pll multiplier */
536     Uint32  postdiv;        /**< The pll post divider */
537     
538     Uint32  pllOutFreqMhz;  /**<  The resulting output frequency, required for timer setup */ 
539     
540 } iblPll_t;
543 /** 
544  *  @defgroup iblPllNum
545  * 
546  *  @ingroup iblPllNum
547  *  @{
548  * 
549  *  @def ibl_MAIN_PLL
550  */
551 #define ibl_MAIN_PLL    0  /**< The main cpu pll */
553 /**
554  * @def ibl_DDR_PLL
555  */
556 #define ibl_DDR_PLL     1  /**< The ddr pll */
558 /**
559  * @def ibl_NET_PLL
560  */
561 #define ibl_NET_PLL     2  /**< The network pll */
563 /**
564  * @def the number of PLL configuration entries in the table
565  */
566 #define ibl_N_PLL_CFGS  (ibl_NET_PLL + 1)
568 /* @} */
569     
573 /**
574  * @def ibl_MAGIC_VALUE
575  */
576 #define ibl_MAGIC_VALUE  0xCEC11EBB  /**< Indicates that the configuration table is valid */
577     
578 /**
579  *  @brief
580  *    The main configuration/control structure for the ibl
581  *
582  *  @details
583  *    The operation of the ibl is configured/controlled based on the values in this structure. 
584  *    This structure resides at a fixed location in the memory map. It can be changed during
585  *    the boot operation itself by loading new values into it, but these changes must occur
586  *    as part of the boot process itself (not through an asynchronous write through a master
587  *    peripheral).
588  *
589  *    Each boot mode is assigned a priority, with lower values indicating a higher 
590  *    priority. The lowest valid priority is @ref ibl_LOWEST_BOOT_PRIORITY, and the value
591  *    @ref ibl_DEVICE_NOBOOT indicates no boot will be attempted on that peripheral. 
592  */
593 typedef struct ibl_s
595     uint32   iblMagic;                       /**< @ref ibl_MAGIC_VALUE */
596     
597     iblPll_t  pllConfig[ibl_N_PLL_CFGS];     /**< PLL Configuration. @ref iblPll_t */
598     
599     iblDdr_t  ddrConfig;                     /**< DDR configuration @ref iblDdr_t  */
600     
601     iblEth_t  ethConfig[ibl_N_ETH_PORTS];    /**< Ethernet boot configuration. @ref iblEth_t */
602     
603     iblSgmii_t sgmiiConfig[ibl_N_ETH_PORTS]; /**< SGMII boot configuration. @ref iblSgmii_t */
604     
605     iblMdio_t mdioConfig;                    /**< MDIO configuration. @ref iblMdio_t */
606     
607     iblNand_t nandConfig;                    /**< NAND configuration @ref iblNand_t */
608     
609     iblSpi_t  spiConfig;                     /**< SPI configuration @ref iblSpi_s */
610     
611     uint16    chkSum;                        /**< Ones complement checksum over the whole config structure */
612     
613     
614      
615 } ibl_t;
618 extern ibl_t ibl;
622 /**
623  * @defgroup iblActivePeriph
624  *
625  * @ingroup iblActivePeriph
626  * @{
627  *    @def  ibl_ACTIVE_PERIPH_ETH
628  */
629 #define ibl_ACTIVE_PERIPH_ETH     100     /**< An ethernet boot in progress */
631 /**
632  *  @def ibl_ACTIVE_PERIPH_NAND
633  */
634 #define ibl_ACTIVE_PERIPH_NAND    101     /**< A nand boot in progress */
636 /**
637  *  @def ibl_ACTIVE_PERIPH_I2C
638  */
639 #define ibl_ACTIVE_PERIPH_I2C     102     /**< An i2c boot in progress */
641 /**
642  *  @def ibl_ACTIVE_PERIPH_SPI
643  */
644 #define ibl_ACTIVE_PERIPH_SPI     103     /**< An SPI boot in progress */
646 /* @} */
649 /**
650  *  @defgroup iblFailCode
651  *
652  * @ingroup iblFailCode
653  * @{
654  *      @def ibl_FAIL_CODE_INVALID_I2C_ADDRESS
655  */
656 #define ibl_FAIL_CODE_INVALID_I2C_ADDRESS  700      /**< Invalid i2c eeprom address encountered */
657  
658 /**
659  *  @def ibl_FAIL_CODE_BTBL_FAIL
660  */
661 #define ibl_FAIL_CODE_BTBL_FAIL             701     /**< Boot table processing function error */
663 /**
664  *  @def ibl_FAIL_CODE_PA
665  */
666 #define ibl_FAIL_CODE_PA                    702     /**< Packet Accelerator setup failed */
667    
668    
669 /**
670  *  @def ibl_FAIL_CODE_SPI_PARAMS
671  */
672 #define ibl_FAIL_CODE_SPI_PARAMS            703     /**< Invalid SPI configuration found */
674  
675  /* @} */
678 /**
679  * @brief
680  *   Provide status on the boot operation
681  *
682  * @details
683  *  Run time status of the IBL is provided to aid in debugging
684  *
685  */
686 typedef struct iblStatus_s
688     uint32 iblMagic;        /**<  The @ref ibl_MAGIC_VALUE is placed here to indicate the boot has begun */
689     
690     uint32 iblVersion;      /**<  The version number. MSB = major, SMSB = minor, SLSB = minor minor LSB= tiny */
691     
692     uint32 iblFail;         /**<  If non-zero the IBL has encountered a fatal error */
693     
694     uint32 i2cRetries;      /**<  Count of I2C read retries */
695     uint32 magicRetries;    /**<  Count of I2C re-reads because the magic number was incorrect */ 
696     uint32 mapSizeFail;     /**<  Number of times an invalid map table size was read from the i2c */
697     uint32 mapRetries;      /**<  Number of times the checksum failed on the read of the i2c map */
698     uint32 i2cDataRetries;  /**<  Number of retries while reading block data from the i2c */
699     
700     int32  heartBeat;       /**<  An increasing value as long as the boot code is running */
701     
702     int32  activePeriph;    /**<  Describes the active boot peripheral @ref iblActivePeriph */
703     int32  activeFormat;    /**<  Describes the format being decoded */
704     
705     uint32  autoDetectFailCnt;      /**<  Counts the number of times an auto detect of the data format failed */
706     uint32  nameDetectFailCnt;      /**<  Counts the number of times an name detect of the data format failed */
707     
708     uint32 invalidDataFormatSpec;   /**<  Counts the number of times the main boot found an invalid boot format request */
709     
710     uint32 exitAddress;             /**<  If non-zero the IBL exited and branched to this address */
711     
712     iblEthBootInfo_t ethParams;     /**<  Last ethernet boot attemp parameters */
713     
714 } iblStatus_t;                               
715                                
716 extern iblStatus_t iblStatus;                               
719 /** 
720  *  @brief
721  *      The i2c map structure
722  *
723  *  @details 
724  *      The i2c eeprom contains a structure which identifies the location of the big and little
725  *      endian ibl images on the eeprom.
726  */
727 typedef struct iblI2cMap_s 
729     uint16  length;         /**<  Size of the structure in bytes */
730     uint16  chkSum;         /**<  Value which makes the ones complement checksum over the block equal to 0 or -0 */
731     
732     uint32  addrLe;         /**<  Base address of the boot tables for the little endian image */
733     uint32  configLe;       /**<  Base address of the ibl structure for use with the little endian image */
734     
735     uint32  addrBe;         /**<  Base address of the boot tables for the big endian image */
736     uint32  configBe;       /**<  Base address of the ibl structure for use with the big endian image */
738 } iblI2cMap_t;
747 #endif /* IBL_H */