Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |