[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] AMD/IOMMU: obtain IVHD type to use earlier
commit d8bd82327b0fffb16841862192e826fcb1344d8c Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Oct 15 12:44:20 2021 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Oct 15 12:44:20 2021 +0200 AMD/IOMMU: obtain IVHD type to use earlier Doing this in amd_iommu_prepare() is too late for it, in particular, to be used in amd_iommu_detect_one_acpi(), as a subsequent change will want to do. Moving it immediately ahead of amd_iommu_detect_acpi() is (luckily) pretty simple, (pretty importantly) without breaking amd_iommu_prepare()'s logic to prevent multiple processing. This involves moving table checksumming, as amd_iommu_get_supported_ivhd_type() -> get_supported_ivhd_type() will now be invoked before amd_iommu_detect_acpi() -> detect_iommu_acpi(). In the course of doing so stop open-coding acpi_tb_checksum(), seeing that we have other uses of this originally ACPI-private function elsewhere in the tree. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> --- xen/drivers/passthrough/amd/iommu_acpi.c | 24 +++++++++++------------- xen/drivers/passthrough/amd/iommu_init.c | 8 +------- xen/drivers/passthrough/amd/pci_amd_iommu.c | 8 ++++++++ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c b/xen/drivers/passthrough/amd/iommu_acpi.c index 53f4b61d0d..fdc601d498 100644 --- a/xen/drivers/passthrough/amd/iommu_acpi.c +++ b/xen/drivers/passthrough/amd/iommu_acpi.c @@ -22,6 +22,8 @@ #include <asm/io_apic.h> +#include <acpi/actables.h> + #include "iommu.h" /* Some helper structures, particularly to deal with ranges. */ @@ -1167,20 +1169,7 @@ static int __init parse_ivrs_table(struct acpi_table_header *table) static int __init detect_iommu_acpi(struct acpi_table_header *table) { const struct acpi_ivrs_header *ivrs_block; - unsigned long i; unsigned long length = sizeof(struct acpi_table_ivrs); - u8 checksum, *raw_table; - - /* validate checksum: sum of entire table == 0 */ - checksum = 0; - raw_table = (u8 *)table; - for ( i = 0; i < table->length; i++ ) - checksum += raw_table[i]; - if ( checksum ) - { - AMD_IOMMU_DEBUG("IVRS Error: Invalid Checksum %#x\n", checksum); - return -ENODEV; - } while ( table->length > (length + sizeof(*ivrs_block)) ) { @@ -1317,6 +1306,15 @@ get_supported_ivhd_type(struct acpi_table_header *table) { size_t length = sizeof(struct acpi_table_ivrs); const struct acpi_ivrs_header *ivrs_block, *blk = NULL; + uint8_t checksum; + + /* Validate checksum: Sum of entire table == 0. */ + checksum = acpi_tb_checksum(ACPI_CAST_PTR(uint8_t, table), table->length); + if ( checksum ) + { + AMD_IOMMU_DEBUG("IVRS Error: Invalid Checksum %#x\n", checksum); + return -ENODEV; + } while ( table->length > (length + sizeof(*ivrs_block)) ) { diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index 312f335c1d..7eb5013756 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -1398,15 +1398,9 @@ int __init amd_iommu_prepare(bool xt) goto error_out; /* Have we been here before? */ - if ( ivhd_type ) + if ( ivrs_bdf_entries ) return 0; - rc = amd_iommu_get_supported_ivhd_type(); - if ( rc < 0 ) - goto error_out; - BUG_ON(!rc); - ivhd_type = rc; - rc = amd_iommu_get_ivrs_dev_entries(); if ( !rc ) rc = -ENODEV; diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index 86e4864e5d..de04ce90ad 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -179,9 +179,17 @@ static int __must_check amd_iommu_setup_domain_device( int __init acpi_ivrs_init(void) { + int rc; + if ( !iommu_enable && !iommu_intremap ) return 0; + rc = amd_iommu_get_supported_ivhd_type(); + if ( rc < 0 ) + return rc; + BUG_ON(!rc); + ivhd_type = rc; + if ( (amd_iommu_detect_acpi() !=0) || (iommu_found() == 0) ) { iommu_intremap = iommu_intremap_off; -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |