MCSDK 3.0: add support for Keystone II devices
[keystone-rtos/ibl.git] / src / device / c665x / target.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: Target specific definitions
40  **************************************************************************
41  * FILE NAME: target.h
42  *
43  * DESCRIPTION: This file defines target specific values used by low level
44  *                              drivers.
45  *
46  * @file target.h
47  *
48  * @brief
49  *  Low level target specific values are defined
50  *
51  ***************************************************************************/
53 #include "types.h"
56 /**
57  *  @brief
58  *   Device EMAC definitions
59  */
60 #define TARGET_DEVICE_CPMAC
62 #define TARGET_EMAC_N_PORTS            1
64 #define TARGET_EMAC_BASE_ADDRESSES     { 0x02c08000u }
65 #define TARGET_EMAC_DSC_BASE_ADDR      { 0x02c0a000u }
67 #define TARGET_SGMII_BASE_ADDRESSES    { 0x02c08900u }
69 /* SGMII offsets (at least the serdes configs, vary between devices, so
70  * they are defined here. */
71 #define TARGET_SGMII_IDVER             0x000
72 #define TARGET_SGMII_STATUS            0x014
73 #define TARGET_SGMII_MR_LP_ADV_ABILITY 0x020
74 #define TARGET_SGMII_TX_CFG            0x030
75 #define TARGET_SGMII_RX_CFG            0x034
76 #define TARGET_SGMII_AUX_CFG           0x038
78 /* Leave mdio disabled */
79 #define dev_mdio_open()     1
81 /* No chip level reset required for ethernet, the function call is made a void statment */
82 #define deviceSetEthResetState(x,y)
84 /* The mac control register values */
85 #define TARGET_MAC_CONTROL    ( 1 << 18)            /* EXT_EN              */     \
86                             | ( 0 << 9 )            /* Round robin         */     \
87                             | ( 1 << 7 )            /* GIG                 */     \
88                             | ( 0 << 6 )            /* TX pacing disabled  */     \
89                             | ( 1 << 5 )            /* GMII RX & TX        */     \
90                             | ( 0 << 4 )            /* TX flow disabled    */     \
91                             | ( 0 << 3 )            /* RX flow disabled    */     \
92                             | ( 0 << 1 )            /* Loopback enabled    */     \
93                             | ( 1 << 0 )            /* full duplex         */
96 /**
97  *  @brief
98  *    Device Timer definitions
99  */
100 #define TIMER0_BASE             0x02200000u
102 #define TIMER_INPUT_DIVIDER     6           /* Timer driven from cpu clock / 6 */
105 /**
106  *  @def MAIN_PLL
107  */
108 #define MAIN_PLL        0   /**< The index to the main PLL */
110 /**
111  * @def NET_PLL
112  */
114 /**
115  *  @def DDR_PLL
116  */
117 #define DDR_PLL         1   /**< The index to the DDR PLL */
120 /**
121  *  @brief
122  *    Device PLL definitions
123  */
124 #define DEVICE_PLL_BASE(x)      ((x) == MAIN_PLL ? 0x2310000 : 0x2620330)
125 #define DEVICE_MAIN_PLL_CTL_0       0x2620328
126 #define DEVICE_MAIN_PLL_CTL_1       0x262032c
129 /**
130  *  @brief
131  *   The c66x devices use a register external to the PLL controller for prediv configuration
132  */
133 #define chipPllExternalPrediv(x)    TRUE
135 /**
136  * @brief
137  *  Device PSC definitions
138  */
139 #define DEVICE_PSC_BASE     0x02350000u
141 /**
142  *  @brief
143  *    The SPI module base and module divider
144  */
145 #define DEVICE_SPI_BASE(x)          0x20bf0000u
146 #define DEVICE_SPI_MOD_DIVIDER      6
147 #define DEVICE_SPI_MAX_DIVIDER      0xff
150 /**
151  * @brief
152  *  The PSC number for the EMAC */
153 #define TARGET_PWR_ETH(x)   3
155 /**
156  * @brief
157  *   The PSC numbers for EMIF16 and SPI vary between devices. The devices are run time
158  *   identified by reading the JTAG ID register,
159  *   NOTE: Have the variant bits as zero while defining the JTAG ID
160  */
161 #define DEVICE_C6657_JTAG_ID_VAL   0xb97a02f    /* C6657 */
162 #define DEVICE_C6678_JTAG_ID_VAL   0x9e02f      /* C6678 */
163 #define DEVICE_C6670_JTAG_ID_VAL   0xb94102f    /* C6670 */
164 #define DEVICE_TCI6636K2H_JTAG_ID_VAL   0xb58102f    /* TCI6636K2H */
166 #define DEVICE_JTAG_ID_REG          0x2620018
167 #define DEVICE_JTAG_ID_MASK         0x0fffffff /* exclude variant bits(31:28) */
170 /**
171  *  @brief
172  *    The PSC number for NAND depends on the device
173  */
174 #define TARGET_PWR_EMIF         deviceEmifPscNum()
175 #define TARGET_PWR_EMIF_C6657   -1
176 #define NAND_TYPE_LARGE
177 /*
178  *  @brief
179  *     The PSC number for SPI depends on the device
180  */
181 #define TARGET_PWR_SPI      -1
183 /**
184  *  @brief
185  *      The PSC number for GPIO. GPIO is in the always on domain
186  */
187 #define TARGET_PWR_GPIO     -1
189 /**
190  *  @brief
191  *      The LPSC number for PCIe. PCIe is 10 for C6657
192  */
193 #define TARGET_PWR_PCIE    10
195 /**
196  * @brief
197  *  Flag to indicate timer 0 power up requested. The time is always on in the 6472
198  */
199 #define TARGET_PWR_TIMER_0  23
201 /**
202  *  @brief
203  *    Device DDR controller definitions
204  */
205 #define DEVICE_EMIF4_BASE  0x21000000
206 #define targetEmifType()   ibl_EMIF_TYPE_40
208 /**
209  *  @brief
210  *     Device EMIF 2.5 controller definitions
211  */
212 #define DEVICE_EMIF25_BASE  0x20c00000
214 /**
215  *  @brief
216  *      NAND memory regions
217  */
218 #define TARGET_MEM_NAND_CS_2    0x70000000
219 #define TARGET_MEM_NAND_CS_3    0x74000000
220 #define TARGET_MEM_NAND_CS_4    0x78000000
221 #define TARGET_MEM_NAND_CS_5    0x7c000000
222 uint32 deviceNandMemBase (int32 cs);
223 #define TARGET_SHFL(x)  _shfl(x)  /* The shuffle intrinsic */
226 /**
227  * @brief
228  *  The highest module number. The value for nyquist is used
229  */
230 #define TARGET_PWR_MAX_MOD  30
233 /**
234  * @brief
235  *   The base address of MDIO
236  */
237 #define TARGET_MDIO_BASE    0x2C080800
239 /**
240  * @brief
241  *   The number of external ethernet ports
242  */
243 #define TARGET_EMAC_N_PORTS     1
245 /**
246  *  @brief
247  *    GPIO address
248  */
249 #define GPIO_GPIOPID_REG        0x02320000
250 #define GPIO_GPIOEMU_REG        0x02320004
251 #define GPIO_BINTEN_REG         0x02320008
252 #define GPIO_DIR_REG            0x02320010
253 #define GPIO_OUT_DATA_REG       0x02320014
254 #define GPIO_SET_DATA_REG       0x02320018
255 #define GPIO_CLEAR_DATA_REG     0x0232001C
256 #define GPIO_IN_DATA_REG        0x02320020
257 #define GPIO_SET_RIS_TRIG_REG   0x02320024
258 #define GPIO_CLR_RIS_TRIG_REG   0x02320028
259 #define GPIO_SET_FAL_TRIG_REG   0x0232002C
260 #define GPIO_CLR_FAL_TRIG_REG   0x02320030
261 #define PIN_CONTROL_0           0x02620580
262 #define PIN_CONTROL_1           0x02620584
263 /**
264  *  @brief
265  *      The base address of the I2C peripheral, and the module divisor of the cpu clock
266  */
267 #define DEVICE_I2C_BASE                 0x02530000
268 #define DEVICE_I2C_MODULE_DIVISOR       6
270 /**
271  * @brief
272  *      The address of the DEVSTAT register
273  */
274 #define DEVICE_REG_DEVSTAT              0x02620020
276 /**
277  * @brief
278  *     Prototypes for the PLL functions handled outside the main PLL registers
279  */
280 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal);
281 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult);
282 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult);
283 void configureSPIpins(void);
285 #define TARGET_SGMII_EXTERNAL_SERDES
286 #define TARGET_SGMII_TYPE_2             /* Use second sgmii setup sequence */
287 #define TARGET_SGMII_SERDES_BASE        0x2620340
288 #define TARGET_SGMII_SERDES_STATUS_BASE 0x2620158
289 #define TARGET_SGMII_SOFT_RESET         0x04
290 #define TARGET_SGMII_CONTROL            0x10
291 #define TARGET_SGMII_MR_ADV_ABILITY     0x18
292 void targetSgmiiSerdesConfig (int32 port, void *cfg);
293 #define chipKickOpenSerdes(x)           *((uint32 *)0x2620038) = 0x83e70b13; *((uint32 *)0x262003c) = 0x95a4f1e0
294 #define chipKickClosedSerdes(x)         ;       /* never lock the registers */
297 #define TARGET_SERDES_LOCK_DELAY        (1600*1000)
299 #define ECC_BLOCK_SIZE                  256
301 /* NAND address pack macro */
302 #define PACK_ADDR(col, page, block) \
303         ((col & 0x000000ff) | ((page & 0x0000001f) << 9) | ((block & 0x00000fff) << 14))
305 /**
306  *  @brief
307  *      Register access macros
308  */
309 #define DEVICE_REG32_W(x,y)   *(volatile unsigned int *)(x)=(y)
310 #define DEVICE_REG32_R(x)    (*(volatile unsigned int *)(x))
312 #define BOOTBITMASK(x,y)      (   (   (  ((UINT32)1 << (((UINT32)x)-((UINT32)y)+(UINT32)1) ) - (UINT32)1 )   )   <<  ((UINT32)y)   )
313 #define BOOT_READ_BITFIELD(z,x,y)   (((UINT32)z) & BOOTBITMASK(x,y)) >> (y)
314 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
316 /**
317  *  @brief
318  *      Mpax configuration registers
319  */
320 #define DEVICE_REG_XMPAX_L(x) *((volatile unsigned int *)(0x08000000 + (8*(x))))
321 #define DEVICE_REG_XMPAX_H(x) *((volatile unsigned int *)(0x08000004 + (8*(x))))
324 /**
325  *  @brief
326  *      ROM boot loader boot modes and table locations
327  */
328 #define BOOT_MODE_I2C               40
329 #define BOOT_MODE_SPI               50
331 #define ROM_BOOT_PARAMS_ADDR_C6678   0x873680
332 #define ROM_BOOT_PARAMS_ADDR_C6657   0x8fff00
333 #define ROM_BOOT_PARAMS_ADDR_C6670   0x8f3680
335 /**
336  *  @brief
337  *      No device specific configuration required for NOR boot, so
338  *      the function call is defined to return success.
339  */
340 #define deviceConfigureForNor()    0
343 /****************************************************************
344  *
345  * NOTE: Following build flags enable DEVICE specific workarounds
346  * and have code which is specific to C6657 LC EVMs
347  *
348  ****************************************************************/
350 /**
351  *  @brief
352  *      Support for PLL workaround to re-enter ROM boot loader.
353  */
354 #define IBL_ENTER_ROM              1
356 /**
357  *  @brief
358  *      Support for enabling EDC for internal memory.
359  */
360 #define IBL_ENABLE_EDC             1
362 /**
363  *  @brief
364  *      Support for enabling PCIe workarond for C6678/C6670.
365  */
366 #define IBL_ENABLE_PCIE_WORKAROUND 1
368 /**
369  *  @brief
370  *     DDR start and end address needed for DDR memory test
371  */
372 #define DDR3_TEST_START_ADDRESS 0x80000000
373 #define DDR3_TEST_END_ADDRESS   (DDR3_TEST_START_ADDRESS + (128 *1024))
375 UINT32 ddr3_memory_test();
376 void configureGPIO(void);