mirror of https://github.com/xqemu/xqemu.git
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:
parent
e141dbadfa
commit
df6a050c82
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue