summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Ziswiler <marcel.ziswiler@toradex.com>2013-05-01 17:56:12 +0200
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2013-05-01 17:56:12 +0200
commite1eacdf689663818d698c48d5b441a20538263d4 (patch)
treef5a5ce012e46895e95bc7edb1680b49e7b10448a
parent4fefbc020aa3239b3fe030662e54d5a96d4b7e16 (diff)
colibri_t20/30: mmc: integrate NVIDIA partition table parsing
NVIDIA's MMC/SD layout includes a partition table that can be used to generically determine U-Boot environment, kernel, configuration block as well as GPT offsets. As an added benefit this is completely independent of the underlying MMC/SD card used which might differ with various future module versions or particularly cards used for T20 SD boot. Also handles the case of T20 SD boot where the configuration block is still taken from NAND flash while the rest resides on the SD card. Initial partition table parsing courtesy of Mitja Špes from LXNAV.
-rw-r--r--arch/arm/include/asm/arch-tegra/tegra.h1
-rw-r--r--arch/arm/include/asm/global_data.h7
-rw-r--r--arch/arm/lib/board.c22
-rw-r--r--board/toradex/common/Makefile2
-rw-r--r--board/toradex/common/tegra2_partitions.c348
-rw-r--r--board/toradex/common/tegra2_partitions.h9
6 files changed, 270 insertions, 119 deletions
diff --git a/arch/arm/include/asm/arch-tegra/tegra.h b/arch/arm/include/asm/arch-tegra/tegra.h
index db00ebf167..73cd230e11 100644
--- a/arch/arm/include/asm/arch-tegra/tegra.h
+++ b/arch/arm/include/asm/arch-tegra/tegra.h
@@ -80,7 +80,6 @@ struct timerus {
#define NVBOOTINFOTABLE_BCTSIZE 0x38 /* BCT size in BIT in IRAM */
#define NVBOOTINFOTABLE_BCTPTR 0x3C /* BCT pointer in BIT in IRAM */
-#define BCT_PTINFO_OFFSET 3820
/* These are the available SKUs (product types) for Tegra */
enum {
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 97cfbf67c6..87c6761326 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -80,10 +80,13 @@ typedef struct global_data {
void **jt; /* jump table */
char env_buf[32]; /* buffer for getenv() before reloc. */
#if defined(CONFIG_COLIBRI_T20) || defined(CONFIG_COLIBRI_T30)
- unsigned env_offset; /* offset to U-Boot environment */
unsigned conf_blk_offset; /* offset to Toradex config block */
- unsigned kernel_offset; /* offset to kernel in mass storage */
+ unsigned env_offset; /* offset to U-Boot environment */
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || defined(CONFIG_COLIBRI_T30)
+ unsigned gpt_offset; /* offset to GPT in mass storage */
#endif
+ unsigned kernel_offset; /* offset to kernel in mass storage */
+#endif /* CONFIG_COLIBRI_T20 | CONFIG_COLIBRI_T30 */
} gd_t;
/*
diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index c6a12463e0..43b3733087 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -87,8 +87,8 @@ extern void rtl8019_get_enetaddr (uchar * addr);
#include <i2c.h>
#endif
-#ifdef CONFIG_COLIBRI_T20
-extern void tegra_partition_init(void);
+#if defined(CONFIG_COLIBRI_T20) || defined(CONFIG_COLIBRI_T30)
+extern void tegra_partition_init(int boot_type);
#endif
@@ -598,15 +598,25 @@ void board_init_r (gd_t *id, ulong dest_addr)
onenand_init();
#endif
-#ifdef CONFIG_COLIBRI_T20
- tegra_partition_init();
-#endif
-
#ifdef CONFIG_GENERIC_MMC
puts("MMC: ");
mmc_initialize(bd);
#endif
+#if defined(CONFIG_COLIBRI_T20) || defined(CONFIG_COLIBRI_T30)
+ tegra_partition_init(
+#ifdef CONFIG_COLIBRI_T20
+#ifndef CONFIG_ENV_IS_IN_MMC
+ 0
+#else /* !CONFIG_ENV_IS_IN_MMC */
+ 1
+#endif /* !CONFIG_ENV_IS_IN_MMC */
+#else /* CONFIG_COLIBRI_T20 */
+ 2
+#endif /* CONFIG_COLIBRI_T20 */
+ );
+#endif /* CONFIG_COLIBRI_T20 | CONFIG_COLIBRI_T30 */
+
#ifdef CONFIG_HAS_DATAFLASH
AT91F_DataflashInit();
dataflash_print_info();
diff --git a/board/toradex/common/Makefile b/board/toradex/common/Makefile
index 8d160d50e9..e80105dce7 100644
--- a/board/toradex/common/Makefile
+++ b/board/toradex/common/Makefile
@@ -27,7 +27,7 @@ LIB = $(obj)lib$(VENDOR).o
COBJS-y += board.o
COBJS-$(CONFIG_TEGRA2_NAND) += tegra2_nand.o
-COBJS-$(CONFIG_TEGRA2_NAND) += tegra2_partitions.o
+COBJS-y += tegra2_partitions.o
COBJS-$(CONFIG_USB_EHCI_TEGRA) += ulpi_linux.o
COBJS-$(CONFIG_USB_EHCI_TEGRA) += usb.o
diff --git a/board/toradex/common/tegra2_partitions.c b/board/toradex/common/tegra2_partitions.c
index 9ee4a4519d..87b83c21ce 100644
--- a/board/toradex/common/tegra2_partitions.c
+++ b/board/toradex/common/tegra2_partitions.c
@@ -1,19 +1,93 @@
#include <common.h>
-#include <asm/io.h>
-#include <nand.h>
-#include <malloc.h>
-#include <asm/arch/pinmux.h>
-#include <asm/arch/gpio.h>
+
#include <asm/arch-tegra/ap20.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/pinmux.h>
#include <asm/errno.h>
+#include <asm/io.h>
+
#include <fdt_decode.h>
+#include <malloc.h>
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || \
+ defined(CONFIG_COLIBRI_T30)
+#include <mmc.h>
+#endif
+#ifdef CONFIG_COLIBRI_T20
+#include <nand.h>
+
#include "tegra2_nand.h"
+#endif /* CONFIG_COLIBRI_T20 */
#include "tegra2_partitions.h"
#define DEBUG 0
+#if DEBUG > 1
+#define DEBUG_PARTITION(partinfo) \
+ printf("Part:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u" \
+ "\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n", \
+ partinfo->id, partinfo->name, partinfo->name2, \
+ partinfo->type, partinfo->allocation_policy, \
+ partinfo->filesystem_type, partinfo->virtual_start_sector, \
+ partinfo->virtual_size); \
+ printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n", \
+ partinfo->start_sector, partinfo->end_sector, \
+ partinfo->end_sector + 1 - partinfo->start_sector);
+#else
+#define DEBUG_PARTITION(...)
+#endif
+
DECLARE_GLOBAL_DATA_PTR;
+/* physical NAND block size, virtual block size in eMMC/SD card case */
+static int block_size;
+
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || \
+ defined(CONFIG_COLIBRI_T30)
+/**
+ * nvtegra_mmc_read - read data from mmc (unaligned)
+ * @param startAddress: data offset in bytes
+ * @param dataCount: data count in bytes
+ * @param dst: destination buffer
+ * @return: number of read bytes or 0 for error
+ */
+ulong nvtegra_mmc_read(ulong startAddress, ulong dataCount, void *dst)
+{
+ ulong readBlocks, startBlock, i;
+ void *buffer;
+
+ if (dataCount == 0 || dst == NULL)
+ return 0;
+
+ struct mmc *mmc = find_mmc_device(EMMC_DEV);
+ if (!mmc)
+ return 0;
+
+ mmc_init(mmc); // init if not inited
+
+ // align read size to blocks
+ startBlock = startAddress / EMMC_BLOCK_SIZE;
+ readBlocks = (startAddress + dataCount + EMMC_BLOCK_SIZE - 1) /
+ EMMC_BLOCK_SIZE - startBlock; // ceil
+
+ buffer = malloc(readBlocks * EMMC_BLOCK_SIZE);
+ if (!buffer)
+ return 0;
+
+ i = mmc->block_dev.block_read(EMMC_DEV, startBlock, readBlocks,
+ buffer);
+
+ if (i != readBlocks) {
+ free(buffer);
+ return 0;
+ }
+ memcpy(dst, buffer + (startAddress - startBlock * EMMC_BLOCK_SIZE),
+ dataCount);
+ free(buffer);
+
+ return dataCount;
+}
+#endif /* (CONFIG_ENV_IS_IN_MMC & CONFIG_COLIBRI_T20) | CONFIG_COLIBRI_T30 */
+
/**
* nvtegra_print_partition_table - prints partition table info
* @param pt: nvtegra_parttable_t structure
@@ -46,14 +120,8 @@ void nvtegra_print_partition_table(nvtegra_parttable_t * pt)
#endif
for (i = 0; (p->id < 128) && (i < TEGRA_MAX_PARTITIONS); i++) {
- printf
- ("\n[%u]\tPart:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n",
- i, p->id, p->name, p->name2, p->type, p->allocation_policy,
- p->filesystem_type, p->virtual_start_sector,
- p->virtual_size);
- printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n",
- p->start_sector, p->end_sector,
- p->end_sector + 1 - p->start_sector);
+ printf("\n[%u]\t", i);
+ DEBUG_PARTITION(p);
#if DEBUG > 1
printf("\t\tUNK1=%u\t%u\n", p->_unknown1[0], p->_unknown1[1]);
@@ -72,16 +140,17 @@ void nvtegra_print_partition_table(nvtegra_parttable_t * pt)
/**
* nvtegra_read_partition_table - reads nvidia's partition table
+ * @param boot_media: 0: NAND, 1: eMMC or SD card
* @return:
* 1 - Success
* 0 - Error
*/
-int nvtegra_read_partition_table(nvtegra_parttable_t * pt)
+int nvtegra_read_partition_table(nvtegra_parttable_t * pt, int boot_media)
{
size_t size;
int i;
nvtegra_partinfo_t *p;
- u32 bct_start, pt_logical, pt_offset;
+ u32 bct_start, pt_logical = 0, pt_offset;
// sanity check
if (!pt) {
@@ -100,41 +169,105 @@ int nvtegra_read_partition_table(nvtegra_parttable_t * pt)
#if DEBUG > 1
printf("bct_start=0x%08x\n", bct_start);
#endif
- pt_logical = readw(bct_start + BCT_PTINFO_OFFSET);
+
+ /* Search PT logical offset
+ Note: 0x326 for T30 Fastboot, 0xB48 for Eboot resp. Android
+ Fastboot and 0xEEC for Vibrante Fastboot */
+ for (i = 0; i < 0x800; i++) {
+ if (readw(bct_start) == 0x40) {
+ /* Either previous or 3rd next word */
+ pt_logical = readw(bct_start - 2);
+ if (pt_logical < 0x100)
+ pt_logical = readw(bct_start + 6);
+ break;
+ }
+ bct_start += 2;
+ }
+#if DEBUG > 1
+#ifdef CONFIG_COLIBRI_T20
+ if (boot_media == 0)
+ printf("logical=0x%08x writesize=0x%08x erasesize=0x%08x\n",
+ pt_logical, block_size, nand_info->erasesize);
+ else
+#endif /* CONFIG_COLIBRI_T20 */
+ printf("logical=0x%08x divisor=0x%08x\n", pt_logical,
+ block_size);
+#endif
+
/* In case we are running with a recovery BCT missing the partition
table offset information */
-#ifdef CONFIG_ENV_IS_IN_MMC
+#if defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)
if (1) {
#else
if (pt_logical == 0) {
#endif
- /* BCT partition size is 3 M in our default layout */
- pt_logical = 3 * 1024 * 1024 / nand_info->writesize;
+ if (boot_media == 0) {
+ /* On NAND BCT partition size is 3 M in our default
+ layout */
+ pt_logical = 3 * 1024 * 1024 / block_size;
+ } else {
+// 3 M - BootPartitions
+#ifdef CONFIG_COLIBRI_T30
+ pt_logical = 0x8000;
+#else
+ pt_logical = 0x4000;
+#endif
+ }
+#if DEBUG > 1
+ printf("forced logical=0x%08x\n", pt_logical);
+#endif
+ }
+
+#ifdef CONFIG_COLIBRI_T20
+ if (boot_media == 0) {
+ /* StartLogicalSector * PageSize + 4 * BlockSize */
+ pt_offset = pt_logical * nand_info->writesize +
+ 4 * nand_info->erasesize;
+ } else
+#endif /* CONFIG_COLIBRI_T20 */
+ {
+ /* StartLogicalSector / LogicalBlockSize * PhysicalBlockSize +
+ BootPartitions */
+ pt_offset = pt_logical / block_size * 512 + 1024 * 1024;
}
- /* StartLogicalSector * PageSize + 4 * BlockSize */
- pt_offset = pt_logical * nand_info->writesize + 4 * nand_info->erasesize;
#if DEBUG > 1
- printf("logical=0x%08x writesize=0x%08x erasesize=0x%08x\n", readw(bct_start + BCT_PTINFO_OFFSET), nand_info->writesize, nand_info->erasesize);
- printf("pt_offset=0x%08x\n", pt_offset);
+ printf("physical=0x%08x\n", pt_offset);
#endif
size = sizeof(nvtegra_parttable_t);
- i = nand_read_skip_bad(&nand_info[0], pt_offset, &size,
- (unsigned char *)pt);
- if ((i != 0) || (size != sizeof(nvtegra_parttable_t))) {
- printf
- ("%s: Error! nand_read_skip_bad failed. nand_info->writesize=%d ret=%d\n",
- __FUNCTION__, nand_info->writesize, i);
- return 0;
+#ifdef CONFIG_COLIBRI_T20
+ if (boot_media == 0) {
+ i = nand_read_skip_bad(&nand_info[0], pt_offset, &size,
+ (unsigned char *)pt);
+ if ((i != 0) || (size != sizeof(nvtegra_parttable_t))) {
+ printf("%s: Error! nand_read_skip_bad failed. "
+ "block_size=%d ret=%d\n",
+ __FUNCTION__, block_size, i);
+ return 0;
+ }
+ }
+#endif /* CONFIG_COLIBRI_T20 */
+#if defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)
+ else
+#endif
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || \
+ defined(CONFIG_COLIBRI_T30)
+ {
+ size = nvtegra_mmc_read(pt_offset, size, (void *)pt);
+ if (!size || size != sizeof(nvtegra_parttable_t)) {
+ printf("%s: Error! mmc block read failed. Read=%d\n",
+ __FUNCTION__, size);
+ return 0;
+ }
}
+#endif /* (CONFIG_ENV_IS_IN_MMC & CONFIG_COLIBRI_T20) | CONFIG_COLIBRI_T30 */
/* some heuristics */
p = &(pt->partinfo[0]);
if ((p->id != 2) || memcmp(p->name, "BCT\0", 4)
|| memcmp(p->name2, "BCT\0", 4) || (p->virtual_start_sector != 0)) {
- printf
- ("%s: Error! Partition table offset is probably incorrect. name='%s'\n",
- __FUNCTION__, p->name);
+ printf("%s: Error! Partition table offset is probably "
+ "incorrect. name='%s'\n", __FUNCTION__, p->name);
return 0;
}
@@ -185,6 +318,7 @@ int nvtegra_find_partition(nvtegra_parttable_t * pt, const char *name,
return 0;
}
+#ifdef CONFIG_COLIBRI_T20
int nvtegra_mtdparts_string(char *output, int size)
{
int i, j = 0;
@@ -198,9 +332,8 @@ int nvtegra_mtdparts_string(char *output, int size)
return 0;
}
if (size > 256) {
- printf
- ("%s: Error! size is too large. Increase buffer size here.\n",
- __FUNCTION__);
+ printf("%s: Error! size is too large. Increase buffer size "
+ "here.\n", __FUNCTION__);
return 0;
}
// parse nvidia partition table
@@ -211,7 +344,8 @@ int nvtegra_mtdparts_string(char *output, int size)
return 0;
}
- if (!nvtegra_read_partition_table(pt)) {
+ block_size = nand_info->writesize;
+ if (!nvtegra_read_partition_table(pt, 0)) {
free(pt);
return 0;
}
@@ -257,9 +391,15 @@ int nvtegra_mtdparts_string(char *output, int size)
free(pt);
return 1;
}
+#endif /* CONFIG_COLIBRI_T20 */
-void tegra_partition_init(void)
+//3 boot types: 0: Colibri T20 NAND only, 1: Colibri T20 mixed SD-boot but
+//config block in NAND or 2: Colibri T30 eMMC only
+//mixed case requires two itterations, first pass on NAND and second one on SD
+//card
+void tegra_partition_init(int boot_type)
{
+ int itterations, pass;
nvtegra_parttable_t *pt;
nvtegra_partinfo_t *partinfo;
@@ -270,83 +410,79 @@ void tegra_partition_init(void)
sizeof(nvtegra_parttable_t));
return;
}
- //copy partition information to global data
- if (!nvtegra_read_partition_table(pt)) {
- free(pt);
- return;
- }
- if (nvtegra_find_partition(pt, "ENV", &partinfo)) {
- gd->env_offset =
- partinfo->start_sector * nand_info->writesize;
-#if DEBUG > 1
- printf
- ("\nPart:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n",
- partinfo->id, partinfo->name, partinfo->name2,
- partinfo->type, partinfo->allocation_policy,
- partinfo->filesystem_type, partinfo->virtual_start_sector,
- partinfo->virtual_size);
- printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n",
- partinfo->start_sector, partinfo->end_sector,
- partinfo->end_sector + 1 - partinfo->start_sector);
-#endif
- }
+ if (boot_type == 0)
+ itterations = 1;
+ else
+ itterations = 2;
- if (nvtegra_find_partition(pt, "ARG", &partinfo)) {
- gd->conf_blk_offset =
- partinfo->start_sector * nand_info->writesize;
-#if DEBUG > 1
- printf
- ("\nPart:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n",
- partinfo->id, partinfo->name, partinfo->name2,
- partinfo->type, partinfo->allocation_policy,
- partinfo->filesystem_type, partinfo->virtual_start_sector,
- partinfo->virtual_size);
- printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n",
- partinfo->start_sector, partinfo->end_sector,
- partinfo->end_sector + 1 - partinfo->start_sector);
-#endif
- }
+ if (boot_type == 2)
+ pass = 1;
+ else
+ pass = 0;
- if (nvtegra_find_partition(pt, "LNX", &partinfo)) {
- gd->kernel_offset =
- partinfo->start_sector * nand_info->writesize;
-#if DEBUG > 1
- printf
- ("\nPart:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n",
- partinfo->id, partinfo->name, partinfo->name2,
- partinfo->type, partinfo->allocation_policy,
- partinfo->filesystem_type, partinfo->virtual_start_sector,
- partinfo->virtual_size);
- printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n",
- partinfo->start_sector, partinfo->end_sector,
- partinfo->end_sector + 1 - partinfo->start_sector);
-#endif
- }
+ for (; pass < itterations; pass++) {
+#ifdef CONFIG_COLIBRI_T20
+ if (pass == 0)
+ block_size = nand_info->writesize;
+ else
+ block_size = 4;
+#else /* CONFIG_COLIBRI_T20 */
+ block_size = 8;
+#endif /* CONFIG_COLIBRI_T20 */
+
+ //copy partition information to global data
+ if (!nvtegra_read_partition_table(pt, pass)) {
+ free(pt);
+ return;
+ }
- if (nvtegra_find_partition(pt, "USR", &partinfo)) {
-#if DEBUG > 1
- printf
- ("\nPart:\tID=%u\tNAME=%s\tNAME2=%s\n\t\tTYPE=%u\tALLOC_POLICY=%u\tFS_TYPE=%u\n\t\tVIRTUAL START SEC=%u\tVIRTUAL SIZE=%u\n",
- partinfo->id, partinfo->name, partinfo->name2,
- partinfo->type, partinfo->allocation_policy,
- partinfo->filesystem_type, partinfo->virtual_start_sector,
- partinfo->virtual_size);
- printf("\t\tSTART SEC=%u\tEND SEC=%u\tTOTAL=%u\n",
- partinfo->start_sector, partinfo->end_sector,
- partinfo->end_sector + 1 - partinfo->start_sector);
+ /* ConfigBlock */
+ if ((pass == 0 || (boot_type == 2 && pass == 1)) &&
+ nvtegra_find_partition(pt, "ARG", &partinfo)) {
+ gd->conf_blk_offset =
+ partinfo->start_sector * block_size;
+ DEBUG_PARTITION(partinfo);
+ }
+
+ if ((boot_type == 0 && pass == 0) || pass == 1) {
+ if (nvtegra_find_partition(pt, "ENV", &partinfo)) {
+ gd->env_offset =
+ partinfo->start_sector * block_size;
+ DEBUG_PARTITION(partinfo);
+ }
+
+ if (nvtegra_find_partition(pt, "LNX", &partinfo)) {
+ gd->kernel_offset =
+ partinfo->start_sector * block_size;
+ DEBUG_PARTITION(partinfo);
+ }
+ }
+
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || \
+ defined(CONFIG_COLIBRI_T30)
+ if ((pass == 1) && nvtegra_find_partition(pt, "GP1", &partinfo))
+ {
+ gd->gpt_offset =
+ partinfo->start_sector * block_size + 1;
+ DEBUG_PARTITION(partinfo);
+ }
+#endif /* (CONFIG_ENV_IS_IN_MMC & CONFIG_COLIBRI_T20) | CONFIG_COLIBRI_T30 */
+
+#if DEBUG > 0
+ nvtegra_print_partition_table(pt);
#endif
}
-#if DEBUG > 1
- printf("gd->env_offset=%u\n", gd->env_offset);
- printf("gd->conf_blk_offset=%u\n", gd->conf_blk_offset);
- printf("gd->kernel_offset=%u\n", gd->kernel_offset);
-#endif
#if DEBUG > 0
- nvtegra_print_partition_table(pt);
+ printf("gd->conf_blk_offset=%u\n", gd->conf_blk_offset);
+ printf("gd->env_offset=%u\n", gd->env_offset);
+#if (defined(CONFIG_ENV_IS_IN_MMC) && defined(CONFIG_COLIBRI_T20)) || \
+ defined(CONFIG_COLIBRI_T30)
+ printf("gd->gpt_offset=%u\n", gd->gpt_offset);
+#endif
+ printf("gd->kernel_offset=%u\n", gd->kernel_offset);
#endif
free(pt);
}
-
diff --git a/board/toradex/common/tegra2_partitions.h b/board/toradex/common/tegra2_partitions.h
index 504cd1a5cf..8f4f940b9c 100644
--- a/board/toradex/common/tegra2_partitions.h
+++ b/board/toradex/common/tegra2_partitions.h
@@ -1,6 +1,9 @@
#ifndef _TEGRA2_PARTITIONS_H_
#define _TEGRA2_PARTITIONS_H_
+#define EMMC_DEV 0
+#define EMMC_BLOCK_SIZE 512
+
#define TEGRA_MAX_PARTITIONS 24
typedef struct {
@@ -27,12 +30,12 @@ typedef struct {
nvtegra_partinfo_t partinfo[TEGRA_MAX_PARTITIONS];
} __attribute__ ((packed)) nvtegra_parttable_t;
+ulong nvtegra_mmc_read(ulong startAddress, ulong dataCount, void *dst);
void nvtegra_print_partition_table(nvtegra_parttable_t * pt);
-int nvtegra_read_partition_table(nvtegra_parttable_t * pt);
+int nvtegra_read_partition_table(nvtegra_parttable_t * pt, int boot_media);
int nvtegra_find_partition(nvtegra_parttable_t * pt, const char *name,
nvtegra_partinfo_t ** partinfo);
int nvtegra_mtdparts_string(char *output, int size);
-void tegra_partition_init(void);
+void tegra_partition_init(int boot_type);
#endif /* _TEGRA2_PARTITIONS_H_ */
-