Example #1
0
    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"
Example #4
0
    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"