s390x/pci: introduce S390PCIBusDevice.iommu_enabled

We introduce iommu_enabled field for S390PCIBusDevice struct to
track whether the iommu has been enabled for the device. This allows
us to stop temporarily changing ->configured while en/disabling the
iommu and to do conditional cleanup later.

Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
Yi Min Zhao 2016-05-04 15:07:11 +08:00 committed by Cornelia Huck
parent e141dbadfa
commit df6a050c82
2 changed files with 5 additions and 5 deletions

View File

@ -340,7 +340,8 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr,
.perm = IOMMU_NONE, .perm = IOMMU_NONE,
}; };
if (!pbdev->configured || !pbdev->pdev || !(pbdev->fh & FH_ENABLED)) { if (!pbdev->configured || !pbdev->pdev ||
!(pbdev->fh & FH_ENABLED) || !pbdev->iommu_enabled) {
return ret; return ret;
} }
@ -480,21 +481,19 @@ static const MemoryRegionOps s390_msi_ctrl_ops = {
void s390_pci_iommu_enable(S390PCIBusDevice *pbdev) void s390_pci_iommu_enable(S390PCIBusDevice *pbdev)
{ {
pbdev->configured = false;
uint64_t size = pbdev->pal - pbdev->pba + 1; uint64_t size = pbdev->pal - pbdev->pba + 1;
memory_region_init_iommu(&pbdev->iommu_mr, OBJECT(&pbdev->mr), memory_region_init_iommu(&pbdev->iommu_mr, OBJECT(&pbdev->mr),
&s390_iommu_ops, "iommu-s390", size); &s390_iommu_ops, "iommu-s390", size);
memory_region_add_subregion(&pbdev->mr, pbdev->pba, &pbdev->iommu_mr); memory_region_add_subregion(&pbdev->mr, pbdev->pba, &pbdev->iommu_mr);
pbdev->configured = true; pbdev->iommu_enabled = true;
} }
void s390_pci_iommu_disable(S390PCIBusDevice *pbdev) void s390_pci_iommu_disable(S390PCIBusDevice *pbdev)
{ {
pbdev->configured = false;
memory_region_del_subregion(&pbdev->mr, &pbdev->iommu_mr); memory_region_del_subregion(&pbdev->mr, &pbdev->iommu_mr);
object_unparent(OBJECT(&pbdev->iommu_mr)); object_unparent(OBJECT(&pbdev->iommu_mr));
pbdev->configured = true; pbdev->iommu_enabled = false;
} }
static void s390_pcihost_init_as(S390pciState *s) static void s390_pcihost_init_as(S390pciState *s)

View File

@ -219,6 +219,7 @@ typedef struct S390PCIBusDevice {
bool configured; bool configured;
bool error_state; bool error_state;
bool lgstg_blocked; bool lgstg_blocked;
bool iommu_enabled;
uint32_t fh; uint32_t fh;
uint32_t fid; uint32_t fid;
uint64_t g_iota; uint64_t g_iota;