2023-05-15 14:40:01

by Bui Quang Minh

[permalink] [raw]
Subject: amd-iommu: get_highest_supported_ivhd_type question

Hello everyone,

Since this commit 8c7142f56fedfc6824b5bca56fee1f443e01746b (iommu/amd:
Use the most comprehensive IVHD type that the driver can support),
amd_iommu driver can support IVHD type 0x11 and 0x40 beside old type
0x10. This commit introduces a new function to determine the appropriate
IVHD type

/**
* get_highest_supported_ivhd_type - Look up the appropriate IVHD type
* @ivrs Pointer to the IVRS header
*
* This function search through all IVDB of the maximum supported IVHD
*/
static u8 get_highest_supported_ivhd_type(struct acpi_table_header *ivrs)
{
u8 *base = (u8 *)ivrs;
struct ivhd_header *ivhd = (struct ivhd_header *)
(base + IVRS_HEADER_LENGTH);
u8 last_type = ivhd->type;
u16 devid = ivhd->devid;

while (((u8 *)ivhd - base < ivrs->length) &&
(ivhd->type <= ACPI_IVHD_TYPE_MAX_SUPPORTED)) {
u8 *p = (u8 *) ivhd;

if (ivhd->devid == devid)
last_type = ivhd->type;
ivhd = (struct ivhd_header *)(p + ivhd->length);
}

return last_type;
}

As the name and comment suggest, the driver is intended to use the
highest IVHD type provided in ACPI table. However, looking at the
implementation, I see that it chooses to use the last IVHD type of the
first devid appears in the ACPI table. Are there any reasons behind this
implementation?

Thank you,
Quang Minh.