1
0
mirror of git://projects.qi-hardware.com/xburst-tools.git synced 2024-11-26 07:57:31 +02:00

qi-gta02-compute-nand-kernel-partition-offset.patch

There's one more thing that wants dynpart computed block offset -
the kernel offset used for NAND boot.

This patch moves the business end of the dynparts computation into
the port_init_gta02() so it's done earlier, and writes the block
index into the board_api struct NAND option's partition block start
field.

It also adds a field to the nand_dynparts struct so we can hold both
the true length and true block offset for each partition for later
use by the original code in append_device_specific_cmdline_gta02.

Signed-off-by: Andy Green <andy@openmoko.com>
This commit is contained in:
Andy Green 2009-02-03 18:06:40 +00:00 committed by Andy Green
parent dd0c85f427
commit 08362c95c7

View File

@ -42,9 +42,12 @@ static int battery_condition_reasonable = 0;
extern unsigned long partition_offset_blocks; extern unsigned long partition_offset_blocks;
extern unsigned long partition_length_blocks; extern unsigned long partition_length_blocks;
const struct board_api board_api_gta02;
struct nand_dynparts { struct nand_dynparts {
const char *name; /* name of this partition for Linux */ const char *name; /* name of this partition for Linux */
u32 good_length; /* bytes needed from good sectors in this partition */ u32 good_length; /* bytes needed from good sectors in this partition */
u32 true_offset;
}; };
/* /*
@ -134,6 +137,10 @@ void port_init_gta02(void)
unsigned int * UPLLCON = (unsigned int *)0x4c000008; unsigned int * UPLLCON = (unsigned int *)0x4c000008;
unsigned int * CLKDIVN = (unsigned int *)0x4c000014; unsigned int * CLKDIVN = (unsigned int *)0x4c000014;
int n; int n;
u32 block512 = 0;
u32 start_block512 = 0;
const u32 GTA02_NAND_READBLOCK_SIZE = 2048;
extern int s3c2442_nand_is_bad_block(unsigned long block_index_512);
//CAUTION:Follow the configuration order for setting the ports. //CAUTION:Follow the configuration order for setting the ports.
// 1) setting value(GPnDAT) // 1) setting value(GPnDAT)
@ -297,6 +304,44 @@ void port_init_gta02(void)
* evil beast * evil beast
*/ */
glamo_core_init(); glamo_core_init();
/*
* dynparts computation
*/
n = 0;
while (n < ARRAY_SIZE(nand_dynparts)) {
if (nand_dynparts[n].good_length)
while (nand_dynparts[n].good_length) {
if (!s3c2442_nand_is_bad_block(block512))
nand_dynparts[n].good_length -=
GTA02_NAND_READBLOCK_SIZE;
block512 += GTA02_NAND_READBLOCK_SIZE / 512;
}
else
/*
* cannot afford to compute real size of last block
* set it to extent - end of last block
*/
block512 = nand_extent_block512;
/* stash a copy of real offset for each partition */
nand_dynparts[n].true_offset = start_block512;
/* and the accurate length */
nand_dynparts[n].good_length = block512 - start_block512;
start_block512 = block512;
n++;
}
/* fix up the true start of kernel partition */
((struct board_api *)&board_api_gta02)->kernel_source[3].
offset_blocks512_if_no_partition = nand_dynparts[2].true_offset;
} }
/** /**
@ -484,7 +529,6 @@ void post_serial_init_gta02(void)
puts("BATTERY CONDITION LOW\n"); puts("BATTERY CONDITION LOW\n");
} }
const struct board_api board_api_gta02;
/* /*
* create and append device-specific Linux kernel commandline * create and append device-specific Linux kernel commandline
@ -497,11 +541,6 @@ char * append_device_specific_cmdline_gta02(char * cmdline)
{ {
int n = 0; int n = 0;
int len; int len;
u32 block512 = 0;
u32 start_block512 = 0;
char term = ',';
const u32 GTA02_NAND_READBLOCK_SIZE = 2048;
extern int s3c2442_nand_is_bad_block(unsigned long block_index_512);
static char mac[64]; static char mac[64];
struct kernel_source const * real_kernel = this_kernel; struct kernel_source const * real_kernel = this_kernel;
@ -514,37 +553,19 @@ char * append_device_specific_cmdline_gta02(char * cmdline)
while (n < ARRAY_SIZE(nand_dynparts)) { while (n < ARRAY_SIZE(nand_dynparts)) {
if (nand_dynparts[n].good_length)
while (nand_dynparts[n].good_length) {
if (!s3c2442_nand_is_bad_block(block512))
nand_dynparts[n].good_length -=
GTA02_NAND_READBLOCK_SIZE;
block512 += GTA02_NAND_READBLOCK_SIZE / 512;
}
else {
/*
* cannot afford to compute real size of last block
* set it to extent - end of last block
*/
block512 = nand_extent_block512;
term = ' ';
}
*cmdline++ = '0'; *cmdline++ = '0';
*cmdline++ = 'x'; *cmdline++ = 'x';
set32(cmdline, (block512 - start_block512) * 512); set32(cmdline, nand_dynparts[n].good_length * 512);
cmdline += 8; cmdline += 8;
*cmdline++ = '('; *cmdline++ = '(';
cmdline += strlen(strcpy(cmdline, nand_dynparts[n].name)); cmdline += strlen(strcpy(cmdline, nand_dynparts[n].name));
*cmdline++ = ')'; *cmdline++ = ')';
*cmdline++ = term;
/* stash a copy of real offset for each partition */ if (++n == ARRAY_SIZE(nand_dynparts))
nand_dynparts[n].good_length = start_block512; *cmdline++ = ' ';
else
*cmdline++ = ',';
start_block512 = block512;
n++;
} }
*cmdline = '\0'; *cmdline = '\0';
@ -554,7 +575,7 @@ char * append_device_specific_cmdline_gta02(char * cmdline)
*/ */
/* position ourselves at true start of GTA02 identity partition */ /* position ourselves at true start of GTA02 identity partition */
partition_offset_blocks = nand_dynparts[4].good_length; partition_offset_blocks = nand_dynparts[4].true_offset;
partition_length_blocks = 0x40000 / 512; partition_length_blocks = 0x40000 / 512;
/* /*
@ -653,6 +674,7 @@ const struct board_api board_api_gta02 = {
[3] = { [3] = {
.name = "NAND Kernel", .name = "NAND Kernel",
.block_read = nand_read_ll, .block_read = nand_read_ll,
/* NOTE offset below is replaced at runtime */
.offset_blocks512_if_no_partition = 0x80000 / 512, .offset_blocks512_if_no_partition = 0x80000 / 512,
.filesystem = FS_RAW, .filesystem = FS_RAW,
.commandline_append = " rootfstype=jffs2 " \ .commandline_append = " rootfstype=jffs2 " \