Merge pull request #3 in PROCESSOR-SDK/ibl from PRSDK-5675 to master
[keystone-rtos/ibl.git] / src / device / c66xk2x / 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  ***************************************************************************/
52 #ifndef _TARGET_H
53 #define _TARGET_H
54 #include "types.h"
57 /**
58  *  @brief
59  *   Device EMAC definitions
60  */
63 /**
64  *  @brief
65  *    Device Timer definitions
66  */
67 #define TIMER0_BASE             0x02200000u
69 #define TIMER_INPUT_DIVIDER     6           /* Timer driven from cpu clock / 6 */
72 /**
73  *  @def MAIN_PLL
74  */
75 #define MAIN_PLL        0   /**< The index to the main PLL */
77 /**
78  * @def NET_PLL
79  */
80 #define NET_PLL         1   /**< The index to the network PLL */
82 /**
83  *  @def DDR_PLL
84  */
85 #define DDR_PLL         2   /**< The index to the DDR PLL */
88 /**
89  *  @brief
90  *    Device PLL definitions
91  */
92 #define DEVICE_PLL_BASE(x)      ((x) == MAIN_PLL ? 0x2310000 : ((x) == NET_PLL ? 0x2620358 : 0x2620360))
93 #define DEVICE_MAIN_PLL_CTL_0       0x2620350
94 #define DEVICE_MAIN_PLL_CTL_1       0x2620354
97 /**
98  *  @brief
99  *   The c66x devices use a register external to the PLL controller for prediv configuration
100  */
101 #define chipPllExternalPrediv(x)    TRUE
103 /**
104  * @brief
105  *  Device PSC definitions
106  */
107 #define DEVICE_PSC_BASE     0x2350000u
109 /**
110  *  @brief
111  *    The SPI module base and module divider
112  */
113 #define DEVICE_SPI_BASE(x)          0x21000400u
114 #define DEVICE_SPI_MOD_DIVIDER      6
115 #define DEVICE_SPI_MAX_DIVIDER      0xff
117 /**
118  * @brief
119  *  The PSC number for the PA sub-system */
120 #define TARGET_PWR_PA       7
122 /**
123  * @brief
124  *  The PSC number for the SGMII */
125 #define TARGET_PWR_ETH(x)   8
127 /**
128  * @brief
129  *   The PSC numbers for EMIF16 and SPI vary between devices. The devices are run time
130  *   identified by reading the JTAG ID register,
131  *   NOTE: Have the variant bits as zero while defining the JTAG ID
132  */
133 #define DEVICE_C6657_JTAG_ID_VAL   0xb97a02f    /* C6657 */
134 #define DEVICE_C6678_JTAG_ID_VAL   0x9e02f      /* C6678 */
135 #define DEVICE_C6670_JTAG_ID_VAL   0xb94102f    /* C6670 */
136 #define DEVICE_TCI6636K2H_JTAG_ID_VAL   0xb58102f    /* TCI6636K2H */
138 #define DEVICE_JTAG_ID_REG          0x2620018
139 #define DEVICE_JTAG_ID_MASK         0x0fffffff /* exclude variant bits(31:28) */
142 /**
143  *  @brief
144  *    The PSC number for NAND depends on the device
145  */
146 #define TARGET_PWR_EMIF         deviceEmifPscNum()
147 #define TARGET_PWR_EMIF_TCI6634K2K   3
149 /*
150  *  @brief
151  *     The PSC number for SPI depends on the device
152  */
153 #define TARGET_PWR_SPI      deviceSpiPscNum()
154 #define TARGET_SPI_EMIF_TCI6634K2K   3
156 /**
157  *  @brief
158  *      The PSC number for GPIO. GPIO is in the always on domain
159  */
160 #define TARGET_PWR_GPIO     -1
162 /**
163  *  @brief
164  *      The LPSC number for PCIe. PCIe is 10 for C6678/C6770
165  */
166 #define TARGET_PWR_PCIE    10
168 /**
169  * @brief
170  *  Flag to indicate timer 0 power up requested. The time is always on in the 6472
171  */
172 #define TARGET_PWR_TIMER_0  -1
174 /**
175  *  @brief
176  *    Device DDR controller definitions
177  */
178 #define DEVICE_EMIF4_BASE  0x21000000
179 /* TBD: #define DEVICE_EMIF4_BASE(x)  (0x21010000 + (0x10000 * (x))) */
180 #define targetEmifType()   ibl_EMIF_TYPE_40
182 /**
183  *  @brief
184  *     Device EMIF 2.5 controller definitions
185  */
186 #define DEVICE_EMIF25_BASE  0x21000A00
188 /**
189  *  @brief
190  *      NAND memory regions
191  */
192 #define TARGET_MEM_NAND_CS_2    0x30000000
193 #define TARGET_MEM_NAND_CS_3    0x34000000
194 #define TARGET_MEM_NAND_CS_4    0x38000000
195 #define TARGET_MEM_NAND_CS_5    0x3c000000
196 uint32 deviceNandMemBase (int32 cs);
197 #define TARGET_SHFL(x)  _shfl(x)  /* The shuffle intrinsic */
200 /**
201  * @brief
202  *  The highest module number. The value for nyquist is used
203  */
204 #define TARGET_PWR_MAX_MOD  52
207 /**
208  * @brief
209  *   The base address of MDIO
210  */
211 #define TARGET_MDIO_BASE    0x2090300
213 /**
214  * @brief
215  *   The number of external ethernet ports
216  */
217 #define TARGET_EMAC_N_PORTS     2
219 /**
220  *  @brief
221  *    GPIO address
222  */
223 #define GPIO_CFG_BASE           0x260BF00
224 #define GPIO_GPIOPID_REG        (GPIO_CFG_BASE + 0x0)
225 #define GPIO_GPIOEMU_REG        (GPIO_CFG_BASE + 0x4)
226 #define GPIO_BINTEN_REG         (GPIO_CFG_BASE + 0x8)
227 #define GPIO_DIR_REG            (GPIO_CFG_BASE + 0x10)
228 #define GPIO_OUT_DATA_REG       (GPIO_CFG_BASE + 0x14)
229 #define GPIO_SET_DATA_REG       (GPIO_CFG_BASE + 0x18)
230 #define GPIO_CLEAR_DATA_REG     (GPIO_CFG_BASE + 0x1c)
231 #define GPIO_IN_DATA_REG        (GPIO_CFG_BASE + 0x20)
232 #define GPIO_SET_RIS_TRIG_REG   (GPIO_CFG_BASE + 0x24)
233 #define GPIO_CLR_RIS_TRIG_REG   (GPIO_CFG_BASE + 0x28)
234 #define GPIO_SET_FAL_TRIG_REG   (GPIO_CFG_BASE + 0x2c)
235 #define GPIO_CLR_FAL_TRIG_REG   (GPIO_CFG_BASE + 0x30)
237 /**
238  *  @brief
239  *      The base address of the I2C peripheral, and the module divisor of the cpu clock
240  */
241 #define DEVICE_I2C_BASE                 0x02530000
242 #define DEVICE_I2C_MODULE_DIVISOR       6
244 /**
245  * @brief
246  *      The address of the DEVSTAT register
247  */
248 #define DEVICE_REG_DEVSTAT              0x02620020
250 /**
251  * @brief
252  *     Prototypes for the PLL functions handled outside the main PLL registers
253  */
254 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal);
255 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult);
256 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult);
259 /**
260  *  @brief
261  *      Hardware network subsystem support, ethernet switch
262  */
263 #define DEVICE_CPSW
264 #define DEVICE_CPSW_NUM_PORTS       5                    /* 3 switch ports */
265 #define DEVICE_CPSW_BASE            (0x02090800)
266 #define targetGetSwitchCtl()        CPSW_CTL_P0_ENABLE   /* Enable port 0 */
267 #define targetGetSwitchMaxPktSize() 9000
269 #define DEVICE_QM
270 #define DEVICE_QM_MANAGER_BASE          0x02A02000
271 #define DEVICE_QM_DESC_SETUP_BASE       0x02A03000
272 #define DEVICE_QM_MANAGER_QUEUES_BASE   0x02A80000
273 #define DEVICE_QM_MANAGER_Q_PROXY_BASE  0x02AC0000
274 #define DEVICE_QM_QUEUE_STATUS_BASE             0x02A40000
276 /* QM base address register */
277 #define DEVICE_QM1_QUEUE_MANAGEMENT_REGS(x)  (0x23A00000 + 0x80000 + 0x10000*(x))
278 #define DEVICE_QM2_QUEUE_MANAGEMENT_REGS(x)  (0x23A00000 + 0xA0000 + 0x10000*(x))
280 #define DEVICE_QM_NUM_LINKRAMS          2
281 #define DEVICE_QM_NUM_MEMREGIONS        20
282 void    *targetGetQmConfig(void);
283 void     targetInitQs (void);
285 #define chipLmbd(x,y) _lmbd(x,y)
290 #define DEVICE_CPDMA
292 #define DEVICE_PA_CDMA_GLOBAL_CFG_BASE   0x02004000
293 #define DEVICE_PA_CDMA_TX_CHAN_CFG_BASE  0x02004400
294 #define DEVICE_PA_CDMA_RX_CHAN_CFG_BASE  0x02004800
295 #define DEVICE_PA_CDMA_RX_FLOW_CFG_BASE  0x02005000
297 #define DEVICE_PA_CDMA_RX_NUM_CHANNELS   24
298 #define DEVICE_PA_CDMA_RX_NUM_FLOWS      32
299 #define DEVICE_PA_CDMA_TX_NUM_CHANNELS   9
302 #define DEVICE_QM_FREE_Q                910
303 #define DEVICE_QM_LNK_BUF_Q             911
304 #define DEVICE_QM_RCV_Q                 912
305 #define DEVICE_QM_TX_Q                  913
306 #define DEVICE_QM_PA_CFG_Q              640
307 #define DEVICE_QM_ETH_TX_Q              648
309 #define DEVICE_RX_CDMA_TIMEOUT_COUNT    1000
313 #define DEVICE_PA
314 #define DEVICE_PA_BASE                  0x02000000
315 #define DEVICE_PA_NUM_PDSPS             6
316 #define DEVICE_PA_RUN_CHECK_COUNT       100         /* Number of loops to verify PA firmware is running */
317 #define DEVICE_PA_PLL_BASE              0x02620338
318 #define chipLower8(x)                   ((x) & 0x00ff)
321 #define TARGET_SGMII_EXTERNAL_SERDES
322 #define TARGET_SGMII_TYPE_2             /* Use second sgmii setup sequence */
323 #define TARGET_SGMII_BASE_ADDRESSES    { 0x02090100, 0x02090200 }
324 #define TARGET_SGMII_SERDES_BASE        0x2620340
325 #define TARGET_SGMII_SERDES_STATUS_BASE 0x2620158
326 #define TARGET_SGMII_SOFT_RESET         0x04
327 #define TARGET_SGMII_CONTROL            0x10
328 #define TARGET_SGMII_MR_ADV_ABILITY     0x18
329 void targetSgmiiSerdesConfig (int32 port, void *cfg);
330 #define chipKickOpenSerdes(x)           *((uint32 *)0x2620038) = 0x83e70b13; *((uint32 *)0x262003c) = 0x95a4f1e0
331 #define chipKickClosedSerdes(x)         ;       /* never lock the registers */
332 #define TARGET_SERDES_LOCK_DELAY        (1600*1000)
334 #define DEVICE_EMACSL_BASE(x)           (0x02090900 + (x)*0x040)
335 #define DEVICE_N_GMACSL_PORTS           2
336 #define DEVICE_EMACSL_RESET_POLL_COUNT  100
337 Int32 targetMacSend (void *ptr_device, Uint8* buffer, int num_bytes);
338 Int32 targetMacRcv (void *ptr_device, UINT8 *buffer);
340 #define DEVICE_SS
341 #define DEVICE_PSTREAM_CFG_REG_ADDR                 0x2000604
342 #define DEVICE_PSTREAM_CFG_REG_VAL_ROUTE_PDSP0      0
343 #define hwConfigStreamingSwitch()                   DEVICE_REG32_W(DEVICE_PSTREAM_CFG_REG_ADDR, DEVICE_PSTREAM_CFG_REG_VAL_ROUTE_PDSP0);
345 #define ECC_BLOCK_SIZE                  256
347 /* NAND address pack macro */
348 #define PACK_ADDR(col, page, block) \
349         ((col & 0x000000ff) | ((page & 0x0000001f) << 9) | ((block & 0x00000fff) << 14))
351 /**
352  *  @brief
353  *      Register access macros
354  */
355 #define DEVICE_REG32_W(x,y)   *(volatile unsigned int *)(x)=(y)
356 #define DEVICE_REG32_R(x)    (*(volatile unsigned int *)(x))
358 #define BOOTBITMASK(x,y)      (   (   (  ((UINT32)1 << (((UINT32)x)-((UINT32)y)+(UINT32)1) ) - (UINT32)1 )   )   <<  ((UINT32)y)   )
359 #define BOOT_READ_BITFIELD(z,x,y)   (((UINT32)z) & BOOTBITMASK(x,y)) >> (y)
360 #define BOOT_SET_BITFIELD(z,f,x,y)  (((UINT32)z) & ~BOOTBITMASK(x,y)) | ( (((UINT32)f) << (y)) & BOOTBITMASK(x,y) )
362 /**
363  *  @brief
364  *      Mpax configuration registers
365  */
366 #define DEVICE_REG_XMPAX_L(x) *((volatile unsigned int *)(0x08000000 + (8*(x))))
367 #define DEVICE_REG_XMPAX_H(x) *((volatile unsigned int *)(0x08000004 + (8*(x))))
370 /**
371  *  @brief
372  *      ROM boot loader boot modes and table locations
373  */
374 #define BOOT_MODE_I2C               40
375 #define BOOT_MODE_SPI               50
378 #define ROM_BOOT_PARAMS_ADDR_TCI6634K2K   0x8fff00
380 /**
381  *  @brief
382  *      No device specific configuration required for NOR boot, so
383  *      the function call is defined to return success.
384  */
385 #define deviceConfigureForNor()    0
388 /****************************************************************
389  *
390  * NOTE: Following build flags enable DEVICE specific workarounds
391  * and have code which is specific to C6670/C6678 LC EVMs
392  *
393  ****************************************************************/
395 /**
396  *  @brief
397  *      Support for PLL workaround to re-enter ROM boot loader.
398  */
399 #define IBL_ENTER_ROM              0
401 /**
402  *  @brief
403  *      Support for enabling EDC for internal memory.
404  */
405 #define IBL_ENABLE_EDC             1
407 /**
408  *  @brief
409  *      Support for enabling PCIe workarond for C6678/C6670.
410  */
411 /* #define IBL_ENABLE_PCIE_WORKAROUND 1  TBD */
413 /**
414  *  @brief
415  *     DDR start and end address needed for DDR memory test
416  */
417 #define DDR3_TEST_START_ADDRESS 0x80000000
418 #define DDR3_TEST_END_ADDRESS   (DDR3_TEST_START_ADDRESS + (128 *1024))
420 /**
421  *  @brief
422  *     Software workaround for DDR3 memory corruption is to re-init the PLL's and DDR controller. This flag enables the workaround
423  */
424 #define PLL_REINIT_WORKAROUND
426 UINT32 ddr3_memory_test();
427 #endif /* _TARGET_H */