- def BlockSizeOfRegion(self, BlockSizeList):\r
- Offset = 0x00\r
- BlockSize = 0\r
- for item in BlockSizeList:\r
- Offset = Offset + item[0] * item[1]\r
- GenFdsGlobalVariable.VerboseLogger ("Offset = 0x%X" %Offset)\r
- GenFdsGlobalVariable.VerboseLogger ("self.Offset 0x%X" %self.Offset)\r
-\r
- if self.Offset < Offset :\r
- if Offset - self.Offset < self.Size:\r
- EdkLogger.error("GenFds", GENFDS_ERROR,\r
- "Region at Offset 0x%X can NOT fit into Block array with BlockSize %X" \\r
- % (self.Offset, item[0]))\r
- BlockSize = item[0]\r
- GenFdsGlobalVariable.VerboseLogger ("BlockSize = %X" %BlockSize)\r
- return BlockSize\r
- return BlockSize\r
+ 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