def __init__(self, nand): self.nand = nand #XXX check self.banks_total = nand.nCEs * nand.banks_per_ce_physical self.num_ce = nand.nCEs self.banks_per_ce = nand.banks_per_ce_physical self.blocks_per_ce = nand.blocksPerCE self.pages_per_block = nand.pagesPerBlock self.pages_per_block_2 = next_power_of_two(self.pages_per_block) self.pages_per_sublk = self.pages_per_block * self.banks_per_ce * self.num_ce self.blocks_per_bank = self.blocks_per_ce / self.banks_per_ce self.blocks_per_bank_vfl = self.blocks_per_ce / self.banks_per_ce self.vendorType = nand.vendorType self.fs_start_block = 5 #field_4 = 5; if not SupportedDevices.has_key(nand.deviceReadId): raise Exception("VFL: unsupported device 0x%x" % nand.deviceReadId) userSuBlksTotal = self.userSuBlksTotal = SupportedDevices[nand.deviceReadId][8]#7744 userPagesTotal = userSuBlksTotal * self.pages_per_sublk suBlksTotal = self.blocks_per_ce FTLData_field_2 = suBlksTotal - userSuBlksTotal - 28 print suBlksTotal, userSuBlksTotal, FTLData_field_2 FTLData_field_4 = FTLData_field_2 + 5 self.FTLData_field_4 = FTLData_field_4 #FTLData_sysSuBlks = FTLData_field_2 + 4 #FTLData_field_6 = 3 #FTLData_field_8 = 23 self.vflContexts = [] self.bbt = [] self.current_version = 0 self.context = None reserved_blocks = 0 fs_start_block = reserved_blocks+10 #XXX for ce in xrange(self.num_ce): for b in xrange(reserved_blocks, fs_start_block): s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d: continue vflctx = _vfl_vfl_context.parse(d) if not vfl_check_checksum(vflctx, _vfl_vfl_context): vflctx = None continue break MostRecentVFLCxtBlock = -1 minUsn = 0xFFFFFFFF for b in vflctx.vfl_context_block: s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d: continue if s.foo.meta.usnDec > 0 and s.foo.meta.usnDec <= minUsn: minUsn = s.foo.meta.usnDec; MostRecentVFLCxtBlock = b if MostRecentVFLCxtBlock == -1: print "MostRecentVFLCxtBlock == -1" return last = None for pageNum in xrange(0, self.pages_per_block, 1): s,d = nand.readMetaPage(ce, MostRecentVFLCxtBlock, pageNum, _vfl_vsvfl_spare_data) if not d: break vflctx = _vfl_vfl_context.parse(d) if vfl_check_checksum(vflctx, _vfl_vfl_context): last = vflctx if not last: raise Exception("VFL open FAIL 1") self.vflContexts.append(last) if last.version == 1 and last.usn_inc >= self.current_version: self.current_version = last.usn_inc self.context = last if not self.context: raise Exception("VFL open FAIL") print "VFL context open OK"
def __init__(self, nand): self.nand = nand self.banks_per_ce_vfl = 1 if self.nand.vendorType in [0x100010, 0x100014, 0x120014, 0x150011]: self.banks_per_ce_vfl = 2 self.banks_total = nand.nCEs * self.banks_per_ce_vfl self.num_ce = nand.nCEs self.banks_per_ce = nand.banks_per_ce_physical self.blocks_per_ce = nand.blocksPerCE self.pages_per_block = nand.pagesPerBlock self.pages_per_block_2 = next_power_of_two(self.pages_per_block) self.pages_per_sublk = self.pages_per_block * self.banks_per_ce_vfl * self.num_ce self.blocks_per_bank = self.blocks_per_ce / self.banks_per_ce self.blocks_per_bank_vfl = self.blocks_per_ce / self.banks_per_ce_vfl self.vendorType = nand.vendorType if self.vendorType == 0x10001: self.virtual_to_physical = self.virtual_to_physical_10001 elif self.vendorType == 0x150011: self.virtual_to_physical = self.virtual_to_physical_100014 elif self.vendorType in [0x100010, 0x100014, 0x120014]: self.virtual_to_physical = self.virtual_to_physical_150011 else: raise Exception("VSVFL: unsupported vendor 0x%x" % self.vendorType) self.bank_address_space = nand.bank_address_space self.vflContexts = [] self.bbt = [] self.current_version = 0 reserved_blocks = 0 if self.nand.bfn: reserved_blocks = 16 fs_start_block = reserved_blocks + 16 #XXX for ce in xrange(self.num_ce): vflctx = None for b in xrange(reserved_blocks, fs_start_block): s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d: continue vflctx = _vfl_vsvfl_context.parse(d) if not vfl_check_checksum(vflctx, _vfl_vsvfl_context): vflctx = None continue break if not vflctx: raise Exception("Unable to find VSVFL context for CE %d" % ce) MostRecentVFLCxtBlock = -1 minUsn = 0xFFFFFFFF for b in vflctx.vfl_context_block: s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d or s.type1 != PAGETYPE_VFL: continue if s.foo.meta.usnDec > 0 and s.foo.meta.usnDec <= minUsn: minUsn = s.foo.meta.usnDec MostRecentVFLCxtBlock = b if MostRecentVFLCxtBlock == -1: print "MostRecentVFLCxtBlock == -1" return last = None for pageNum in xrange(0, self.pages_per_block, 1): s, d = nand.readMetaPage(ce, MostRecentVFLCxtBlock, pageNum, _vfl_vsvfl_spare_data) if not d or s.type1 != PAGETYPE_VFL: break last = d vflctx = _vfl_vsvfl_context.parse(last) if not vfl_check_checksum(vflctx, _vfl_vsvfl_context): print "VSVFL checksum FAIL" self.vflContexts.append(vflctx) if vflctx.version == 2 and vflctx.usn_inc >= self.current_version: self.current_version = vflctx.usn_inc self.context = vflctx if not self.context: raise Exception("VSVFL open FAIL") num_reserved = self.vflContexts[0].reserved_block_pool_start num_non_reserved = self.blocks_per_bank_vfl - num_reserved for ce in xrange(self.num_ce): bbt = [0xFF] * (CEIL_DIVIDE(self.blocks_per_ce, 8)) ctx = self.vflContexts[ce] for bank in xrange(0, self.banks_per_ce_vfl): for i in xrange(0, num_non_reserved): mapEntry = ctx.reserved_block_pool_map[bank * num_non_reserved + i] if mapEntry == 0xFFF0: continue if mapEntry < self.blocks_per_ce: pBlock = mapEntry elif mapEntry > 0xFFF0: pBlock = self.virtual_block_to_physical_block( ce + bank * self.num_ce, num_reserved + i) else: print "VSVFL: bad map table" bbt[pBlock / 8] &= ~(1 << (pBlock % 8)) self.bbt.append(bbt) print "VSVFL context open OK"
def __init__(self, nand): self.nand = nand self.banks_per_ce_vfl = 1 if self.nand.vendorType in [0x100010, 0x100014, 0x120014, 0x150011]: self.banks_per_ce_vfl = 2 self.banks_total = nand.nCEs * self.banks_per_ce_vfl self.num_ce = nand.nCEs self.banks_per_ce = nand.banks_per_ce_physical self.blocks_per_ce = nand.blocksPerCE self.pages_per_block = nand.pagesPerBlock self.pages_per_block_2 = next_power_of_two(self.pages_per_block) self.pages_per_sublk = self.pages_per_block * self.banks_per_ce_vfl * self.num_ce self.blocks_per_bank = self.blocks_per_ce / self.banks_per_ce self.blocks_per_bank_vfl = self.blocks_per_ce / self.banks_per_ce_vfl self.vendorType = nand.vendorType if self.vendorType == 0x10001: self.virtual_to_physical = self.virtual_to_physical_10001 elif self.vendorType == 0x150011: self.virtual_to_physical = self.virtual_to_physical_100014 elif self.vendorType in [0x100010, 0x100014, 0x120014]: self.virtual_to_physical = self.virtual_to_physical_150011 else: raise Exception("VSVFL: unsupported vendor 0x%x" % self.vendorType) self.bank_address_space = nand.bank_address_space self.vflContexts = [] self.bbt = [] self.current_version = 0 reserved_blocks = 0 if self.nand.bfn: reserved_blocks = 16 fs_start_block = reserved_blocks+16 #XXX for ce in xrange(self.num_ce): vflctx = None for b in xrange(reserved_blocks, fs_start_block): s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d: continue vflctx = _vfl_vsvfl_context.parse(d) if not vfl_check_checksum(vflctx, _vfl_vsvfl_context): vflctx = None continue break if not vflctx: raise Exception("Unable to find VSVFL context for CE %d" % ce) MostRecentVFLCxtBlock = -1 minUsn = 0xFFFFFFFF for b in vflctx.vfl_context_block: s, d = nand.readMetaPage(ce, b, 0, _vfl_vsvfl_spare_data) if not d or s.type1 != PAGETYPE_VFL: continue if s.foo.meta.usnDec > 0 and s.foo.meta.usnDec <= minUsn: minUsn = s.foo.meta.usnDec; MostRecentVFLCxtBlock = b if MostRecentVFLCxtBlock == -1: print "MostRecentVFLCxtBlock == -1" return last = None for pageNum in xrange(0, self.pages_per_block, 1): s,d = nand.readMetaPage(ce, MostRecentVFLCxtBlock, pageNum, _vfl_vsvfl_spare_data) if not d or s.type1 != PAGETYPE_VFL: break last = d vflctx = _vfl_vsvfl_context.parse(last) if not vfl_check_checksum(vflctx, _vfl_vsvfl_context): print "VSVFL checksum FAIL" self.vflContexts.append(vflctx) if vflctx.version == 2 and vflctx.usn_inc >= self.current_version: self.current_version = vflctx.usn_inc self.context = vflctx if not self.context: raise Exception("VSVFL open FAIL") num_reserved = self.vflContexts[0].reserved_block_pool_start num_non_reserved = self.blocks_per_bank_vfl - num_reserved for ce in xrange(self.num_ce): bbt = [0xFF] * (CEIL_DIVIDE(self.blocks_per_ce, 8)) ctx = self.vflContexts[ce] for bank in xrange(0, self.banks_per_ce_vfl): for i in xrange(0, num_non_reserved): mapEntry = ctx.reserved_block_pool_map[bank*num_non_reserved + i] if mapEntry == 0xFFF0: continue if mapEntry < self.blocks_per_ce: pBlock = mapEntry elif mapEntry > 0xFFF0: pBlock = self.virtual_block_to_physical_block(ce + bank * self.num_ce, num_reserved + i) else: print "VSVFL: bad map table" bbt[pBlock / 8] &= ~(1 << (pBlock % 8)) self.bbt.append(bbt) print "VSVFL context open OK"