[Spice-devel] [PATCH 4/4] [experimental] add optinal 64bit vram bar to qxl

Alon Levy alevy at redhat.com
Fri Feb 17 11:39:18 PST 2012


On Fri, Feb 17, 2012 at 04:10:33PM +0100, Gerd Hoffmann wrote:
> This patch adds an 64bit pci bar for vram.  It is turned off by default.
> It can be enabled by setting the size of the 64bit bar to be larger than
> the 32bit bar.  Both 32bit and 64bit bar refer to the same memory.  Only
> the first part of the memory is available via 32bit bar.
> 
> The intention is to allow large vram sizes for 64bit guests, by allowing
> the vram bar being mapped above 4G, so we don't have to squeeze it into
> the pci I/O window below 4G.
> 
> With vram_size_mb=16 and vram64_size_mb=256 it looks like this:
> 

The vram variables are a little confusing, but I guess I can live with
it, and it will be more natural going forward.

I guess you will s/4/QXL_VRAM64_RANGE_INDEX/ when you send the
spice-protocol patch?

Other then one more note below, looks good.

> 00:02.0 VGA compatible controller: Red Hat, Inc. Device 0100 (rev 02) (prog-if 00 [VGA controller])
>         Subsystem: Red Hat, Inc Device 1100
>         Physical Slot: 2
>         Flags: fast devsel, IRQ 10
>         Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
>         Memory at fc000000 (32-bit, non-prefetchable) [size=16M]
>         Memory at fd020000 (32-bit, non-prefetchable) [size=8K]
>         I/O ports at c5a0 [size=32]
>         Memory at ffe0000000 (64-bit, prefetchable) [size=256M]
>         Expansion ROM at fd000000 [disabled] [size=64K]
> 
> [ needs patched seabios ]
> ---
>  hw/qxl.c |   51 ++++++++++++++++++++++++++++++++++++++++++++-------
>  hw/qxl.h |    3 +++
>  2 files changed, 47 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/qxl.c b/hw/qxl.c
> index 87ad49a..e38bb29 100644
> --- a/hw/qxl.c
> +++ b/hw/qxl.c
> @@ -914,6 +914,7 @@ static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
>      static const int regions[] = {
>          QXL_RAM_RANGE_INDEX,
>          QXL_VRAM_RANGE_INDEX,
> +        4 /* vram 64bit */,
>      };
>      uint64_t guest_start;
>      uint64_t guest_end;
> @@ -960,6 +961,7 @@ static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
>          virt_start = (intptr_t)memory_region_get_ram_ptr(&d->vga.vram);
>          break;
>      case QXL_VRAM_RANGE_INDEX:
> +    case 4 /* vram 64bit */:
>          virt_start = (intptr_t)memory_region_get_ram_ptr(&d->vram_bar);
>          break;
>      default:
> @@ -1564,18 +1566,28 @@ static void qxl_init_ramsize(PCIQXLDevice *qxl, uint32_t ram_min_mb)
>          qxl->vga.vram_size = ram_min_mb * 1024 * 1024;
>      }
>  
> -    /* vram (surfaces, bar 1) */
> +    /* vram32 (surfaces, 32bit, bar 1) */
> +    if (qxl->vram32_size_mb != -1) {
> +        qxl->vram32_size = qxl->vram32_size_mb * 1024 * 1024;
> +    }
> +    if (qxl->vram32_size < 4096) {
> +        qxl->vram32_size = 4096;
> +    }
> +
> +    /* vram (surfaces, 64bit, bar 4+5) */
>      if (qxl->vram_size_mb != -1) {
>          qxl->vram_size = qxl->vram_size_mb * 1024 * 1024;
>      }
> -    if (qxl->vram_size < 4096) {
> -        qxl->vram_size = 4096;
> +    if (qxl->vram_size < qxl->vram32_size) {
> +        qxl->vram_size = qxl->vram32_size;

Am I reading correctly that you want the 64bit bar to be at least the
size of the 32bit bar? why?

>      }
> +
>      if (qxl->revision == 1) {
> +        qxl->vram32_size = 4096;
>          qxl->vram_size = 4096;
>      }
> -
>      qxl->vga.vram_size = msb_mask(qxl->vga.vram_size * 2 - 1);
> +    qxl->vram32_size = msb_mask(qxl->vram32_size * 2 - 1);
>      qxl->vram_size = msb_mask(qxl->vram_size * 2 - 1);
>  }
>  
> @@ -1619,6 +1631,8 @@ static int qxl_init_common(PCIQXLDevice *qxl)
>  
>      memory_region_init_ram(&qxl->vram_bar, "qxl.vram", qxl->vram_size);
>      vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
> +    memory_region_init_alias(&qxl->vram32_bar, "qxl.vram32", &qxl->vram_bar,
> +                             0, qxl->vram32_size);
>  
>      io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1);
>      if (qxl->revision == 1) {
> @@ -1642,7 +1656,29 @@ static int qxl_init_common(PCIQXLDevice *qxl)
>                       PCI_BASE_ADDRESS_SPACE_MEMORY, &qxl->vga.vram);
>  
>      pci_register_bar(&qxl->pci, QXL_VRAM_RANGE_INDEX,
> -                     PCI_BASE_ADDRESS_SPACE_MEMORY, &qxl->vram_bar);
> +                     PCI_BASE_ADDRESS_SPACE_MEMORY, &qxl->vram32_bar);
> +
> +    if (qxl->vram32_size < qxl->vram_size) {
> +        /*
> +         * Make the 64bit vram bar show up only in case it is
> +         * configured to be larger than the 32bit vram bar.
> +         */
> +        pci_register_bar(&qxl->pci, 4,
> +                         PCI_BASE_ADDRESS_SPACE_MEMORY |
> +                         PCI_BASE_ADDRESS_MEM_TYPE_64 |
> +                         PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                         &qxl->vram_bar);
> +    }
> +
> +    /* print pci bar details */
> +    dprint(qxl, 1, "ram/%s: %d MB [region 0]\n",
> +           qxl->id == 0 ? "pri" : "sec",
> +           qxl->vga.vram_size / (1024*1024));
> +    dprint(qxl, 1, "vram/32: %d MB [region 1]\n",
> +           qxl->vram32_size / (1024*1024));
> +    dprint(qxl, 1, "vram/64: %d MB %s\n",
> +           qxl->vram_size / (1024*1024),
> +           qxl->vram32_size < qxl->vram_size ? "[region 4]" : "[unmapped]");
>  
>      qxl->ssd.qxl.base.sif = &qxl_interface.base;
>      qxl->ssd.qxl.id = qxl->id;
> @@ -1859,7 +1895,7 @@ static VMStateDescription qxl_vmstate = {
>  static Property qxl_properties[] = {
>          DEFINE_PROP_UINT32("ram_size", PCIQXLDevice, vga.vram_size,
>                             64 * 1024 * 1024),
> -        DEFINE_PROP_UINT32("vram_size", PCIQXLDevice, vram_size,
> +        DEFINE_PROP_UINT32("vram_size", PCIQXLDevice, vram32_size,
>                             64 * 1024 * 1024),
>          DEFINE_PROP_UINT32("revision", PCIQXLDevice, revision,
>                             QXL_DEFAULT_REVISION),
> @@ -1867,7 +1903,8 @@ static Property qxl_properties[] = {
>          DEFINE_PROP_UINT32("guestdebug", PCIQXLDevice, guestdebug, 0),
>          DEFINE_PROP_UINT32("cmdlog", PCIQXLDevice, cmdlog, 0),
>          DEFINE_PROP_UINT32("ram_size_mb",  PCIQXLDevice, ram_size_mb, -1),
> -        DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram_size_mb, -1),
> +        DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram32_size_mb, 0),
> +        DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, 0),
>          DEFINE_PROP_END_OF_LIST(),
>  };
>  
> diff --git a/hw/qxl.h b/hw/qxl.h
> index d062991..a1b1240 100644
> --- a/hw/qxl.h
> +++ b/hw/qxl.h
> @@ -86,6 +86,8 @@ typedef struct PCIQXLDevice {
>      /* vram pci bar */
>      uint32_t           vram_size;
>      MemoryRegion       vram_bar;
> +    uint32_t           vram32_size;
> +    MemoryRegion       vram32_bar;
>  
>      /* io bar */
>      MemoryRegion       io_bar;
> @@ -93,6 +95,7 @@ typedef struct PCIQXLDevice {
>      /* user-friendly properties (in megabytes) */
>      uint32_t          ram_size_mb;
>      uint32_t          vram_size_mb;
> +    uint32_t          vram32_size_mb;
>  } PCIQXLDevice;
>  
>  #define PANIC_ON(x) if ((x)) {                         \
> -- 
> 1.7.1
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list