vfio: ignore mapping for ioport region
authorSantosh Shukla <sshukla@mvista.com>
Sun, 21 Feb 2016 14:18:00 +0000 (19:48 +0530)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 24 Feb 2016 10:44:55 +0000 (11:44 +0100)
vfio_pci_mmap() try to map all pci bars. ioport region are not mapped in
vfio/kernel so ignore mmaping for ioport.

Signed-off-by: Santosh Shukla <sshukla@mvista.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Reviewed-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
lib/librte_eal/linuxapp/eal/eal_pci_vfio.c

index ffa2dd0..4832313 100644 (file)
@@ -659,6 +659,7 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
        struct pci_map *maps;
        uint32_t msix_table_offset = 0;
        uint32_t msix_table_size = 0;
+       uint32_t ioport_bar;
 
        dev->intr_handle.fd = -1;
        dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN;
@@ -853,6 +854,25 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
                        return -1;
                }
 
+               /* chk for io port region */
+               ret = pread64(vfio_dev_fd, &ioport_bar, sizeof(ioport_bar),
+                             VFIO_GET_REGION_ADDR(VFIO_PCI_CONFIG_REGION_INDEX)
+                             + PCI_BASE_ADDRESS_0 + i*4);
+
+               if (ret != sizeof(ioport_bar)) {
+                       RTE_LOG(ERR, EAL,
+                               "Cannot read command (%x) from config space!\n",
+                               PCI_BASE_ADDRESS_0 + i*4);
+                       return -1;
+               }
+
+               if (ioport_bar & PCI_BASE_ADDRESS_SPACE_IO) {
+                       RTE_LOG(INFO, EAL,
+                               "Ignore mapping IO port bar(%d) addr: %x\n",
+                                i, ioport_bar);
+                       continue;
+               }
+
                /* skip non-mmapable BARs */
                if ((reg.flags & VFIO_REGION_INFO_FLAG_MMAP) == 0)
                        continue;