mirror of https://github.com/xemu-project/xemu.git
acpi: add ATSR for q35
This patch provides ATSR which was a requirement for software that wants to enable ATS on endpoint devices behind a Root Port. This is done simply by setting ALL_PORTS which indicates all PCI-Express Root Ports support ATS transactions. Signed-off-by: Jason Wang <jasowang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
615c4ed205
commit
bd2baaccd5
|
@ -2575,6 +2575,7 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
|
||||||
|
|
||||||
AcpiTableDmar *dmar;
|
AcpiTableDmar *dmar;
|
||||||
AcpiDmarHardwareUnit *drhd;
|
AcpiDmarHardwareUnit *drhd;
|
||||||
|
AcpiDmarRootPortATS *atsr;
|
||||||
uint8_t dmar_flags = 0;
|
uint8_t dmar_flags = 0;
|
||||||
X86IOMMUState *iommu = x86_iommu_get_default();
|
X86IOMMUState *iommu = x86_iommu_get_default();
|
||||||
AcpiDmarDeviceScope *scope = NULL;
|
AcpiDmarDeviceScope *scope = NULL;
|
||||||
|
@ -2608,6 +2609,14 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
|
||||||
scope->path[0].device = PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC);
|
scope->path[0].device = PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC);
|
||||||
scope->path[0].function = PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC);
|
scope->path[0].function = PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC);
|
||||||
|
|
||||||
|
if (iommu->dt_supported) {
|
||||||
|
atsr = acpi_data_push(table_data, sizeof(*atsr));
|
||||||
|
atsr->type = cpu_to_le16(ACPI_DMAR_TYPE_ATSR);
|
||||||
|
atsr->length = cpu_to_le16(sizeof(*atsr));
|
||||||
|
atsr->flags = ACPI_DMAR_ATSR_ALL_PORTS;
|
||||||
|
atsr->pci_segment = cpu_to_le16(0);
|
||||||
|
}
|
||||||
|
|
||||||
build_header(linker, table_data, (void *)(table_data->data + dmar_start),
|
build_header(linker, table_data, (void *)(table_data->data + dmar_start),
|
||||||
"DMAR", table_data->len - dmar_start, 1, NULL, NULL);
|
"DMAR", table_data->len - dmar_start, 1, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -627,8 +627,20 @@ struct AcpiDmarHardwareUnit {
|
||||||
} QEMU_PACKED;
|
} QEMU_PACKED;
|
||||||
typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
|
typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
|
||||||
|
|
||||||
|
/* Type 2: Root Port ATS Capability Reporting Structure */
|
||||||
|
struct AcpiDmarRootPortATS {
|
||||||
|
uint16_t type;
|
||||||
|
uint16_t length;
|
||||||
|
uint8_t flags;
|
||||||
|
uint8_t reserved;
|
||||||
|
uint16_t pci_segment;
|
||||||
|
AcpiDmarDeviceScope scope[0];
|
||||||
|
} QEMU_PACKED;
|
||||||
|
typedef struct AcpiDmarRootPortATS AcpiDmarRootPortATS;
|
||||||
|
|
||||||
/* Masks for Flags field above */
|
/* Masks for Flags field above */
|
||||||
#define ACPI_DMAR_INCLUDE_PCI_ALL 1
|
#define ACPI_DMAR_INCLUDE_PCI_ALL 1
|
||||||
|
#define ACPI_DMAR_ATSR_ALL_PORTS 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Input Output Remapping Table (IORT)
|
* Input Output Remapping Table (IORT)
|
||||||
|
|
Loading…
Reference in New Issue