ModeData = Private->ModeData;\r
VideoMode = &QemuVideoCirrusModes[0];\r
for (Index = 0; Index < QEMU_VIDEO_CIRRUS_MODE_COUNT; Index ++) {\r
- ModeData->ModeNumber = Index;\r
+ ModeData->InternalModeIndex = Index;\r
ModeData->HorizontalResolution = VideoMode->Width;\r
ModeData->VerticalResolution = VideoMode->Height;\r
ModeData->ColorDepth = VideoMode->ColorDepth;\r
ModeData->RefreshRate = VideoMode->RefreshRate;\r
DEBUG ((EFI_D_INFO,\r
- "Adding Cirrus Video Mode %d: %dx%d, %d-bit, %d Hz\n",\r
- ModeData->ModeNumber,\r
+ "Adding Mode %d as Cirrus 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 ++ ;\r
VideoMode ++;\r
}\r
- Private->MaxMode = QEMU_VIDEO_CIRRUS_MODE_COUNT;\r
+ Private->MaxMode = ModeData - Private->ModeData;\r
\r
return EFI_SUCCESS;\r
}\r
/// Table of supported video modes\r
///\r
QEMU_VIDEO_BOCHS_MODES QemuVideoBochsModes[] = {\r
- { 640, 480, 32 },\r
- { 800, 600, 32 },\r
- { 1024, 768, 24 },\r
+ { 640, 480, 32 },\r
+ { 800, 480, 32 },\r
+ { 800, 600, 32 },\r
+ { 832, 624, 32 },\r
+ { 960, 640, 32 },\r
+ { 1024, 600, 32 },\r
+ { 1024, 768, 32 },\r
+ { 1152, 864, 32 },\r
+ { 1152, 870, 32 },\r
+ { 1280, 720, 32 },\r
+ { 1280, 760, 32 },\r
+ { 1280, 768, 32 },\r
+ { 1280, 800, 32 },\r
+ { 1280, 960, 32 },\r
+ { 1280, 1024, 32 },\r
+ { 1360, 768, 32 },\r
+ { 1366, 768, 32 },\r
+ { 1400, 1050, 32 },\r
+ { 1440, 900, 32 },\r
+ { 1600, 900, 32 },\r
+ { 1600, 1200, 32 },\r
+ { 1680, 1050, 32 },\r
+ { 1920, 1080, 32 },\r
+ { 1920, 1200, 32 },\r
+ { 1920, 1440, 32 },\r
+ { 2000, 2000, 32 },\r
+ { 2048, 1536, 32 },\r
+ { 2048, 2048, 32 },\r
+ { 2560, 1440, 32 },\r
+ { 2560, 1600, 32 },\r
+ { 2560, 2048, 32 },\r
+ { 2800, 2100, 32 },\r
+ { 3200, 2400, 32 },\r
+ { 3840, 2160, 32 },\r
+ { 4096, 2160, 32 },\r
+ { 7680, 4320, 32 },\r
+ { 8192, 4320, 32 }\r
};\r
\r
#define QEMU_VIDEO_BOCHS_MODE_COUNT \\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->ModeNumber = 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 Bochs Video Mode %d: %dx%d, %d-bit, %d Hz\n",\r
- ModeData->ModeNumber,\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