/***************************************************************************** *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; }
/***************************************************************************** *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; }