ModeData ++ ;\r
VideoMode ++;\r
}\r
- Private->MaxMode = QEMU_VIDEO_CIRRUS_MODE_COUNT;\r
+ Private->MaxMode = ModeData - Private->ModeData;\r
\r
return EFI_SUCCESS;\r
}\r
QEMU_VIDEO_PRIVATE_DATA *Private\r
)\r
{\r
+ UINT32 AvailableFbSize;\r
UINT32 Index;\r
QEMU_VIDEO_MODE_DATA *ModeData;\r
QEMU_VIDEO_BOCHS_MODES *VideoMode;\r
\r
+ //\r
+ // fetch available framebuffer size\r
+ //\r
+ AvailableFbSize = BochsRead (Private, VBE_DISPI_INDEX_VIDEO_MEMORY_64K);\r
+ AvailableFbSize *= SIZE_64KB;\r
+ DEBUG ((EFI_D_VERBOSE, "%a: AvailableFbSize=0x%x\n", __FUNCTION__,\r
+ AvailableFbSize));\r
+\r
//\r
// Setup Video Modes\r
//\r
ModeData = Private->ModeData;\r
VideoMode = &QemuVideoBochsModes[0];\r
for (Index = 0; Index < QEMU_VIDEO_BOCHS_MODE_COUNT; Index ++) {\r
- ModeData->InternalModeIndex = Index;\r
- ModeData->HorizontalResolution = VideoMode->Width;\r
- ModeData->VerticalResolution = VideoMode->Height;\r
- ModeData->ColorDepth = VideoMode->ColorDepth;\r
- ModeData->RefreshRate = 60;\r
- DEBUG ((EFI_D_INFO,\r
- "Adding Mode %d as Bochs Internal Mode %d: %dx%d, %d-bit, %d Hz\n",\r
- (INT32) (ModeData - Private->ModeData),\r
- ModeData->InternalModeIndex,\r
- ModeData->HorizontalResolution,\r
- ModeData->VerticalResolution,\r
- ModeData->ColorDepth,\r
- ModeData->RefreshRate\r
- ));\r
-\r
- ModeData ++ ;\r
+ UINTN RequiredFbSize;\r
+\r
+ ASSERT (VideoMode->ColorDepth % 8 == 0);\r
+ RequiredFbSize = (UINTN) VideoMode->Width * VideoMode->Height *\r
+ (VideoMode->ColorDepth / 8);\r
+ if (RequiredFbSize <= AvailableFbSize) {\r
+ ModeData->InternalModeIndex = Index;\r
+ ModeData->HorizontalResolution = VideoMode->Width;\r
+ ModeData->VerticalResolution = VideoMode->Height;\r
+ ModeData->ColorDepth = VideoMode->ColorDepth;\r
+ ModeData->RefreshRate = 60;\r
+ DEBUG ((EFI_D_INFO,\r
+ "Adding Mode %d as Bochs Internal Mode %d: %dx%d, %d-bit, %d Hz\n",\r
+ (INT32) (ModeData - Private->ModeData),\r
+ ModeData->InternalModeIndex,\r
+ ModeData->HorizontalResolution,\r
+ ModeData->VerticalResolution,\r
+ ModeData->ColorDepth,\r
+ ModeData->RefreshRate\r
+ ));\r
+\r
+ ModeData ++ ;\r
+ }\r
VideoMode ++;\r
}\r
- Private->MaxMode = QEMU_VIDEO_BOCHS_MODE_COUNT;\r
+ Private->MaxMode = ModeData - Private->ModeData;\r
\r
return EFI_SUCCESS;\r
}\r