Commit df6a050c authored by Yi Min Zhao's avatar Yi Min Zhao Committed by Cornelia Huck
Browse files

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: default avatarYi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: default avatarPierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
parent e141dbad
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -340,7 +340,8 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr,
        .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;
    }

@@ -480,21 +481,19 @@ static const MemoryRegionOps s390_msi_ctrl_ops = {

void s390_pci_iommu_enable(S390PCIBusDevice *pbdev)
{
    pbdev->configured = false;
    uint64_t size = pbdev->pal - pbdev->pba + 1;

    memory_region_init_iommu(&pbdev->iommu_mr, OBJECT(&pbdev->mr),
                             &s390_iommu_ops, "iommu-s390", size);
    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)
{
    pbdev->configured = false;
    memory_region_del_subregion(&pbdev->mr, &pbdev->iommu_mr);
    object_unparent(OBJECT(&pbdev->iommu_mr));
    pbdev->configured = true;
    pbdev->iommu_enabled = false;
}

static void s390_pcihost_init_as(S390pciState *s)
+1 −0
Original line number Diff line number Diff line
@@ -219,6 +219,7 @@ typedef struct S390PCIBusDevice {
    bool configured;
    bool error_state;
    bool lgstg_blocked;
    bool iommu_enabled;
    uint32_t fh;
    uint32_t fid;
    uint64_t g_iota;