mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
* Kconfig improvements (msi_nonbroken, imply for default PCI devices)
* intel-iommu: sharing passthrough FlatViews (Peter) * Fix for SEV with VFIO (Brijesh) * Allow compilation without CONFIG_PARALLEL (Thomas) -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAlyTvvAUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroNNwwf/RrtjBoqu8Ulu6k+HJczdpkhO44c5 R7sidGaOBHVjT+EsaYZxanXQlsbpDPiXCRoMRMln+O3Kgso/UlVTLBfctIjuf5kp P8Amp8rw843yl3TQ+Xaqat1qtfVVN2xjRDoyRwWrTU5w52MVVsan2j1/XzGX/7Bb Y3gXRxsN7MyjDCXxhxVwQCxKU2ue3ytvnfdCnu1SNZxZEaFAyGprTNCCTXYugehl bVauAs/0qOZWEyvElinNEz+zbqMTm07ULAWBRXgCDcOudsidZFtu0Xl62dXlp1Ou 0zkaoGiOdMM6OXZkLd6vOK8mY9XDuqaUZE3zAeFMJsK1wSnZdGUVCJO1Hw== =Pkcj -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * Kconfig improvements (msi_nonbroken, imply for default PCI devices) * intel-iommu: sharing passthrough FlatViews (Peter) * Fix for SEV with VFIO (Brijesh) * Allow compilation without CONFIG_PARALLEL (Thomas) # gpg: Signature made Thu 21 Mar 2019 16:42:24 GMT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: (23 commits) virtio-vga: only enable for specific boards config-all-devices.mak: rebuild on reconfigure minikconf: fix parser typo intel-iommu: optimize nodmar memory regions test-announce-self: convert to qgraph hw/alpha/Kconfig: DP264 hardware requires e1000 network card hw/hppa/Kconfig: Dino board requires e1000 network card hw/sh4/Kconfig: r2d machine requires the rtl8139 network card hw/ppc/Kconfig: e500 based machines require virtio-net-pci device hw/ppc/Kconfig: Bamboo machine requires e1000 network card hw/mips/Kconfig: Fulong 2e board requires ati-vga/rtl8139 PCI devices hw/mips/Kconfig: Malta machine requires the pcnet network card hw/i386/Kconfig: enable devices that can be created by default hw/isa/Kconfig: PIIX4 southbridge requires USB UHCI hw/isa/Kconfig: i82378 SuperIO requires PC speaker device prep: do not select I82374 hw/i386/Kconfig: PC uses I8257, not I82374 hw/char/parallel: Make it possible to compile also without CONFIG_PARALLEL target/i386: sev: Do not pin the ram device memory region memory: Fix the memory region type assignment order ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org> # Conflicts: # hw/rdma/Makefile.objs # hw/riscv/sifive_plic.c
This commit is contained in:
commit
84bdc58c06
34 changed files with 173 additions and 135 deletions
|
@ -9,6 +9,7 @@ config PC
|
|||
imply ISA_IPMI_KCS
|
||||
imply ISA_IPMI_BT
|
||||
imply ISA_DEBUG
|
||||
imply PARALLEL
|
||||
imply PCI_DEVICES
|
||||
imply PVPANIC
|
||||
imply QXL
|
||||
|
@ -17,16 +18,15 @@ config PC
|
|||
imply TEST_DEVICES
|
||||
imply TPM_CRB
|
||||
imply TPM_TIS
|
||||
imply VGA_PCI
|
||||
imply VIRTIO_VGA
|
||||
select FDC
|
||||
select I8259
|
||||
select I8254
|
||||
select PCKBD
|
||||
select PCSPK
|
||||
select I82374
|
||||
select I8257
|
||||
select MC146818RTC
|
||||
# Needed by the board code:
|
||||
select PARALLEL
|
||||
# For ACPI builder:
|
||||
select SERIAL_ISA
|
||||
select ACPI_VMGENID
|
||||
|
@ -49,6 +49,7 @@ config PC_ACPI
|
|||
|
||||
config I440FX
|
||||
bool
|
||||
imply E1000_PCI
|
||||
select PC_PCI
|
||||
select PC_ACPI
|
||||
select ACPI_SMBUS
|
||||
|
@ -74,6 +75,7 @@ config Q35
|
|||
bool
|
||||
imply VTD
|
||||
imply AMD_IOMMU
|
||||
imply E1000E_PCI_EXPRESS
|
||||
select PC_PCI
|
||||
select PC_ACPI
|
||||
select PCI_EXPRESS_Q35
|
||||
|
|
|
@ -1485,11 +1485,11 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
|||
|
||||
/* Turn off first then on the other */
|
||||
if (use_iommu) {
|
||||
memory_region_set_enabled(&as->sys_alias, false);
|
||||
memory_region_set_enabled(&as->nodmar, false);
|
||||
memory_region_set_enabled(MEMORY_REGION(&as->iommu), true);
|
||||
} else {
|
||||
memory_region_set_enabled(MEMORY_REGION(&as->iommu), false);
|
||||
memory_region_set_enabled(&as->sys_alias, true);
|
||||
memory_region_set_enabled(&as->nodmar, true);
|
||||
}
|
||||
|
||||
if (take_bql) {
|
||||
|
@ -3286,7 +3286,8 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
|
|||
vtd_dev_as = vtd_bus->dev_as[devfn];
|
||||
|
||||
if (!vtd_dev_as) {
|
||||
snprintf(name, sizeof(name), "intel_iommu_devfn_%d", devfn);
|
||||
snprintf(name, sizeof(name), "vtd-%02x.%x", PCI_SLOT(devfn),
|
||||
PCI_FUNC(devfn));
|
||||
vtd_bus->dev_as[devfn] = vtd_dev_as = g_malloc0(sizeof(VTDAddressSpace));
|
||||
|
||||
vtd_dev_as->bus = bus;
|
||||
|
@ -3295,44 +3296,53 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus, int devfn)
|
|||
vtd_dev_as->context_cache_entry.context_cache_gen = 0;
|
||||
vtd_dev_as->iova_tree = iova_tree_new();
|
||||
|
||||
memory_region_init(&vtd_dev_as->root, OBJECT(s), name, UINT64_MAX);
|
||||
address_space_init(&vtd_dev_as->as, &vtd_dev_as->root, "vtd-root");
|
||||
|
||||
/*
|
||||
* Memory region relationships looks like (Address range shows
|
||||
* only lower 32 bits to make it short in length...):
|
||||
*
|
||||
* |-----------------+-------------------+----------|
|
||||
* | Name | Address range | Priority |
|
||||
* |-----------------+-------------------+----------+
|
||||
* | vtd_root | 00000000-ffffffff | 0 |
|
||||
* | intel_iommu | 00000000-ffffffff | 1 |
|
||||
* | vtd_sys_alias | 00000000-ffffffff | 1 |
|
||||
* | intel_iommu_ir | fee00000-feefffff | 64 |
|
||||
* |-----------------+-------------------+----------|
|
||||
*
|
||||
* We enable/disable DMAR by switching enablement for
|
||||
* vtd_sys_alias and intel_iommu regions. IR region is always
|
||||
* enabled.
|
||||
* Build the DMAR-disabled container with aliases to the
|
||||
* shared MRs. Note that aliasing to a shared memory region
|
||||
* could help the memory API to detect same FlatViews so we
|
||||
* can have devices to share the same FlatView when DMAR is
|
||||
* disabled (either by not providing "intel_iommu=on" or with
|
||||
* "iommu=pt"). It will greatly reduce the total number of
|
||||
* FlatViews of the system hence VM runs faster.
|
||||
*/
|
||||
memory_region_init_alias(&vtd_dev_as->nodmar, OBJECT(s),
|
||||
"vtd-nodmar", &s->mr_nodmar, 0,
|
||||
memory_region_size(&s->mr_nodmar));
|
||||
|
||||
/*
|
||||
* Build the per-device DMAR-enabled container.
|
||||
*
|
||||
* TODO: currently we have per-device IOMMU memory region only
|
||||
* because we have per-device IOMMU notifiers for devices. If
|
||||
* one day we can abstract the IOMMU notifiers out of the
|
||||
* memory regions then we can also share the same memory
|
||||
* region here just like what we've done above with the nodmar
|
||||
* region.
|
||||
*/
|
||||
strcat(name, "-dmar");
|
||||
memory_region_init_iommu(&vtd_dev_as->iommu, sizeof(vtd_dev_as->iommu),
|
||||
TYPE_INTEL_IOMMU_MEMORY_REGION, OBJECT(s),
|
||||
"intel_iommu_dmar",
|
||||
UINT64_MAX);
|
||||
memory_region_init_alias(&vtd_dev_as->sys_alias, OBJECT(s),
|
||||
"vtd_sys_alias", get_system_memory(),
|
||||
0, memory_region_size(get_system_memory()));
|
||||
memory_region_init_io(&vtd_dev_as->iommu_ir, OBJECT(s),
|
||||
&vtd_mem_ir_ops, s, "intel_iommu_ir",
|
||||
VTD_INTERRUPT_ADDR_SIZE);
|
||||
memory_region_init(&vtd_dev_as->root, OBJECT(s),
|
||||
"vtd_root", UINT64_MAX);
|
||||
memory_region_add_subregion_overlap(&vtd_dev_as->root,
|
||||
name, UINT64_MAX);
|
||||
memory_region_init_alias(&vtd_dev_as->iommu_ir, OBJECT(s), "vtd-ir",
|
||||
&s->mr_ir, 0, memory_region_size(&s->mr_ir));
|
||||
memory_region_add_subregion_overlap(MEMORY_REGION(&vtd_dev_as->iommu),
|
||||
VTD_INTERRUPT_ADDR_FIRST,
|
||||
&vtd_dev_as->iommu_ir, 64);
|
||||
address_space_init(&vtd_dev_as->as, &vtd_dev_as->root, name);
|
||||
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
||||
&vtd_dev_as->sys_alias, 1);
|
||||
&vtd_dev_as->iommu_ir, 1);
|
||||
|
||||
/*
|
||||
* Hook both the containers under the root container, we
|
||||
* switch between DMAR & noDMAR by enable/disable
|
||||
* corresponding sub-containers
|
||||
*/
|
||||
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
||||
MEMORY_REGION(&vtd_dev_as->iommu),
|
||||
1);
|
||||
0);
|
||||
memory_region_add_subregion_overlap(&vtd_dev_as->root, 0,
|
||||
&vtd_dev_as->nodmar, 0);
|
||||
|
||||
vtd_switch_address_space(vtd_dev_as);
|
||||
}
|
||||
return vtd_dev_as;
|
||||
|
@ -3676,6 +3686,21 @@ static void vtd_realize(DeviceState *dev, Error **errp)
|
|||
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
|
||||
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
|
||||
"intel_iommu", DMAR_REG_SIZE);
|
||||
|
||||
/* Create the shared memory regions by all devices */
|
||||
memory_region_init(&s->mr_nodmar, OBJECT(s), "vtd-nodmar",
|
||||
UINT64_MAX);
|
||||
memory_region_init_io(&s->mr_ir, OBJECT(s), &vtd_mem_ir_ops,
|
||||
s, "vtd-ir", VTD_INTERRUPT_ADDR_SIZE);
|
||||
memory_region_init_alias(&s->mr_sys_alias, OBJECT(s),
|
||||
"vtd-sys-alias", get_system_memory(), 0,
|
||||
memory_region_size(get_system_memory()));
|
||||
memory_region_add_subregion_overlap(&s->mr_nodmar, 0,
|
||||
&s->mr_sys_alias, 0);
|
||||
memory_region_add_subregion_overlap(&s->mr_nodmar,
|
||||
VTD_INTERRUPT_ADDR_FIRST,
|
||||
&s->mr_ir, 1);
|
||||
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->csrmem);
|
||||
/* No corresponding destroy */
|
||||
s->iotlb = g_hash_table_new_full(vtd_uint64_hash, vtd_uint64_equal,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue