00001 #include <stdlib.h> 00002 #include "types.h" 00003 #include "debug.h" 00004 #include "nand.h" 00005 00006 #define MAP_INVALID -1 00007 00008 /* 00009 * simple page map table with all mapping in memory 00010 */ 00011 static struct pagemap { 00012 unsigned int nr_page; 00013 _u32 *table; 00014 } pagemap; 00015 00016 /* 00017 * logical page number -> physical page number 00018 * lpa: logical page number 00019 * return physical page number on map 00020 */ 00021 _u32 map_find(_u32 lpa) 00022 { 00023 if(lpa<0 || lpa>pagemap.nr_page) return -1; 00024 return pagemap.table[lpa]; 00025 } 00026 00027 /* 00028 * set physical page number for logical page number 00029 * lpa: logical page number 00030 * ppa: physical page number to save on map 00031 */ 00032 void map_update(_u32 lpa, _u32 ppa) 00033 { 00034 if(lpa<0 || lpa>pagemap.nr_page) return; 00035 00036 pagemap.table[lpa] = ppa; 00037 } 00038 00039 void map_gc(_u32 victim, _u8 *bitmap) 00040 { 00041 } 00042 00043 /* 00044 * deallocate data structure 00045 */ 00046 void map_end() 00047 { 00048 free(pagemap.table); 00049 pagemap.table = NULL; 00050 } 00051 00052 /* 00053 * allocate data structure 00054 */ 00055 void map_init() 00056 { 00057 pagemap.nr_page = config_nand.page_per_blk 00058 * (config_nand.numblks - config_nand.extrablks); 00059 pagemap.table = malloc(sizeof(_u32) * pagemap.nr_page); 00060 }