sdk-hwV1.3/lichee/linux-4.9/modules/nand/common1/phy-nand/spinand/spinand.c

161 lines
4.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#include "spinand.h"
#include "../../nfd/nand_osal_for_linux.h"
#include "../nand_boot.h"
#include "../nand_physic_interface.h"
#include "../nand_secure_storage.h"
#include "spinand_debug.h"
#include <linux/mtd/aw-spinand-nftl.h>
spinand_storage_info_t spinand_storage_info;
void spinand_get_phy_storage_info(void)
{
spinand_storage_info.ChipCnt = (__u8)spinand_nftl_get_chip_cnt();
spinand_storage_info.ChipConnectInfo = 0x01; /*now only support one chip*/
spinand_storage_info.ConnectMode = 0x01;
spinand_storage_info.BankCntPerChip = 1;
spinand_storage_info.DieCntPerChip = (__u8)spinand_nftl_get_die_cnt();
spinand_storage_info.PlaneCntPerDie = spinand_nftl_get_multi_plane_flag() ? 2 : 1;
spinand_storage_info.SectorCntPerPage = (__u8)spinand_nftl_get_single_page_size(SECTOR);
spinand_storage_info.PageCntPerPhyBlk = (__u16)spinand_nftl_get_single_block_size(PAGE);
spinand_storage_info.BlkCntPerDie = spinand_nftl_get_die_size(BLOCK);
spinand_storage_info.OperationOpt = spinand_nftl_get_operation_opt();
spinand_nftl_get_chip_id(spinand_storage_info.NandChipId);
spinand_storage_info.MaxEraseTimes = spinand_nftl_get_max_erase_times();
}
unsigned int spinand_get_arch_info_str(char *buf)
{
__s32 ret = 0;
u32 id = (spinand_storage_info.NandChipId[0] << 0) |
(spinand_storage_info.NandChipId[1] << 8) |
(spinand_storage_info.NandChipId[2] << 16) |
(spinand_storage_info.NandChipId[3] << 24);
u32 size = SECTOR_SIZE * spinand_storage_info.SectorCntPerPage *
spinand_storage_info.PageCntPerPhyBlk *
spinand_storage_info.BlkCntPerDie * spinand_storage_info.DieCntPerChip *
spinand_storage_info.ChipCnt / 1024 / 1024;
ret += sprintf(buf + ret, "NandID: 0x%x\n", id);
ret += sprintf(buf + ret, "Size: %dM\n", size);
ret += sprintf(buf + ret, "DieCntPerChip: %d\n",
spinand_storage_info.DieCntPerChip);
ret += sprintf(buf + ret, "SectCntPerPage: %d\n",
spinand_storage_info.SectorCntPerPage);
ret += sprintf(buf + ret, "PageCntPerBlk: %d\n",
spinand_storage_info.PageCntPerPhyBlk);
ret += sprintf(buf + ret, "BlkCntPerDie: %d\n",
spinand_storage_info.BlkCntPerDie);
ret += sprintf(buf + ret, "OperationOpt: 0x%x\n",
spinand_storage_info.OperationOpt);
return ret;
}
/**
* @spinand_nftl_get_lsb_page_cnt_per_block(void)
*
* @Returns the lsb page count in per block.
*/
unsigned int spinand_lsb_page_cnt_per_block(void)
{
/*spi nand have no lsb/msb page at present*/
return 0;
}
/**
* @spinand_get_page_num(unsigned int lsb_page_no)
*
* @Returns the lsb page num.
*/
unsigned int spinand_get_page_num(unsigned int lsb_page_no)
{
return lsb_page_no;
}
void spinand_get_nand_info(struct _nand_info *aw_nand_info)
{
//memset(aw_nand_info, 0x0, sizeof(struct _nand_info));
aw_nand_info->type = 2; //NAND_STORAGE_TYPE_SPINAND;
aw_nand_info->SectorNumsPerPage = (unsigned short)spinand_nftl_get_super_page_size(SECTOR);
aw_nand_info->BytesUserData = AW_NFTL_OOB_LEN;
//LogicArchiPar.LogicBlkCntPerLogicDie;
aw_nand_info->BlkPerChip = (unsigned short)spinand_nftl_get_chip_size(BLOCK);
//LogicArchiPar.LogicDieCnt;
aw_nand_info->ChipNum = (unsigned short)spinand_nftl_get_die_cnt();
//LogicArchiPar.PageCntPerLogicBlk;
aw_nand_info->PageNumsPerBlk = (unsigned short)spinand_nftl_get_super_block_size(PAGE);
aw_nand_info->FullBitmap = SPINAND_FULL_BITMAP_OF_SUPER_PAGE;
aw_nand_info->MaxBlkEraseTimes = spinand_nftl_get_max_erase_times();
if (SPINAND_SUPPORT_READ_RECLAIM)
aw_nand_info->EnableReadReclaim = 1;
else
aw_nand_info->EnableReadReclaim = 0;
aw_nand_info->boot = phyinfo_buf;
if (aw_nand_info->boot->physic_block_reserved == 0)
aw_nand_info->boot->physic_block_reserved = PHYSIC_RECV_BLOCK;
/*get uboot physical domain into aw_nand_info */
set_uboot_start_and_end_block();
return;
}
/*
*void spinand_pr_version(void)
*{
* int ver[4] = {0};
* nand_get_drv_version(&ver[0], &ver[1], &ver[2], &ver[3]);
* spinand_print("kernel: version: %x %x %x %x\n",
* ver[0], ver[1], ver[2], ver[3]);
*}
*/
/*
* spinand_hardware_init - spinand hardware init in aw_spinand_probe,
* which in where /drivers/mtd/aw-spinand/sunxi-nftl-core.c ;here only
* to do 1@get boot info,2@get nand info,3@secure_storage_init
*
* returns: nand_info success; NULL fail
*/
struct _nand_info *spinand_hardware_init(void)
{
__s32 ret = 0;
SPINAND_INFO("%s: Start to get nand info and boot inf\n", __func__);
/*spinand_pr_version();*/
/*get boot info*/
nand_physic_info_read();
/*get nand_info*/
spinand_get_nand_info(&aw_nand_info);
/*get physic storage info*/
spinand_get_phy_storage_info();
nand_secure_storage_init(1);
if (ret < 0)
SPINAND_ERR("%s: End Nand Hardware initializing ..... FAIL!\n", __func__);
else
SPINAND_INFO("%s: End Nand Hardware initializing ..... OK!\n", __func__);
return (ret < 0) ? (struct _nand_info *)NULL : &aw_nand_info;
}
__s32 spinand_hardware_exit(void)
{
//PHY_Exit();
return 0;
}