+ def BlockInfoOfRegion(self, BlockSizeList, FvObj):\r
+ Start = 0\r
+ End = 0\r
+ RemindingSize = self.Size\r
+ ExpectedList = []\r
+ for (BlockSize, BlockNum, pcd) in BlockSizeList:\r
+ End = Start + BlockSize * BlockNum\r
+ # region not started yet\r
+ if self.Offset >= End:\r
+ Start = End\r
+ continue\r
+ # region located in current blocks \r
+ else:\r
+ # region ended within current blocks\r
+ if self.Offset + self.Size <= End:\r
+ ExpectedList.append((BlockSize, (RemindingSize + BlockSize - 1) / BlockSize))\r
+ break\r
+ # region not ended yet\r
+ else:\r
+ # region not started in middle of current blocks\r
+ if self.Offset <= Start:\r
+ UsedBlockNum = BlockNum\r
+ # region started in middle of current blocks\r
+ else:\r
+ UsedBlockNum = (End - self.Offset) / BlockSize\r
+ Start = End\r
+ ExpectedList.append((BlockSize, UsedBlockNum))\r
+ RemindingSize -= BlockSize * UsedBlockNum\r
+\r
+ if FvObj.BlockSizeList == []:\r
+ FvObj.BlockSizeList = ExpectedList\r
+ else:\r
+ # first check whether FvObj.BlockSizeList items have only "BlockSize" or "NumBlocks",\r
+ # if so, use ExpectedList\r
+ for Item in FvObj.BlockSizeList:\r
+ if Item[0] == None or Item[1] == None:\r
+ FvObj.BlockSizeList = ExpectedList\r
+ break\r
+ # make sure region size is no smaller than the summed block size in FV\r
+ Sum = 0\r
+ for Item in FvObj.BlockSizeList:\r
+ Sum += Item[0] * Item[1]\r
+ if self.Size < Sum:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "Total Size of FV %s 0x%x is larger than Region Size 0x%x "\r
+ % (FvObj.UiFvName, Sum, self.Size))\r
+ # check whether the BlockStatements in FV section is appropriate\r
+ ExpectedListData = ''\r
+ for Item in ExpectedList:\r
+ ExpectedListData += "BlockSize = 0x%x\n\tNumBlocks = 0x%x\n\t" % Item\r
+ Index = 0\r
+ for Item in FvObj.BlockSizeList:\r
+ if Item[0] != ExpectedList[Index][0]:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "BlockStatements of FV %s are not align with FD's, suggested FV BlockStatement"\r
+ % FvObj.UiFvName, ExtraData=ExpectedListData)\r
+ elif Item[1] != ExpectedList[Index][1]:\r
+ if (Item[1] < ExpectedList[Index][1]) and (Index == len(FvObj.BlockSizeList) - 1):\r
+ break;\r
+ else:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "BlockStatements of FV %s are not align with FD's, suggested FV BlockStatement"\r
+ % FvObj.UiFvName, ExtraData=ExpectedListData)\r
+ else:\r
+ Index += 1\r
+\r
+ \r