arm: Tegra: Use ODMDATA from BCT in IRAM
authorTom Warren <twarren@nvidia.com>
Wed, 30 May 2012 21:06:09 +0000 (14:06 -0700)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 7 Jul 2012 12:07:21 +0000 (14:07 +0200)
Walk the BIT and BCT to find the ODMDATA word in the
CustomerData field and put it into Scratch20 reg for
use by kernel, etc.

Built all Tegra builds OK; Booted on Seaboard and saw
ODMDATA in PMC scratch20 was the same as the value in my
burn-u-boot.sh file (0x300D8011). NOTE: All flash utilities
will have to specify the odmdata (nvflash --odmdata n) on
the command line or via a cfg file, or built in to their
BCT.

Signed-off-by: Tom Warren <twarren@nvidia.com>
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
arch/arm/cpu/armv7/tegra2/ap20.c
arch/arm/include/asm/arch-tegra2/tegra2.h
include/configs/harmony.h
include/configs/medcom.h
include/configs/paz00.h
include/configs/plutux.h
include/configs/seaboard.h
include/configs/trimslice.h
include/configs/ventana.h
include/configs/whistler.h

index 24e582d95cc8d947d5ad1aec517105097ea3e022..1aad3879ee155abeac2ac5c6eef894a8c17db119 100644 (file)
@@ -314,9 +314,28 @@ void enable_scu(void)
        writel(reg, &scu->scu_ctrl);
 }
 
+static u32 get_odmdata(void)
+{
+       /*
+        * ODMDATA is stored in the BCT in IRAM by the BootROM.
+        * The BCT start and size are stored in the BIT in IRAM.
+        * Read the data @ bct_start + (bct_size - 12). This works
+        * on T20 and T30 BCTs, which are locked down. If this changes
+        * in new chips (T114, etc.), we can revisit this algorithm.
+        */
+
+       u32 bct_start, odmdata;
+
+       bct_start = readl(AP20_BASE_PA_SRAM + NVBOOTINFOTABLE_BCTPTR);
+       odmdata = readl(bct_start + BCT_ODMDATA_OFFSET);
+
+       return odmdata;
+}
+
 void init_pmc_scratch(void)
 {
        struct pmc_ctlr *const pmc = (struct pmc_ctlr *)TEGRA2_PMC_BASE;
+       u32 odmdata;
        int i;
 
        /* SCRATCH0 is initialized by the boot ROM and shouldn't be cleared */
@@ -324,7 +343,8 @@ void init_pmc_scratch(void)
                writel(0, &pmc->pmc_scratch1+i);
 
        /* ODMDATA is for kernel use to determine RAM size, LP config, etc. */
-       writel(CONFIG_SYS_BOARD_ODMDATA, &pmc->pmc_scratch20);
+       odmdata = get_odmdata();
+       writel(odmdata, &pmc->pmc_scratch20);
 
 #ifdef CONFIG_TEGRA2_LP0
        /* save Sdram params to PMC 2, 4, and 24 for WB0 */
index d4ada10ea8cfe2a84d9a941d634ee541c7742d44..3c8d8a84b5556de409413c54d237583193d04f4d 100644 (file)
@@ -60,6 +60,10 @@ struct timerus {
 /* Address at which WB code runs, it must not overlap Bootrom's IRAM usage */
 #define AP20_WB_RUN_ADDRESS    0x40020000
 
+#define NVBOOTINFOTABLE_BCTSIZE        0x38    /* BCT size in BIT in IRAM */
+#define NVBOOTINFOTABLE_BCTPTR 0x3C    /* BCT pointer in BIT in IRAM */
+#define BCT_ODMDATA_OFFSET     4068    /* 12 bytes from end of BCT */
+
 /* These are the available SKUs (product types) for Tegra */
 enum {
        SKU_ID_T20              = 0x8,
index d13ead990984adaacdf1b2f96edd7e88379c1c01..df5265a5a0d2c50e7077d5c2ca57a4de26f00dbb 100644 (file)
@@ -48,7 +48,6 @@
 #endif
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_HARMONY
-#define CONFIG_SYS_BOARD_ODMDATA       0x300d8011 /* lp1, 1GB */
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index d3d10550af392181b3f19deca4cb9f9c0888ade6..bdea7c9c5312064c58963366dbcea1bcd35d83e1 100644 (file)
@@ -31,7 +31,6 @@
 /* High-level configuration options */
 #define V_PROMPT                       "Tegra2 (Medcom) # "
 #define CONFIG_TEGRA2_BOARD_STRING     "Avionic Design Medcom"
-#define CONFIG_SYS_BOARD_ODMDATA       0x2b0d8011
 
 /* Board-specific serial config */
 #define CONFIG_SERIAL_MULTI
index 29c368a99e078ad0d659fdb75d4905e62930aab6..0dd1e83a504fa4278c204f5c372ce95b524b5def 100644 (file)
@@ -35,7 +35,6 @@
 #define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTA_BASE
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_PAZ00
-#define CONFIG_SYS_BOARD_ODMDATA       0x800c0085 /* lp1, 512MB */
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index e73be0bf929470128a790299c84abc262bc3effa..6397eb104a6cd6220fa57f03782818ba8a1520ea 100644 (file)
@@ -31,7 +31,6 @@
 /* High-level configuration options */
 #define V_PROMPT                       "Tegra2 (Plutux) # "
 #define CONFIG_TEGRA2_BOARD_STRING     "Avionic Design Plutux"
-#define CONFIG_SYS_BOARD_ODMDATA       0x2b2d8011
 
 /* Board-specific serial config */
 #define CONFIG_SERIAL_MULTI
index 537ab0e71cd5101e837d22bf2417b24d307571bd..f661583fed6d330a1701f9b0b22c4606a449a395 100644 (file)
@@ -53,7 +53,6 @@
 #define CONFIG_UART_DISABLE_GPIO       GPIO_PI3
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_SEABOARD
-#define CONFIG_SYS_BOARD_ODMDATA       0x300d8011 /* lp1, 1GB */
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index 915b07ae23b3bb9bcd2dd6803de6f452f052a351..91de348d59ed3853647120961ae66d484164e36c 100644 (file)
@@ -43,7 +43,6 @@
 #define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTA_BASE
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_TRIMSLICE
-#define CONFIG_SYS_BOARD_ODMDATA       0x300c0011 /* lp?, 1GB, UARTA */
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index 77a0a141520b14ad774501121cb8aa9308d717f8..5e4d53861c67f2b0e638392e41f37dc78cedb44f 100644 (file)
@@ -42,7 +42,6 @@
 #define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTD_BASE
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_VENTANA
-#define CONFIG_SYS_BOARD_ODMDATA       0x300d8011 /* lp1, 1GB */
 
 #define CONFIG_BOARD_EARLY_INIT_F
 
index 9dafe5cadca2715a229bfc226d0684d4bf121b5f..f2952d5f45e073aa8e7efc8b6414300f6336e139 100644 (file)
@@ -43,7 +43,6 @@
 #define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTA_BASE
 
 #define CONFIG_MACH_TYPE               MACH_TYPE_WHISTLER
-#define CONFIG_SYS_BOARD_ODMDATA       0x2B080105 /* lp?, 512MB, UARTA */
 
 #define CONFIG_BOARD_EARLY_INIT_F