230 lines
7.0 KiB
C
230 lines
7.0 KiB
C
|
|
||
|
#define _NAND_CLASS_C_
|
||
|
|
||
|
#include "nand_blk.h"
|
||
|
#include "nand_dev.h"
|
||
|
|
||
|
|
||
|
extern int debug_data;
|
||
|
|
||
|
extern uint32 gc_all(void *zone);
|
||
|
extern uint32 gc_one(void *zone);
|
||
|
extern uint32 prio_gc_one(void *zone, uint16 block, uint32 flag);
|
||
|
extern void print_nftl_zone(void *zone);
|
||
|
extern void print_free_list(void *zone);
|
||
|
extern void print_smart(void *zone);
|
||
|
extern void print_block_invalid_list(void *zone);
|
||
|
extern void print_logic_page_map(void *_zone, uint32 num);
|
||
|
extern uint32 nftl_set_zone_test(void *_zone, uint32 num);
|
||
|
extern uint32 NandHw_DbgInfo(uint32 type);
|
||
|
extern int nand_dbg_phy_read(unsigned short nDieNum, unsigned short nBlkNum, unsigned short nPage);
|
||
|
extern int nand_dbg_zone_phy_read(void *zone, uint16 block, uint16 page);
|
||
|
extern int nand_dbg_zone_erase(void *zone, uint16 block, uint16 erase_num);
|
||
|
extern int nand_dbg_zone_phy_write(void *zone, uint16 block, uint16 page);
|
||
|
extern int nand_dbg_phy_write(unsigned short nDieNum, unsigned short nBlkNum, unsigned short nPage);
|
||
|
extern int nand_dbg_phy_erase(unsigned short nDieNum, unsigned short nBlkNum);
|
||
|
|
||
|
static ssize_t nand_test_store(struct kobject *kobject, struct attribute *attr, const char *buf, size_t count);
|
||
|
static ssize_t nand_test_show(struct kobject *kobject, struct attribute *attr, char *buf);
|
||
|
void obj_test_release(struct kobject *kobject);
|
||
|
|
||
|
int g_iShowVar = -1;
|
||
|
|
||
|
struct attribute prompt_attr = {
|
||
|
.name = "nand_debug",
|
||
|
/*.mode = S_IRWXUGO*/
|
||
|
.mode = 0644
|
||
|
};
|
||
|
|
||
|
static struct attribute *def_attrs[] = {
|
||
|
&prompt_attr,
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
|
||
|
struct sysfs_ops obj_test_sysops = {
|
||
|
.show = nand_test_show,
|
||
|
.store = nand_test_store
|
||
|
};
|
||
|
|
||
|
struct kobj_type ktype = {
|
||
|
.release = obj_test_release,
|
||
|
.sysfs_ops = &obj_test_sysops,
|
||
|
.default_attrs = def_attrs
|
||
|
};
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*Name :
|
||
|
*Description :
|
||
|
*Parameter :
|
||
|
*Return :
|
||
|
*Note :
|
||
|
*****************************************************************************/
|
||
|
void obj_test_release(struct kobject *kobject)
|
||
|
{
|
||
|
nand_dbg_err("release");
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*Name :
|
||
|
*Description :
|
||
|
*Parameter :
|
||
|
*Return :
|
||
|
*Note :
|
||
|
*****************************************************************************/
|
||
|
static ssize_t nand_test_show(struct kobject *kobject, struct attribute *attr, char *buf)
|
||
|
{
|
||
|
ssize_t count = 0;
|
||
|
struct nand_kobject *nand_kobj;
|
||
|
|
||
|
nand_kobj = (struct nand_kobject *)kobject;
|
||
|
|
||
|
print_nftl_zone(nand_kobj->nftl_blk->nftl_zone);
|
||
|
|
||
|
count = sprintf(buf, "%i", g_iShowVar);
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*Name :
|
||
|
*Description :receive testcase num from echo command
|
||
|
*Parameter :
|
||
|
*Return :
|
||
|
*Note :
|
||
|
*****************************************************************************/
|
||
|
static ssize_t nand_test_store(struct kobject *kobject, struct attribute *attr, const char *buf, size_t count)
|
||
|
{
|
||
|
int ret;
|
||
|
int argnum = 0;
|
||
|
char cmd[32] = {0};
|
||
|
unsigned int param0 = 0;
|
||
|
unsigned int param1 = 0;
|
||
|
unsigned int param2 = 0;
|
||
|
|
||
|
struct nand_kobject *nand_kobj;
|
||
|
nand_kobj = (struct nand_kobject *)kobject;
|
||
|
|
||
|
g_iShowVar = -1;
|
||
|
|
||
|
argnum = sscanf(buf, "%s %u %u %u ", cmd, ¶m0, ¶m1, ¶m2);
|
||
|
nand_dbg_err("argnum=%i, cmd=%s, param0=%u, param1=%u, param2=%u\n", argnum, cmd, param0, param1, param2);
|
||
|
|
||
|
if (-1 == argnum) {
|
||
|
nand_dbg_err("cmd format err!");
|
||
|
g_iShowVar = -3;
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
if (strcmp(cmd, "help") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" 2013-10-24 19:48 \n");
|
||
|
} else if (strcmp(cmd, "flush") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" flush \n");
|
||
|
mutex_lock(nand_kobj->nftl_blk->blk_lock);
|
||
|
ret = nand_kobj->nftl_blk->flush_write_cache(nand_kobj->nftl_blk, param0);
|
||
|
mutex_unlock(nand_kobj->nftl_blk->blk_lock);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "gcall") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" gcall \n");
|
||
|
mutex_lock(nand_kobj->nftl_blk->blk_lock);
|
||
|
ret = gc_all(nand_kobj->nftl_blk->nftl_zone);
|
||
|
mutex_unlock(nand_kobj->nftl_blk->blk_lock);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "gcone") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" gcone \n");
|
||
|
mutex_lock(nand_kobj->nftl_blk->blk_lock);
|
||
|
ret = gc_one(nand_kobj->nftl_blk->nftl_zone);
|
||
|
mutex_unlock(nand_kobj->nftl_blk->blk_lock);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "priogc") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" priogc \n");
|
||
|
mutex_lock(nand_kobj->nftl_blk->blk_lock);
|
||
|
ret = prio_gc_one(nand_kobj->nftl_blk->nftl_zone, param0, param1);
|
||
|
mutex_unlock(nand_kobj->nftl_blk->blk_lock);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "test") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" test \n");
|
||
|
mutex_lock(nand_kobj->nftl_blk->blk_lock);
|
||
|
ret = nftl_set_zone_test((void *)nand_kobj->nftl_blk->nftl_zone, param0);
|
||
|
mutex_unlock(nand_kobj->nftl_blk->blk_lock);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "showall") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" show all \n");
|
||
|
print_free_list(nand_kobj->nftl_blk->nftl_zone);
|
||
|
print_block_invalid_list(nand_kobj->nftl_blk->nftl_zone);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "showinfo") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" show info \n");
|
||
|
print_nftl_zone(nand_kobj->nftl_blk->nftl_zone);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "blkdebug") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err(" blk debug \n");
|
||
|
debug_data = param0;
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "smart") == 0) {
|
||
|
nand_dbg_err("nand debug cmd:\n");
|
||
|
nand_dbg_err("smart info\n");
|
||
|
print_smart(nand_kobj->nftl_blk->nftl_zone);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
} else if (strcmp(cmd, "version") == 0) {
|
||
|
nand_dbg_err("nand version cmd:\n");
|
||
|
nand_dbg_err(" version \n");
|
||
|
NandHw_DbgInfo(0);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "read1") == 0) {
|
||
|
nand_dbg_err("nand read1 cmd:\n");
|
||
|
nand_dbg_phy_read(param0, param1, param2);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "read2") == 0) {
|
||
|
nand_dbg_err("nand read2 cmd:\n");
|
||
|
nand_dbg_zone_phy_read(nand_kobj->nftl_blk->nftl_zone, param0, param1);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "erase1") == 0) {
|
||
|
nand_dbg_err("nand erase1 cmd:\n");
|
||
|
nand_dbg_phy_erase(param0, param1);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "erase2") == 0) {
|
||
|
nand_dbg_err("nand erase2 cmd:\n");
|
||
|
nand_dbg_zone_erase(nand_kobj->nftl_blk->nftl_zone, param0, param1);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "write1") == 0) {
|
||
|
nand_dbg_err("nand read1 cmd:\n");
|
||
|
nand_dbg_phy_write(param0, param1, param2);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else if (strcmp(cmd, "write2") == 0) {
|
||
|
nand_dbg_err("nand read2 cmd:\n");
|
||
|
nand_dbg_zone_phy_write(nand_kobj->nftl_blk->nftl_zone, param0, param1);
|
||
|
goto NAND_TEST_STORE_EXIT;
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
nand_dbg_err("err, nand debug undefined cmd: %s\n", cmd);
|
||
|
}
|
||
|
|
||
|
NAND_TEST_STORE_EXIT:
|
||
|
return count;
|
||
|
}
|