Go to the documentation of this file.00001 #include "types.h"
00002 #include "debug.h"
00003 #include "nand.h"
00004 #include "stat.h"
00005 #include "vmbitmap.h"
00006 #include "map.h"
00007 #include "ftl.h"
00008
00009
00010
00011
00012
00013
00014
00015 _t_size ftl_read(_t_sect lsn, _t_size size) {
00016 _t_size read_size;
00017 _t_sect read_lsn;
00018 _u32 lpa = LPA_F_SECT(lsn), ppa;
00019
00020 ppa = map_find(lpa);
00021 assert(ppa!=-1);
00022
00023 read_lsn = LSN_F_LPA(lpa);
00024 read_size = config_nand.sect_per_page - (lsn - read_lsn);
00025
00026 nand_page_read(BLK_F_PA(ppa), PN_F_PA(ppa), read_lsn, NAND_REQ_DATA);
00027
00028 return read_size;
00029 }
00030
00031
00032
00033
00034
00035
00036
00037 _t_size ftl_write(_t_sect lsn, _t_size size) {
00038 _t_size write_size;
00039 _t_sect write_lsn;
00040 _t_blk pbn;
00041 _t_page ppn;
00042 _u32 lpa = LPA_F_SECT(lsn), ppa;
00043
00044
00045 ppa = map_find(lpa);
00046 assert(ppa!=-1);
00047
00048 write_lsn = LSN_F_LPA(lpa);
00049
00050
00051 if(ppa!=-1 && (write_lsn != lsn || size<config_nand.sect_per_page)) {
00052 nand_page_read(BLK_F_PA(ppa), PN_F_PA(ppa), write_lsn, NAND_REQ_DATA);
00053 }
00054
00055
00056 pbn = (_t_blk)BLK_F_PA(ppa);
00057 vm_alloc_page(write_lsn, &pbn, &ppn, NAND_REQ_DATA);
00058
00059 nand_page_write(pbn, ppn, write_lsn, NAND_REQ_DATA);
00060
00061
00062 vm_invalidate(BLK_F_PA(ppa), PN_F_PA(ppa), 1);
00063
00064
00065 map_update(lpa, MAKE_PA(pbn, ppn));
00066
00067
00068 vm_gc_start();
00069
00070 write_size = config_nand.sect_per_page - (lsn - write_lsn);
00071
00072 return write_size;
00073 }
00074
00075
00076
00077
00078
00079 static void warm_all(_u32 blknum) {
00080 int write_size = blknum*config_nand.page_per_blk*config_nand.sect_per_page;
00081 int lsn = 0;
00082 _t_blk pbn;
00083 _t_page ppn;
00084 _u32 lpa;
00085
00086 while(write_size) {
00087 lpa=LPA_F_SECT(lsn);
00088 vm_alloc_page(lsn, &pbn, &ppn, NAND_REQ_WARM);
00089 nand_page_write(pbn, ppn, lsn, NAND_REQ_WARM);
00090 map_update(lpa, MAKE_PA(pbn, ppn));
00091
00092 lsn+=config_nand.sect_per_page;
00093 write_size-=config_nand.sect_per_page;
00094 }
00095
00096 }
00097
00098
00099
00100
00101
00102 void ftl_close() {
00103 map_end();
00104 vm_end();
00105 bitmap_s_end();
00106 }
00107
00108
00109
00110
00111
00112 int ftl_open() {
00113
00114 bitmap_s_init();
00115 vm_init();
00116
00117 map_init();
00118
00119 warm_all(config_nand.numblks - config_nand.extrablks);
00120
00121 printf("FTLSIMPLE initialized (total block: %d, extra: %d)\n", config_nand.numblks, config_nand.extrablks);
00122 printf("\n");
00123
00124 return 0;
00125
00126 }
00127