[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] iommu/amd-vi: do not error if device referenced in IVMD is not behind any IOMMU
On Tue, Oct 08, 2024 at 04:01:28PM +0200, Jan Beulich wrote: > On 08.10.2024 12:47, Roger Pau Monne wrote: > > IVMD table contains restrictions about memory which must be mandatory > > assigned > > to devices (and which permissions it should use), or memory that should be > > never accessible to devices. > > > > Some hardware however contains ranges in IVMD that reference devices > > outside of > > the IVHD tables (in other words, devices not behind any IOMMU). Such > > mismatch > > will cause Xen to fail in register_range_for_device(), ultimately leading to > > the IOMMU being disabled, and Xen crashing as x2APIC support might be > > already > > enabled and relying on the IOMMU functionality. > > I find it hard to believe that on x86 systems with IOMMUs some devices would > be left uncovered by any IOMMU. Is it possible that IVHD is flawed there? In > which case we might rightfully refuse to boot? (Can you share e.g. that > "iommu=debug" output that results from parsing the tables on that system?) I'm afraid I don't have any of such systems to test myself, however I have the contents of IVRS: ACPI Table Header ------------------------------------------------------------------ Signature : IVRS Length : 0x000001F8 Revision : 0x02 Checksum : 0x06 OEM ID : AMD OEM Table ID : AmdTable OEM Revision : 0x00000001 Creator ID : AMD Creator Revision : 0x00000001 IVinfo : 0x00203043 IVHD ---------------------------------------------------------------- Type : 0x10 Flags : 0xB0 Length : 0x0044 IOMMU Device ID : 0x0002 Capability Offset : 0x0040 IOMMU Base Address : 0x00000000FD200000 Segment Group : 0x0000 IOMMU Info : 0x0000 IOMMU Feature Info : 0x80048F6E Range -------------------------------------------------- Type : 0x03 Start of Range : 0x0003 End of Range : 0xFFFE DTE Setting : 0x00 Alias Range -------------------------------------------------- Type : 0x43 Start of Range : 0xFF00 End of Range : 0xFFFF DTE Setting : 0x00 Source Device ID : 0x00A5 Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x00A0 Handle : 0x00 Variety : HPET Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0xD7 Source Device ID : 0x00A0 Handle : 0x21 Variety : IOAPIC Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x0001 Handle : 0x22 Variety : IOAPIC IVHD ---------------------------------------------------------------- Type : 0x11 Flags : 0x30 Length : 0x0054 IOMMU Device ID : 0x0002 Capability Offset : 0x0040 IOMMU Base Address : 0x00000000FD200000 Segment Group : 0x0000 IOMMU Info : 0x0000 IOMMU Feature Info : 0x00048000 Range -------------------------------------------------- Type : 0x03 Start of Range : 0x0003 End of Range : 0xFFFE DTE Setting : 0x00 Alias Range -------------------------------------------------- Type : 0x43 Start of Range : 0xFF00 End of Range : 0xFFFF DTE Setting : 0x00 Source Device ID : 0x00A5 Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x00A0 Handle : 0x00 Variety : HPET Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0xD7 Source Device ID : 0x00A0 Handle : 0x21 Variety : IOAPIC Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x0001 Handle : 0x22 Variety : IOAPIC IVMD ---------------------------------------------------------------- Type : 0x22 Flags : 0x08 Length : 0x0020 DeviceID : 0x0000 AuxiliaryData : 0x0FFF Reserved : 0x0000000000000000 IVMD Start Address : 0x0000000096191000 IVMD Memory Block Length : 0x0000000000000022 IVMD ---------------------------------------------------------------- Type : 0x22 Flags : 0x08 Length : 0x0020 DeviceID : 0x0000 AuxiliaryData : 0x0FFF Reserved : 0x0000000000000000 IVMD Start Address : 0x0000000097D9E000 IVMD Memory Block Length : 0x0000000000000022 IVMD ---------------------------------------------------------------- Type : 0x22 Flags : 0x08 Length : 0x0020 DeviceID : 0x0000 AuxiliaryData : 0x0FFF Reserved : 0x0000000000000000 IVMD Start Address : 0x0000000097D9D000 IVMD Memory Block Length : 0x0000000000000022 IVHD ---------------------------------------------------------------- Type : 0x40 Flags : 0x30 Length : 0x00D0 IOMMU Device ID : 0x0002 Capability Offset : 0x0040 IOMMU Base Address : 0x00000000FD200000 Segment Group : 0x0000 IOMMU Info : 0x0000 IOMMU Feature Info : 0x00048000 Range -------------------------------------------------- Type : 0x03 Start of Range : 0x0003 End of Range : 0xFFFE DTE Setting : 0x00 Alias Range -------------------------------------------------- Type : 0x43 Start of Range : 0xFF00 End of Range : 0xFFFF DTE Setting : 0x00 Source Device ID : 0x00A5 Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x00A0 Handle : 0x00 Variety : HPET Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0xD7 Source Device ID : 0x00A0 Handle : 0x21 Variety : IOAPIC Special Device -------------------------------------------------- Type : 0x48 Device ID : 0x0000 DTE Setting : 0x00 Source Device ID : 0x0001 Handle : 0x22 Variety : IOAPIC Variable Length ACPI HID Device -------------------------------------------------- Type : 0xF0 Device ID : 0x00A5 DTE Setting : 0x40 Hardware ID : AMDI0020 Extended DTE Setting : Unique ID Format : 2 Unique ID Length : 9 Unique ID : \_SB.FUR0 Variable Length ACPI HID Device -------------------------------------------------- Type : 0xF0 Device ID : 0x00A5 DTE Setting : 0x40 Hardware ID : AMDI0020 Extended DTE Setting : Unique ID Format : 2 Unique ID Length : 9 Unique ID : \_SB.FUR1 Variable Length ACPI HID Device -------------------------------------------------- Type : 0xF0 Device ID : 0x00A5 DTE Setting : 0x40 Hardware ID : AMDI0020 Extended DTE Setting : Unique ID Format : 2 Unique ID Length : 9 Unique ID : \_SB.FUR2 Variable Length ACPI HID Device -------------------------------------------------- Type : 0xF0 Device ID : 0x00A5 DTE Setting : 0x40 Hardware ID : AMDI0020 Extended DTE Setting : Unique ID Format : 2 Unique ID Length : 9 Unique ID : \_SB.FUR3 FWIW, I've checked on one of the AMD server systems we have on the lab, and the IVHD entries are fairly similar to the ones here, as neither the PCI Host Bridge, nor the IOMMU are covered by any IVHD block. That system however doesn't have any IVMD blocks. > > Relax IVMD parsing: allow IVMD blocks to reference devices not assigned to > > any > > IOMMU. It's impossible for Xen to fulfill the requirement in the IVMD > > block if > > the device is not behind any IOMMU, but it's no worse than booting without > > IOMMU support, and thus not parsing ACPI IVRS in the first place. > > > > Reported-by: Willi Junga <xenproject@xxxxxx> > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > > --- > > xen/drivers/passthrough/amd/iommu_acpi.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c > > b/xen/drivers/passthrough/amd/iommu_acpi.c > > index 3f5508eba049..c416120326c9 100644 > > --- a/xen/drivers/passthrough/amd/iommu_acpi.c > > +++ b/xen/drivers/passthrough/amd/iommu_acpi.c > > @@ -248,8 +248,9 @@ static int __init register_range_for_device( > > iommu = find_iommu_for_device(seg, bdf); > > if ( !iommu ) > > { > > - AMD_IOMMU_ERROR("IVMD: no IOMMU for Dev_Id %#x\n", bdf); > > - return -ENODEV; > > + AMD_IOMMU_WARN("IVMD: no IOMMU for device %pp - ignoring > > constrain\n", > > I'm not a native speaker, but "constrain" to me can only be a verb (with > "constraint" being the noun). IOW as worded I'm afraid I can't make sense > of the message. Indeed, sorry for the typo. > > + &PCI_SBDF(seg, bdf)); > > + return 0; > > } > > req = ivrs_mappings[bdf].dte_requestor_id; > > > > Down from here in parse_ivmd_device_iommu() is somewhat similar code. > Wouldn't that need adjusting similarly then? Or else shouldn't the > adjustment above be accompanied by a comment clarifying that the > behavior is just because of observations on certain hardware? Hm, I think that one is bogus and should be removed, according to my copy of the AMD-Vi spec (48882—Rev 3.08-PUB—Oct 2023), the IVMD type can only be: 20h=all peripherals 21h=specified peripheral 22h=peripheral range So type 23h (ACPI_IVRS_TYPE_MEMORY_IOMMU) is not a valid type for the IVMD blocks. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |