void get_part_tab_from_complier(void) { #ifdef MTK_EMMC_SUPPORT int index=0; printf("get_pt_from_complier\n"); while (partition_layout[index].flags != PART_FLAG_END) { memcpy(lastest_part[index].name,partition_layout[index].name,MAX_PARTITION_NAME_LEN); lastest_part[index].size = (u64)partition_layout[index].blknum * BLK_SIZE ; lastest_part[index].offset = (u64)partition_layout[index].startblk * BLK_SIZE; if (lastest_part[index].size == 0) { lastest_part[index].size = target_get_max_flash_size() - lastest_part[index].offset - partition_reserve_size(); } lastest_part[index].mask_flags = partition_layout[index].flags; //this flag in kernel should be fufilled even though in flash is 0. printf("get_ptr %s %016llx %016llx\n",lastest_part[index].name,lastest_part[index].offset,lastest_part[index].size); index++; } #else int index=0; printf("get_pt_from_complier \n"); while(partition_layout[index].flags!= PART_FLAG_END) { memcpy(lastest_part[index].name,partition_layout[index].name,MAX_PARTITION_NAME_LEN); lastest_part[index].size = (u64)partition_layout[index].blknum*BLK_SIZE ; lastest_part[index].offset = (u64)partition_layout[index].startblk * BLK_SIZE; if(lastest_part[index].size == 0){ lastest_part[index].size = total_size - lastest_part[index].offset; } lastest_part[index].mask_flags = partition_layout[index].flags; //this flag in kernel should be fufilled even though in flash is 0. printf ("get_ptr %s %lx %lx\n",lastest_part[index].name,lastest_part[index].offset,lastest_part[index].size); index++; } #endif }
static uint32_t mmc_zero_out(struct mmc_device* dev, uint32_t blk_addr, uint32_t num_blks) { uint32_t *out; uint32_t block_size = mmc_get_device_blocksize(); uint32_t erase_size = (block_size * num_blks); uint32_t scratch_size = target_get_max_flash_size(); dprintf(INFO, "erasing 0x%x:0x%x\n", blk_addr, num_blks); if (erase_size <= scratch_size) { /* Use scratch address if the unaligned blocks */ out = (uint32_t *) target_get_scratch_address(); } else { dprintf(CRITICAL, "Erase Fail: Erase size: %u is bigger than scratch region\n", scratch_size); return 1; } memset((void *)out, 0, erase_size); /* Flush the data to memory before writing to storage */ arch_clean_invalidate_cache_range((addr_t) out , erase_size); if (mmc_sdhci_write(dev, out, blk_addr, num_blks)) { dprintf(CRITICAL, "failed to erase the partition: %x\n", blk_addr); return 1; } return 0; }
void part_init_pmt(unsigned long totalblks,part_dev_t *dev) { #ifdef MTK_EMMC_SUPPORT part_t *part = &partition_layout[0]; unsigned long lastblk; int retval=0; int i=0; printf ("mt6577_part_init_pmt \n"); if (!totalblks) return; /* updater the number of blks of first part. */ if (totalblks <= part->blknum) part->blknum = totalblks; totalblks -= part->blknum; lastblk = part->startblk + part->blknum; while (totalblks) { part++; if (!part->name) break; if (part->flags & PART_FLAG_LEFT || totalblks <= part->blknum) part->blknum = totalblks; part->startblk = lastblk; totalblks -= part->blknum; lastblk = part->startblk + part->blknum; } memset(&pi,0xFF,sizeof(pi)); memset(&lastest_part, 0, PART_MAX_COUNT * sizeof(pt_resident)); retval = load_pt_from_fixed_addr((u8 *)&lastest_part, dev); if (retval == ERR_NO_EXIST) { //first run preloader before dowload //and valid mirror last download or first download printf("no pt \n"); get_part_tab_from_complier(); //get from complier } else { printf("Find pt \n"); for (i = 0; i < PART_MAX_COUNT; i++) { if (lastest_part[i].size == 0) { lastest_part[i].size = target_get_max_flash_size() - lastest_part[i].offset - partition_reserve_size(); printf("partition %s size %016llx %016llx \n",lastest_part[i].name,lastest_part[i].offset,lastest_part[i].size); break; } if (!strcmp((char *)lastest_part[i].name, PMT_END_NAME)) { lastest_part[i].size = target_get_max_flash_size() - lastest_part[i].offset - partition_reserve_size(); printf("partition %s size %016llx %016llx \n",lastest_part[i].name,lastest_part[i].offset,lastest_part[i].size); break; } printf ("partition %s size %016llx %016llx \n",lastest_part[i].name,lastest_part[i].offset,lastest_part[i].size); } } #else part_t *part = &partition_layout[0]; unsigned long lastblk; int retval=0; int i=0; printf ("mt6577_part_init_pmt \n"); if (!totalblks) return; /* updater the number of blks of first part. */ if (totalblks <= part->blknum) part->blknum = totalblks; totalblks -= part->blknum; if(part->type == TYPE_LOW) lastblk = part->startblk + part->blknum*2; else lastblk = part->startblk + part->blknum; while(totalblks) { part++; if (!part->name) break; if (part->flags & PART_FLAG_LEFT || totalblks <= part->blknum) part->blknum = totalblks; part->startblk = lastblk; totalblks -= part->blknum; if(part->type == TYPE_LOW) lastblk = part->startblk + part->blknum*2; else lastblk = part->startblk + part->blknum; } memset(&pi,0xFF,sizeof(pi)); memset(&lastest_part,0,PART_MAX_COUNT*sizeof(pt_resident)); retval=load_exist_part_tab((u8 *)&lastest_part,dev); if (retval==ERR_NO_EXIST) //first run preloader before dowload { //and valid mirror last download or first download printf ("no pt \n"); get_part_tab_from_complier(); //get from complier } else { printf ("Find pt \n"); for(i=0;i<PART_MAX_COUNT;i++) { //printf("%s, %x\n",lastest_part[i].name,lastest_part[i].size); if(lastest_part[i].size == 0){ lastest_part[i].size = total_size - lastest_part[i].offset; printf ("partition %s size %lx %lx \n",lastest_part[i].name,lastest_part[i].offset,lastest_part[i].size); break; } printf ("partition @ %x %s size %lx %lx \n",&lastest_part[i],lastest_part[i].name,lastest_part[i].offset,lastest_part[i].size); } } init_pmt_done = TRUE; #endif }