qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/2] Variable VRAM size


From: John Baboval
Subject: [Qemu-devel] [PATCH 2/2] Variable VRAM size
Date: Fri, 28 Oct 2011 15:24:37 -0400
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Thunderbird/3.1.10

High resolution VGA modes require more than the default 8MB of VGA
RAM. Add a command line parameter to allow larger sizes.

Signed-off-by: John V. Baboval <address@hidden>
---
hw/vga.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 hw/vga_int.h    |    4 +++
 qemu-options.hx |    3 ++
 vl.c            |    4 +++
 4 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/hw/vga.c b/hw/vga.c
index ca79aa1..8003eda 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -565,23 +565,76 @@ static uint32_t vbe_ioport_read_index(void *opaque, uint32_t addr)
     return val;
 }
 +typedef struct vga_ram_info {
+     int max_xres;
+     int max_yres;
+     int max_bpp;
+} vga_ram_info_t;
+
+static vga_ram_info_t vbe_ram_info(int ramsize)
+{
+    vga_ram_info_t s;
+    s.max_bpp = 32;
+
+    switch(ramsize) {
+    case 8 * 1024 * 1024:
+        s.max_xres = 1920;
+        s.max_yres = 1080;
+        break;
+    case 16 * 1024 * 1024:
+        s.max_xres = 2560;
+        s.max_yres = 1600;
+        break;
+    default:
+    case 32 * 1024 * 1024:
+        s.max_xres = 2560;
+        s.max_yres = 2048;
+        break;
+    }
+    return s;
+}
+
+static int vga_ram_sz = VGA_RAM_SIZE;
+void set_vga_ram_size(int size)
+{
+    const char *msg = NULL;
+
+    if (size < 8)
+        msg = "is too small";
+    else if (size > 512)
+        msg = "is too large";
+    else if (size != (size & ~(size - 1)))
+        msg = "is not a power of 2";
+    if (msg) {
+        fprintf(stderr, "VGA RAM size %d %s\n", size, msg);
+        exit(1);
+    }
+    vga_ram_sz = size * 1024 * 1024;
+}
+
+int vga_ram_size(void)
+{
+    return vga_ram_sz;
+}
+
 static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr)
 {
     VGACommonState *s = opaque;
     uint32_t val;
+    vga_ram_info_t vs = vbe_ram_info(s->vram_size);
      if (s->vbe_index < VBE_DISPI_INDEX_NB) {
         if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {
             switch(s->vbe_index) {
                 /* XXX: do not hardcode ? */
             case VBE_DISPI_INDEX_XRES:
-                val = VBE_DISPI_MAX_XRES;
+                val = vs.max_xres;
                 break;
             case VBE_DISPI_INDEX_YRES:
-                val = VBE_DISPI_MAX_YRES;
+                val = vs.max_yres;
                 break;
             case VBE_DISPI_INDEX_BPP:
-                val = VBE_DISPI_MAX_BPP;
+                val = vs.max_bpp;
                 break;
             default:
                 val = s->vbe_regs[s->vbe_index];
@@ -610,6 +663,7 @@ static void vbe_ioport_write_index(void *opaque, uint32_t addr, uint32_t val) static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
 {
     VGACommonState *s = opaque;
+    vga_ram_info_t vs = vbe_ram_info(s->vram_size);
      if (s->vbe_index <= VBE_DISPI_INDEX_NB) {
 #ifdef DEBUG_BOCHS_VBE
@@ -626,12 +680,12 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
             }
             break;
         case VBE_DISPI_INDEX_XRES:
-            if ((val <= VBE_DISPI_MAX_XRES) && ((val & 7) == 0)) {
+            if ((val <= vs.max_xres) && ((val & 7) == 0)) {
                 s->vbe_regs[s->vbe_index] = val;
             }
             break;
         case VBE_DISPI_INDEX_YRES:
-            if (val <= VBE_DISPI_MAX_YRES) {
+            if (val <= vs.max_yres) {
                 s->vbe_regs[s->vbe_index] = val;
             }
             break;
diff --git a/hw/vga_int.h b/hw/vga_int.h
index c1e700f..3864fba 100644
--- a/hw/vga_int.h
+++ b/hw/vga_int.h
@@ -24,6 +24,7 @@
  #include <hw/hw.h>
 #include "memory.h"
+#include "console.h"
  #define MSR_COLOR_EMULATION 0x01
 #define MSR_PAGE_SELECT     0x20
@@ -224,6 +225,9 @@ void vga_init_vbe(VGACommonState *s, MemoryRegion *address_space);
 extern const uint8_t sr_mask[8];
 extern const uint8_t gr_mask[16];
 +void set_vga_ram_size(int size);
+int vga_ram_size(void);
+
 #define VGA_RAM_SIZE (8192 * 1024)
 #define VGABIOS_FILENAME "vgabios.bin"
 #define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin"
diff --git a/qemu-options.hx b/qemu-options.hx
index 5d2a776..00177f3 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -896,6 +896,9 @@ Disable VGA card.
 @end table
 ETEXI
 +DEF("vga-mem", HAS_ARG, QEMU_OPTION_vga_ram_size,
+ "-vga-mem megs set virtual FB size to megs MB\n", QEMU_ARCH_ALL)
+
 DEF("full-screen", 0, QEMU_OPTION_full_screen,
     "-full-screen    start in full screen\n", QEMU_ARCH_ALL)
 STEXI
diff --git a/vl.c b/vl.c
index 1ddb17b..66277d6 100644
--- a/vl.c
+++ b/vl.c
@@ -126,6 +126,7 @@ int main(int argc, char **argv)
 #include "hw/xen.h"
 #include "hw/qdev.h"
 #include "hw/loader.h"
+#include "hw/vga_int.h"
 #include "bt-host.h"
 #include "net.h"
 #include "net/slirp.h"
@@ -2585,6 +2586,9 @@ int main(int argc, char **argv, char **envp)
             case QEMU_OPTION_vga:
                 select_vgahw (optarg);
                 break;
+            case QEMU_OPTION_vga_ram_size:
+                set_vga_ram_size(atoi(optarg));
+                break;
             case QEMU_OPTION_g:
                 {
                     const char *p;
--
1.7.4.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]