|
[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 |