qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 20/39] virtio-pci: convert to memory API


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 20/39] virtio-pci: convert to memory API
Date: Mon, 01 Aug 2011 15:23:00 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Lightning/1.0b2 Thunderbird/3.1.10

On 08/01/2011 03:26 AM, Michael S. Tsirkin wrote:
On Sun, Jul 31, 2011 at 08:57:43PM +0300, Avi Kivity wrote:
@@ -491,30 +473,26 @@ static void virtio_pci_config_writel(void *opaque, 
uint32_t addr, uint32_t val)
      virtio_config_writel(proxy->vdev, addr, val);
  }

-static void virtio_map(PCIDevice *pci_dev, int region_num,
-                       pcibus_t addr, pcibus_t size, int type)
-{
-    VirtIOPCIProxy *proxy = container_of(pci_dev, VirtIOPCIProxy, pci_dev);
-    VirtIODevice *vdev = proxy->vdev;
-    unsigned config_len = VIRTIO_PCI_REGION_SIZE(pci_dev) + vdev->config_len;
-
-    proxy->addr = addr;
-
-    register_ioport_write(addr, config_len, 1, virtio_pci_config_writeb, 
proxy);
-    register_ioport_write(addr, config_len, 2, virtio_pci_config_writew, 
proxy);
-    register_ioport_write(addr, config_len, 4, virtio_pci_config_writel, 
proxy);
-    register_ioport_read(addr, config_len, 1, virtio_pci_config_readb, proxy);
-    register_ioport_read(addr, config_len, 2, virtio_pci_config_readw, proxy);
-    register_ioport_read(addr, config_len, 4, virtio_pci_config_readl, proxy);
+const MemoryRegionPortio virtio_portio[] = {
+    { 0, 0x10000, 1, .write = virtio_pci_config_writeb, },
+    { 0, 0x10000, 2, .write = virtio_pci_config_writew, },
+    { 0, 0x10000, 4, .write = virtio_pci_config_writel, },
+    { 0, 0x10000, 1, .read = virtio_pci_config_readb, },
+    { 0, 0x10000, 2, .read = virtio_pci_config_readw, },
+    { 0, 0x10000, 4, .read = virtio_pci_config_readl, },
+    PORTIO_END
+};

-    if (vdev->config_len)
-        vdev->get_config(vdev, vdev->config);
-}
+static const MemoryRegionOps virtio_pci_config_ops = {
+    .old_portio = virtio_portio,
+    .endianness = DEVICE_LITTLE_ENDIAN,
+};

  static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
                                  uint32_t val, int len)
  {
      VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
+    VirtIODevice *vdev = proxy->vdev;

      if (PCI_COMMAND == address) {
          if (!(val&  PCI_COMMAND_MASTER)) {
@@ -525,6 +503,9 @@ static void virtio_write_config(PCIDevice *pci_dev, 
uint32_t address,
              }
          }
      }
+    if (address == PCI_BASE_ADDRESS_0&&  vdev->config_len) {
+        vdev->get_config(vdev, vdev->config);
+    }

      pci_default_write_config(pci_dev, address, val, len);
      msix_write_config(pci_dev, address, val, len);

I'm not really sure why did we get the config on map,
specifically - Anthony, do you know?

It's just a mechanism to lazily load the config. We could just as easily read the config whenever the (virtio) config space was accessed.

Regards,

Anthony Liguori

But if we want to do that, memory space enable might
be a better place. Or maybe we just want a callback on
map.





reply via email to

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