int init_pmt(void)
{
	int ret = 0;
    int i = 0;

    printk("[%s]start\n", __func__);
    ret = init_region_info();

	if (pmt_done) {
		printk("pmt has been initialised, so skip\n");
		return 0;
	}

    //init region info to get user region size.
	lastest_part = kmalloc(PART_MAX_COUNT * sizeof(pt_resident), GFP_KERNEL);
	if (!lastest_part) {
		ret = -ENOMEM;
		printk("init_pmt: malloc lastest_part fail\n");
		goto fail_malloc;
	}

    memset(lastest_part,0, PART_MAX_COUNT * sizeof(pt_resident));
    memset(&pi,0,sizeof(pt_info));

    ret = load_pt_from_fixed_addr((u8 *)lastest_part);
    if (ret != DM_ERR_OK) { 
        //and valid mirror last download or first download 
       printk("can not find pmt,use default part info\n");
    } else {
       printk("find pt\n");
       for (i = 0; i < PART_MAX_COUNT; i++) {  
	   		if ((lastest_part[i].name[0] == 0x00) || (lastest_part[i].name[0] == 0xff))
				break;
            printk("part %s size %llx %llx\n", lastest_part[i].name, 
                lastest_part[i].offset, lastest_part[i].size);
			PartInfo[i].start_address = lastest_part[i].offset;
			PartInfo[i].size= lastest_part[i].size;
		    /*	if(lastest_part[i].size == 0)
				break;*/
        }
        printk("find pt %d\n",i);
    }
    printk("[%s]done\n", __func__);

	pmt_done = 1;
	ret = 0;
fail_malloc: 
	return ret;

}
Exemple #2
0
void pmt_init(void)
{
#ifdef MTK_EMMC_SUPPORT
	int ret = 0;
    int i = 0;

	memset(&new_part, 0, PART_MAX_COUNT * sizeof (pt_resident));
	memset(&lastest_part, 0, PART_MAX_COUNT * sizeof (pt_resident));
	ret = load_pt_from_fixed_addr((u8 *)&lastest_part);
    if (ret == ERR_NO_EXIST) {
        //first run preloader before dowload
		//and valid mirror last download or first download
		get_part_tab_from_complier();	//get from complier
	} else {
		print("find pt\n");
		for (i = 0; i < PART_MAX_COUNT; i++) {
			if (lastest_part[i].size == 0)
				break;
			print("part %s size %llx %llx\n", lastest_part[i].name,
				  lastest_part[i].offset, lastest_part[i].size);
		}
	}
#else
    int ret = 0;
    int i = 0;

    memset(&new_part,0, PART_MAX_COUNT * sizeof(pt_resident));
    memset(&lastest_part,0, PART_MAX_COUNT * sizeof(pt_resident));

    ret = load_exist_part_tab((u8 *)&lastest_part);
    if (ret == ERR_NO_EXIST) { //first run preloader before dowload
        //and valid mirror last download or first download
        get_part_tab_from_complier(); //get from complier
    } else {
        print("find pt\n");
        for (i = 0; i < PART_MAX_COUNT; i++) {
			if(lastest_part[i].size == 0)
				break;
            print("part %s size %x %x\n", lastest_part[i].name,
                lastest_part[i].offset, lastest_part[i].size);
        }
    }
	init_pmt_done = TRUE;
 #endif
}
Exemple #3
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
}