diff options
Diffstat (limited to 'target/msm7627_ffa/init.c')
-rw-r--r-- | target/msm7627_ffa/init.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/target/msm7627_ffa/init.c b/target/msm7627_ffa/init.c index 2d8ac252..16c3c8a7 100644 --- a/target/msm7627_ffa/init.c +++ b/target/msm7627_ffa/init.c @@ -39,6 +39,10 @@ #define LINUX_MACHTYPE 1007015 +#define VARIABLE_LENGTH 0x10101010 +#define DIFF_START_ADDR 0xF0F0F0F0 +#define NUM_PAGES_PER_BLOCK 0x40 + static struct ptable flash_ptable; /* for these partitions, start will be offset by either what we get from @@ -67,13 +71,18 @@ static struct ptentry board_part_list[] = { }, { .start = 704, - .length = 40 /* 5MB */, - .name = "recovery", + .length = VARIABLE_LENGTH, + .name = "userdata", }, { - .start = 744, - .length = 720 /* 90MB */, - .name = "userdata", + .start = DIFF_START_ADDR, + .length = 8 /* 1MB */, + .name = "persist", + }, + { + .start = DIFF_START_ADDR, + .length = 40 /* 5MB */, + .name = "recovery", }, }; static int num_parts = sizeof(board_part_list)/sizeof(struct ptentry); @@ -89,6 +98,9 @@ void target_init(void) { unsigned offset; struct flash_info *flash_info; + unsigned total_num_of_blocks; + bool start_addr_changed = false; + unsigned next_ptr_start_adr = 0; int i; dprintf(INFO, "target_init()\n"); @@ -112,12 +124,33 @@ void target_init(void) if (offset == 0xffffffff) while(1); + total_num_of_blocks = (flash_info->block_size)/NUM_PAGES_PER_BLOCK; + for (i = 0; i < num_parts; i++) { struct ptentry *ptn = &board_part_list[i]; unsigned len = ptn->length; - if ((len == 0) && (i == num_parts - 1)) - len = flash_info->num_blocks - offset - ptn->start; + if(len == VARIABLE_LENGTH) + { + start_addr_changed = true; + unsigned length_for_prt = 0; + unsigned j; + for (j = i+1; j < num_parts; j++) + { + struct ptentry *temp_ptn = &board_part_list[j]; + ASSERT(temp_ptn->length != VARIABLE_LENGTH); + length_for_prt += temp_ptn->length; + } + len = (total_num_of_blocks - 1) - (offset + ptn->start + length_for_prt); + ASSERT(len >= 0); + next_ptr_start_adr = ptn->start + len; + } + if((ptn->start == DIFF_START_ADDR) && (start_addr_changed)) + { + ASSERT(next_ptr_start_adr); + ptn->start = next_ptr_start_adr; + next_ptr_start_adr = ptn->start + ptn->length; + } ptable_add(&flash_ptable, ptn->name, offset + ptn->start, len, ptn->flags); } |