]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: QemuVideoDxe: filter BOCHS modes vs. available frame buffer size
authorLaszlo Ersek <lersek@redhat.com>
Mon, 3 Mar 2014 08:41:08 +0000 (08:41 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 3 Mar 2014 08:41:08 +0000 (08:41 +0000)
In the next patch we'll add many new BOCHS modes, some of which require
large frame buffers.

The size of the QXL VGA compatibility framebuffer can be changed with the

  -global qxl-vga.vgamem_mb=$NUM_MB

QEMU option.

If $NUM_MB would exceed 32, then the following two QEMU options are
necessary instead:

  -global qxl-vga.vgamem_mb=$NUM_MB         \
  -global qxl-vga.ram_size_mb=$((NUM_MB*2))

because the compatibility framebuffer can't cover more than half of PCI
BAR #0. The latter defaults to 64MB in size, and is controlled by
"ram_size_mb".

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15288 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/QemuVideoDxe/Initialize.c

index af3b6af47cecb77c73d3b0b963436c4345cd4fc3..80e9b3a936ff571d03ed0d51af7be054695819e8 100644 (file)
@@ -200,7 +200,7 @@ QemuVideoCirrusModeSetup (
     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
@@ -222,10 +222,19 @@ QemuVideoBochsModeSetup (
   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
@@ -238,25 +247,32 @@ QemuVideoBochsModeSetup (
   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