i386: acpi: add IVHD device entry for IOAPIC
When interrupt remapping is enabled, add a special IVHD device (type IOAPIC). Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Acked-by: Peter Xu <peterx@redhat.com> Cc: Peter Xu <peterx@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Richard Henderson <rth@twiddle.net> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Cc: Tom Lendacky <Thomas.Lendacky@amd.com> Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
b44159fe00
commit
c028818d57
|
@ -2467,9 +2467,12 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
|
||||||
* IVRS table as specified in AMD IOMMU Specification v2.62, Section 5.2
|
* IVRS table as specified in AMD IOMMU Specification v2.62, Section 5.2
|
||||||
* accessible here http://support.amd.com/TechDocs/48882_IOMMU.pdf
|
* accessible here http://support.amd.com/TechDocs/48882_IOMMU.pdf
|
||||||
*/
|
*/
|
||||||
|
#define IOAPIC_SB_DEVID (uint64_t)PCI_BUILD_BDF(0, PCI_DEVFN(0x14, 0))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
||||||
{
|
{
|
||||||
|
int ivhd_table_len = 28;
|
||||||
int iommu_start = table_data->len;
|
int iommu_start = table_data->len;
|
||||||
AMDVIState *s = AMD_IOMMU_DEVICE(x86_iommu_get_default());
|
AMDVIState *s = AMD_IOMMU_DEVICE(x86_iommu_get_default());
|
||||||
|
|
||||||
|
@ -2491,8 +2494,16 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
||||||
(1UL << 6) | /* PrefSup */
|
(1UL << 6) | /* PrefSup */
|
||||||
(1UL << 7), /* PPRSup */
|
(1UL << 7), /* PPRSup */
|
||||||
1);
|
1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When interrupt remapping is supported, we add a special IVHD device
|
||||||
|
* for type IO-APIC.
|
||||||
|
*/
|
||||||
|
if (x86_iommu_get_default()->intr_supported) {
|
||||||
|
ivhd_table_len += 8;
|
||||||
|
}
|
||||||
/* IVHD length */
|
/* IVHD length */
|
||||||
build_append_int_noprefix(table_data, 28, 2);
|
build_append_int_noprefix(table_data, ivhd_table_len, 2);
|
||||||
/* DeviceID */
|
/* DeviceID */
|
||||||
build_append_int_noprefix(table_data, s->devid, 2);
|
build_append_int_noprefix(table_data, s->devid, 2);
|
||||||
/* Capability offset */
|
/* Capability offset */
|
||||||
|
@ -2516,6 +2527,21 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
||||||
*/
|
*/
|
||||||
build_append_int_noprefix(table_data, 0x0000001, 4);
|
build_append_int_noprefix(table_data, 0x0000001, 4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a special IVHD device type.
|
||||||
|
* Refer to spec - Table 95: IVHD device entry type codes
|
||||||
|
*
|
||||||
|
* Linux IOMMU driver checks for the special IVHD device (type IO-APIC).
|
||||||
|
* See Linux kernel commit 'c2ff5cf5294bcbd7fa50f7d860e90a66db7e5059'
|
||||||
|
*/
|
||||||
|
if (x86_iommu_get_default()->intr_supported) {
|
||||||
|
build_append_int_noprefix(table_data,
|
||||||
|
(0x1ull << 56) | /* type IOAPIC */
|
||||||
|
(IOAPIC_SB_DEVID << 40) | /* IOAPIC devid */
|
||||||
|
0x48, /* special device */
|
||||||
|
8);
|
||||||
|
}
|
||||||
|
|
||||||
build_header(linker, table_data, (void *)(table_data->data + iommu_start),
|
build_header(linker, table_data, (void *)(table_data->data + iommu_start),
|
||||||
"IVRS", table_data->len - iommu_start, 1, NULL, NULL);
|
"IVRS", table_data->len - iommu_start, 1, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue