예제 #1
0
/*****************************************************************************
*Name         :
*Description  :
*Parameter    :
*Return       :
*Note         :
*****************************************************************************/
int aml_nftl_initialize(struct aml_nftl_blk_t *aml_nftl_blk,int no)
{
	struct mtd_info *mtd = aml_nftl_blk->mbd.mtd;
	int error = 0;
	uint32_t ret;
	unsigned char nftl_oob_buf[mtd->oobavail];

	//if (mtd->oobavail < MIN_BYTES_OF_USER_PER_PAGE)
	//	return -EPERM;

	aml_nftl_blk->nftl_cfg.nftl_use_cache = NFTL_DONT_CACHE_DATA;
	aml_nftl_blk->nftl_cfg.nftl_support_gc_read_reclaim = SUPPORT_GC_READ_RECLAIM;
	aml_nftl_blk->nftl_cfg.nftl_support_wear_leveling = SUPPORT_WEAR_LEVELING;
	aml_nftl_blk->nftl_cfg.nftl_support_fill_block = SUPPORT_FILL_BLOCK;
	aml_nftl_blk->nftl_cfg.nftl_need_erase = NFTL_ERASE;
	aml_nftl_blk->nftl_cfg.nftl_part_reserved_block_ratio = PART_RESERVED_BLOCK_RATIO;
	aml_nftl_blk->nftl_cfg.nftl_min_free_block_num = MIN_FREE_BLOCK_NUM;
	aml_nftl_blk->nftl_cfg.nftl_min_free_block = MIN_FREE_BLOCK;
	aml_nftl_blk->nftl_cfg.nftl_gc_threshold_free_block_num = GC_THRESHOLD_FREE_BLOCK_NUM ;
	aml_nftl_blk->nftl_cfg.nftl_gc_threshold_ratio_numerator = GC_THRESHOLD_RATIO_NUMERATOR;
	aml_nftl_blk->nftl_cfg.nftl_gc_threshold_ratio_denominator = GC_THRESHOLD_RATIO_DENOMINATOR;
	aml_nftl_blk->nftl_cfg.nftl_max_cache_write_num = MAX_CACHE_WRITE_NUM;

	ret = aml_nftl_start((void*)aml_nftl_blk,&aml_nftl_blk->nftl_cfg,&aml_nftl_blk->aml_nftl_part,mtd->size,mtd->erasesize,mtd->writesize,mtd->oobavail,mtd->name,no,0);
	if(ret != 0)
	    return ret;

	aml_nftl_blk->mbd.size = aml_nftl_get_part_cap(aml_nftl_blk->aml_nftl_part);
	//aml_nftl_blk->read_data = _nand_read;
	//aml_nftl_blk->write_data = _nand_write;
	aml_nftl_blk->flush_write_cache = _nand_flush_write_cache;
	aml_nftl_blk->shutdown_op = _shutdown_op;

	if(no < 0){
	    return ret;
	}
    //setup class
    if(memcmp(mtd->name, "NFTL_Part", 9)==0)
    {
		aml_nftl_blk->debug.name = kzalloc(strlen((const char*)AML_NFTL_MAGIC)+1, GFP_KERNEL);
	strcpy(aml_nftl_blk->debug.name, (char*)AML_NFTL_MAGIC);
	aml_nftl_blk->debug.class_attrs = nftl_class_attrs;
		error = aml_class_register(&aml_nftl_blk->debug);
		if(error)
			printk(" class register nand_class fail!\n");
	}

	if(memcmp(mtd->name, "userdata", 8)==0)
    {
		aml_nftl_blk->debug.name = kzalloc(strlen((const char*)AML_USERDATA_MAGIC)+1, GFP_KERNEL);
	strcpy(aml_nftl_blk->debug.name, (char*)AML_USERDATA_MAGIC);
	aml_nftl_blk->debug.class_attrs = nftl_class_attrs;
		error = aml_class_register(&aml_nftl_blk->debug);
		if(error)
			printk(" class register nand_class fail!\n");
	}

	return 0;
}
예제 #2
0
/*****************************************************************************
*Name         :
*Description  :
*Parameter    :
*Return       :
*Note         :
*****************************************************************************/
int aml_nftl_initialize(struct aml_nftl_dev *nftl_dev,int no)
{
	struct ntd_info *ntd = nftl_dev->ntd;
	int error = 0;

	//uint32_t phys_erase_shift;
	uint32_t ret;

	if (ntd->oobsize < MIN_BYTES_OF_USER_PER_PAGE)
		return -EPERM;

	nftl_dev->nftl_cfg.nftl_use_cache = NFTL_DONT_CACHE_DATA;
	nftl_dev->nftl_cfg.nftl_support_gc_read_reclaim = SUPPORT_GC_READ_RECLAIM;
	nftl_dev->nftl_cfg.nftl_support_wear_leveling = SUPPORT_WEAR_LEVELING;
	nftl_dev->nftl_cfg.nftl_need_erase = NFTL_ERASE;
	if(!is_phydev_off_adjust()){
		nftl_dev->nftl_cfg.nftl_part_reserved_block_ratio = 8;
	}else{
		nftl_dev->nftl_cfg.nftl_part_reserved_block_ratio = 10;
	}
	nftl_dev->nftl_cfg.nftl_part_adjust_block_num = get_adjust_block_num();
	printk("adjust_block_num : %d,reserved_block_ratio %d\n",nftl_dev->nftl_cfg.nftl_part_adjust_block_num,nftl_dev->nftl_cfg.nftl_part_reserved_block_ratio);
	nftl_dev->nftl_cfg.nftl_min_free_block_num = MIN_FREE_BLOCK_NUM;
	nftl_dev->nftl_cfg.nftl_min_free_block = MIN_FREE_BLOCK;
	nftl_dev->nftl_cfg.nftl_gc_threshold_free_block_num = GC_THRESHOLD_FREE_BLOCK_NUM ;
	nftl_dev->nftl_cfg.nftl_gc_threshold_ratio_numerator = GC_THRESHOLD_RATIO_NUMERATOR;
	nftl_dev->nftl_cfg.nftl_gc_threshold_ratio_denominator = GC_THRESHOLD_RATIO_DENOMINATOR;
	nftl_dev->nftl_cfg.nftl_max_cache_write_num = MAX_CACHE_WRITE_NUM;

	ret = aml_nftl_start((void*)nftl_dev,&nftl_dev->nftl_cfg,&nftl_dev->aml_nftl_part,ntd->size,ntd->blocksize,ntd->pagesize,ntd->oobsize,ntd->name,no,0,nftl_dev->init_flag);
	if(ret != 0)
	{
        //if(memcmp(ntd->name, "nfcache", 7)==0)
        {
            if(nftl_dev->init_flag == 0)
            {
                aml_nftl_set_status(nftl_dev->aml_nftl_part,1);
            }
	   // return ret;
        }
	}
	nftl_dev->size = aml_nftl_get_part_cap(nftl_dev->aml_nftl_part);
	nftl_dev->read_data = _nand_read;
	nftl_dev->write_data = _nand_write;
    nftl_dev->discard_data = _nand_discard;
	nftl_dev->flush_write_cache = _nand_flush_write_cache;
    nftl_dev->flush_discard_cache = _nand_flush_discard_cache;
    nftl_dev->write_pair_page = _nand_write_pair_page;
    nftl_dev->check_mapping = _check_mapping;
    nftl_dev->discard_partition = _discard_partition;
	if(no < 0){
		return ret; // for erase init FTL part
	}

    //setup class
    if(memcmp(ntd->name, "nfcode", 6)==0)
    {
		nftl_dev->debug.name = kzalloc(strlen((const char*)AML_NFTL1_MAGIC)+1, GFP_KERNEL);
	strcpy((char *)nftl_dev->debug.name, (char*)AML_NFTL1_MAGIC);
	nftl_dev->debug.class_attrs = nftl_class_attrs;
		error = amlnf_class_register(&nftl_dev->debug);
		if(error)
			printk(" class register nand_class fail!\n");
	}

	if(memcmp(ntd->name, "nfdata", 6)==0)
    {
		nftl_dev->debug.name = kzalloc(strlen((const char*)AML_NFTL2_MAGIC)+1, GFP_KERNEL);
	strcpy((char *)nftl_dev->debug.name, (char*)AML_NFTL2_MAGIC);
	nftl_dev->debug.class_attrs = nftl_class_attrs;
		error = amlnf_class_register(&nftl_dev->debug);
		if(error)
			printk(" class register nand_class fail!\n");
	}

	return 0;
}