AMD-vi: Mixed format IVHD block should replace fixed format IVHD block

This fixes double IVHD_SETUP_INTR calls on the same IOMMU device.

Sponsored by:	The FreeBSD Foundation
MFC with:	74ada297e8
Reported by:	Oleg Ginzburg <olevole@olevole.ru>
Reviewed by:	grehan
Approved by:	philip (mentor)
Differential Revision:	https://reviews.freebsd.org/D29521
This commit is contained in:
Ka Ho Ng 2021-04-01 09:15:19 +08:00
parent 5a18515b31
commit 03efa462b2

View File

@ -312,14 +312,22 @@ ivhd_dev_parse(ACPI_IVRS_HARDWARE1 *ivhd, struct amdvi_softc *softc)
static bool static bool
ivhd_is_newer(ACPI_IVRS_HEADER *old, ACPI_IVRS_HEADER *new) ivhd_is_newer(ACPI_IVRS_HEADER *old, ACPI_IVRS_HEADER *new)
{ {
/* if (old->DeviceId == new->DeviceId) {
* Newer IVRS header type take precedence. /*
*/ * Newer IVRS header type take precedence.
if ((old->DeviceId == new->DeviceId) && */
(old->Type == IVRS_TYPE_HARDWARE_LEGACY) && if (old->Type == IVRS_TYPE_HARDWARE_LEGACY &&
((new->Type == IVRS_TYPE_HARDWARE_EFR) || ((new->Type == IVRS_TYPE_HARDWARE_EFR) ||
(new->Type == IVRS_TYPE_HARDWARE_MIXED))) { (new->Type == IVRS_TYPE_HARDWARE_MIXED)))
return (true); return (true);
/*
* Mixed format IVHD header type take precedence
* over fixed format IVHD header types.
*/
if (old->Type == IVRS_TYPE_HARDWARE_EFR &&
new->Type == IVRS_TYPE_HARDWARE_MIXED)
return (true);
} }
return (false); return (false);