Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: arch/arm/cpu/arm_cortexa9/tegra2/ap20.c

Issue 4841001: Tegra2: implement Warmboot code and lp0_vec (Closed) Base URL: http://git.chromium.org/git/u-boot-next.git@chromeos-v2010.09
Patch Set: Add CONFIG_TEGRA2_LP0 to support LP0 conditionally Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * (C) Copyright 2010 2 * (C) Copyright 2010
3 * NVIDIA Corporation <www.nvidia.com> 3 * NVIDIA Corporation <www.nvidia.com>
4 * 4 *
5 * See file CREDITS for list of people who contributed to this 5 * See file CREDITS for list of people who contributed to this
6 * project. 6 * project.
7 * 7 *
8 * This program is free software; you can redistribute it and/or 8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as 9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of 10 * published by the Free Software Foundation; either version 2 of
(...skipping 13 matching lines...) Expand all
24 24
25 #define NV_ASSERT(p) \ 25 #define NV_ASSERT(p) \
26 { if ((p) == 0) { \ 26 { if ((p) == 0) { \
27 uart_post('C'); \ 27 uart_post('C'); \
28 uart_post('o'); \ 28 uart_post('o'); \
29 uart_post('l'); \ 29 uart_post('l'); \
30 uart_post('d'); \ 30 uart_post('d'); \
31 }; \ 31 }; \
32 } 32 }
33 33
34 /** Scratch register macros **/
35
36 /** NV_SF_NUM - define a new scratch register value.
37
38 @param s scratch register name (APBDEV_PMC_s)
39 @param f register field
40 @param n defined value for the field
41 */
42 #define NV_SF_NUM(s,f,n) \
43 (((n)& NV_FIELD_MASK(APBDEV_PMC_##s##_0_##f##_RANGE)) << \
44 NV_FIELD_SHIFT(APBDEV_PMC_##s##_0_##f##_RANGE))
45
46
47 /** NV_FLD_SET_SR_NUM - modify a scratch register field.
48
49 @param s scratch register name (APBDEV_PMC_s)
50 @param f register field
51 @param n numeric field value
52 */
53 #define NV_FLD_SET_SF_NUM(s,f,n) \
54 ((s & ~NV_FIELD_SHIFTMASK(APBDEV_PMC_##s##_0_##f##_RANGE))\
55 | NV_SF_NUM(s,f,n))
56
57
58 /** NV_SDRF_NUM - define a new scratch register value.
59
60 @param s scratch register name (APBDEV_PMC_s)
61 @param d register domain (hardware block)
62 @param r register name
63 @param f register field
64 @param n defined value for the field
65 */
66 #define NV_SDRF_NUM(s,d,r,f,n) \
67 (((n)& NV_FIELD_MASK(APBDEV_PMC_##s##_0_##d##_##r##_0_##f##_RANGE)) << \
68 NV_FIELD_SHIFT(APBDEV_PMC_##s##_0_##d##_##r##_0_##f##_RANGE))
69
70
71 /** NV_FLD_SET_SDRF_NUM - modify a scratch register field.
72
73 @param s scratch register name (APBDEV_PMC_s)
74 @param d register domain (hardware block)
75 @param r register name
76 @param f register field
77 @param n numeric field value
78 */
79 #define NV_FLD_SET_SDRF_NUM(s,d,r,f,n) \
80 ((s & ~NV_FIELD_SHIFTMASK(APBDEV_PMC_##s##_0_##d##_##r##_0_##f##_RANGE)) \
81 | NV_SDRF_NUM(s,d,r,f,n))
82
83
84 /** SCRATCH_REGS() - PMC scratch registers (list of SCRATCH_REG() macros).
85 SCRATCH_REG(s) - PMC scratch register name:
86
87 @param s Scratch register name (APBDEV_PMC_s)
88 */
89 #define SCRATCH_REGS() \
90 SCRATCH_REG(SCRATCH2) \
91 SCRATCH_REG(SCRATCH4) \
92 SCRATCH_REG(SCRATCH24) \
93 /* End-of-List*/
94
95 #define SCRATCH_REG(s) static NvU32 s = 0;
96 SCRATCH_REGS()
97 #undef SCRATCH_REG
98
99 #define REGS() \
100 /* CLK_RST Group */ \
101 REG(SCRATCH2, CLK_RST_CONTROLLER, OSC_CTRL, XOBP) \
102 REG(SCRATCH2, CLK_RST_CONTROLLER, PLLM_BASE, PLLM_DIVM) \
103 REG(SCRATCH2, CLK_RST_CONTROLLER, PLLM_BASE, PLLM_DIVN) \
104 REG(SCRATCH2, CLK_RST_CONTROLLER, PLLM_BASE, PLLM_DIVP) \
105 REG(SCRATCH2, CLK_RST_CONTROLLER, PLLM_MISC, PLLM_CPCON) \
106 REG(SCRATCH2, CLK_RST_CONTROLLER, PLLM_MISC, PLLM_LFCON) \
107 /**/ \
108 /* EMC Group */ \
109 REG2(SCRATCH4, EMC, FBIO_SPARE, CFG_FBIO_SPARE_WB0) \
110 /* APB_MISC Group */ \
111 REG3(SCRATCH2, APB_MISC, GP_XM2CFGAPADCTRL, CFG2TMC_XM2CFGA_PREE MP_EN) \
112 REG3(SCRATCH2, APB_MISC, GP_XM2CFGDPADCTRL, CFG2TMC_XM2CFGD_SCHM T_EN) \
113 /**/ \
114 /* BCT SdramParams Group*/ \
115 RAM(SCRATCH2, MEMORY_TYPE, MemoryType) \
116 /**/ \
117 RAM(SCRATCH4, EMC_CLOCK_DIVIDER, EmcClockDivider) \
118 CONSTANT(SCRATCH4, PLLM_STABLE_TIME, ~0) /* Stuff the maximum va lue */ \
119 CONSTANT(SCRATCH4, PLLX_STABLE_TIME, ~0) /* Stuff the maximum va lue */ \
120 /**/ \
121 RAM(SCRATCH24, EMC_AUTO_CAL_WAIT, EmcAutoCalWait) \
122 RAM(SCRATCH24, EMC_PIN_PROGRAM_WAIT, EmcPinProgramWait) \
123 RAM(SCRATCH24, WARMBOOT_WAIT, WarmBootWait)
124
125 /*Correct names */
126 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_OSC_CTRL_0_XOBP_RANGE\
127 APBDEV_PMC_SCRATCH2_0_CLK_RST_OSC_CTRL_XOBP_RANGE
128 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_PLLM_BASE_0_PLLM_DIVM_RANGE\
129 APBDEV_PMC_SCRATCH2_0_CLK_RST_PLLM_BASE_PLLM_DIVM_RANGE
130 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_PLLM_BASE_0_PLLM_DIVN_RANGE\
131 APBDEV_PMC_SCRATCH2_0_CLK_RST_PLLM_BASE_PLLM_DIVN_RANGE
132 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_PLLM_BASE_0_PLLM_DIVP_RANGE\
133 APBDEV_PMC_SCRATCH2_0_CLK_RST_PLLM_BASE_PLLM_DIVP_RANGE
134 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_PLLM_MISC_0_PLLM_CPCON_RANGE\
135 APBDEV_PMC_SCRATCH2_0_CLK_RST_PLLM_MISC_CPCON_RANGE
136 #define APBDEV_PMC_SCRATCH2_0_CLK_RST_CONTROLLER_PLLM_MISC_0_PLLM_LFCON_RANGE\
137 APBDEV_PMC_SCRATCH2_0_CLK_RST_PLLM_MISC_LFCON_RANGE
138
139 #define SDRAM_PARAMS_BASE_ADDR (0x40000000 + 0x100 + 0x88)
140
Tom Warren 2010/11/16 18:34:27 Please #ifdef this function with CONFIG_TEGRA2_LP0
yelin 2010/11/16 23:41:04 Done.
141 void NvBlSaveSdramParams(void)
142 {
143 NvU32 reg; /* Module register contents */
144 NvU32 val; /* Register field contents */
145 NvBootSdramParams sdram_params;
146
147 memcpy (&sdram_params, (char *)SDRAM_PARAMS_BASE_ADDR,
148 sizeof(NvBootSdramParams));
149
150 /* REG(s,d,r,f)
151 * s = destination Scratch register
152 * d = Device name
153 * r = Register name
154 * f = register Field
155 */
156 #define REG(s,d,r,f) \
157 reg = NV_CAR_REGR(CLK_RST_PA_BASE, r); \
158 val = NV_DRF_VAL(d,r,f,reg); \
159 s = NV_FLD_SET_SDRF_NUM(s,d,r,f,val);
160
161 #define REG2(s,d,r,f) \
162 reg = NV_EMC_REGR(EMC_PA_BASE, r); \
163 val = NV_DRF_VAL(d,r,f,reg); \
164 s = NV_FLD_SET_SDRF_NUM(s,d,r,f,val);
165
166 #define REG3(s,d,r,f) \
167 reg = NV_MISC_REGR(MISC_PA_BASE, r);\
168 val = NV_DRF_VAL(d,r,f,reg); \
169 s = NV_FLD_SET_SDRF_NUM(s,d,r,f,val);
170
171 /* RAM(s,f,n)
172 * s = destination Scratch register
173 * f = register Field
174 * v = bct Variable
175 */
176 #define RAM(s,f,v) \
177 s = NV_FLD_SET_SF_NUM(s,f,sdram_params.v);
178
179 /* Define the transformation macro that will stuff a PMC scratch registe r
180 * with a constant value.
181 */
182
183 /* CONSTANT(s,f,n)
184 * s = destination Scratch register
185 * f = register Field
186 * v = constant Value
187 */
188 #define CONSTANT(s,f,v) \
189 s = NV_FLD_SET_SF_NUM(s,f,v);
190
191 /*Instantiate all of the register transformations. */
192 REGS()
193 #undef RAM
194 #undef CONSTANT
195
196 /* Generate writes to the PMC scratch registers to copy the local
197 * variables to the actual registers.
198 */
199 #define SCRATCH_REG(s)\
200 NV_PMC_REGW(PMC_PA_BASE, s, s);
201 SCRATCH_REGS()
202 #undef SCRATCH_REG
203 }
204
34 void NvBlAvpStallUs(NvU32 MicroSec) 205 void NvBlAvpStallUs(NvU32 MicroSec)
35 { 206 {
36 NvU32 Reg; // Flow controller register 207 NvU32 Reg; // Flow controller register
37 NvU32 Delay; // Microsecond delay time 208 NvU32 Delay; // Microsecond delay time
38 NvU32 MaxUs; // Maximum flow controller delay 209 NvU32 MaxUs; // Maximum flow controller delay
39 210
40 // Get the maxium delay per loop. 211 // Get the maxium delay per loop.
41 MaxUs = NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, ZERO, 0xFFFFFFFF); 212 MaxUs = NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, ZERO, 0xFFFFFFFF);
42 213
43 while (MicroSec) 214 while (MicroSec)
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 pPmc = (volatile NvU8 *)(NV_ADDRESS_MAP_PMC_BASE); 920 pPmc = (volatile NvU8 *)(NV_ADDRESS_MAP_PMC_BASE);
750 921
751 // SCRATCH0 is initialized by the boot ROM and shouldn't be cleared 922 // SCRATCH0 is initialized by the boot ROM and shouldn't be cleared
752 for (i=APBDEV_PMC_SCRATCH1_0; i<=APBDEV_PMC_SCRATCH23_0; i+=4) 923 for (i=APBDEV_PMC_SCRATCH1_0; i<=APBDEV_PMC_SCRATCH23_0; i+=4)
753 { 924 {
754 if (i==APBDEV_PMC_SCRATCH20_0) 925 if (i==APBDEV_PMC_SCRATCH20_0)
755 NV_WRITE32(pPmc+i, CONFIG_SYS_BOARD_ODMDATA); 926 NV_WRITE32(pPmc+i, CONFIG_SYS_BOARD_ODMDATA);
756 else 927 else
757 NV_WRITE32(pPmc+i, 0); 928 NV_WRITE32(pPmc+i, 0);
758 } 929 }
930
931 // Save Sdram params to PMC 2, 4, and 24 for WB0
Tom Warren 2010/11/16 18:34:27 Please #ifdef CONFIG_TEGRA2_LP0 here, also.
yelin 2010/11/16 23:41:04 Done.
932 NvBlSaveSdramParams();
759 } 933 }
760 934
761 NvU32 s_ChipId; 935 NvU32 s_ChipId;
762 volatile NvU32 s_bFirstBoot = 1; 936 volatile NvU32 s_bFirstBoot = 1;
763 937
764 void cpu_start( void ) 938 void cpu_start( void )
765 { 939 {
766 volatile NvU32 *jtagReg = (NvU32*)0x70000024; 940 volatile NvU32 *jtagReg = (NvU32*)0x70000024;
767 NvU32 reg; 941 NvU32 reg;
768 942
769 // enable JTAG 943 // enable JTAG
770 *jtagReg = 192; 944 *jtagReg = 192;
Tom Warren 2010/11/16 16:44:11 Please use #defined values from tegra2.h here, not
yelin 2010/11/16 23:41:04 Done.
771 945
772 reg = NV_MISC_REGR( MISC_PA_BASE, GP_HIDREV ); 946 reg = NV_MISC_REGR( MISC_PA_BASE, GP_HIDREV );
773 947
774 // DRF macros generate too-complicated code for the arm7 948 // DRF macros generate too-complicated code for the arm7
775 s_ChipId = reg >> 8; 949 s_ChipId = reg >> 8;
776 s_ChipId &= 0xff; 950 s_ChipId &= 0xff;
777 if( s_bFirstBoot ) 951 if( s_bFirstBoot )
778 { 952 {
779 uart_post('i'); 953 uart_post('i');
780 /* need to set this before cold-booting, otherwise we'll end up in 954 /* need to set this before cold-booting, otherwise we'll end up in
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 /***********************************************************************/ 994 /***********************************************************************/
821 NvBlCacheConfigure(); 995 NvBlCacheConfigure();
822 996
823 /* post code 'Yy' */ 997 /* post code 'Yy' */
824 PostYy(); 998 PostYy();
825 #endif 999 #endif
826 1000
827 /* post code 'Xx' */ 1001 /* post code 'Xx' */
828 PostXx(); 1002 PostXx();
829 } 1003 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698