mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
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@suse.com> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
1 parent
1223c4c0c4
commit
d8bd82327b
3 files changed
+20
-20
No files matched your search
@@ -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)) )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||