IOAPIC[0] not in IVRS table
I have a fresh Ubuntu install from USB. When I boot the PC it takes me straight to GNU Grub, when I select Ubuntu I get the following messages.
[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping
I can get to the Ubuntu desktop via "Advanced options for Ubuntu" > "Ubuntu, with Linux 4.2.0-30-generic (recovery mode)" > "resume" but the CPU runs at nearly 100% and is not sustinable.
PC Specs:
AMD A6-6400K
MSI A68HI Mini ITX FM2+ Motherboard
The reason the CPU is all the time 100% used I think it is different than the message you are seeing.
About the error message
Now about AMD-Vi: IOAPIC[0] not in IVRS table
and AMD-Vi: No southbridge IOAPIC found in IVRS table
errors. Those messages mean that your CMOS/BIOS setup is configured to enable IOMMU, but BIOS lacks IVRS table that is describing which is the address of IOMMU and SMBus Controller. IVRS = I/O Virtualization Reporting Structure. See also: http://support.amd.com/TechDocs/48882_IOMMU.pdf
What is IOMMU?
IOMMU is a hardware unit that today is part of CPU. It allows to map device-visible virtual addresses to physical addresses.
Why IOMMU?
- IOMMU allows to have better security and protect your computer from some attacks from someone having access to some busses like PCIe and firewire.
- you can expose a physical PCIe device to a VM (PCI passthrough).
- it is required for SR-IOV (VNF)
Fixing "AMD-Vi: IOAPIC[0] not in IVRS table"
- Update motherboard firmware
The proper fix should come from hardware manufacturer of the motherboard. So if you have a BIOS/firmware update for your motherboard, install it as this might fix the problem. Unfortunately for my motherboard (Asus Crosshair V Formula) the IVRS is broken even in the latest BIOS/firmware update (version 1703, Release Date: 10/17/2012).
- Linux workarround
If the manufacturer of the MB is not offering a fix, you can fix this in Linux by specifying in the kernel startup parameters where those devices are located using ivrs_ioapic
option.
Here are the steps to do it. For more details see: https://ubuntuforums.org/showthread.php?t=2254677
Boot your kernel by adding amd_iommu_dump=1
to the kernel options. You can do this via grub menu during boot.
In the kernel log, you will see some lines like:
$ dmesg |grep 'DEV_SPECIAL(IOAPIC\|not in IVRS table'
[ 0.133756] AMD-Vi: DEV_SPECIAL(IOAPIC[0]) devid: 00:14.0
[ 0.133995] AMD-Vi: DEV_SPECIAL(IOAPIC[255]) devid: 00:00.1
[ 0.134116] [Firmware Bug]: AMD-Vi: IOAPIC[5] not in IVRS table
[ 0.134235] [Firmware Bug]: AMD-Vi: IOAPIC[6] not in IVRS table
$
Write down the indexes from IOAPIC
. In this case those are 5
and 6
. Note the devid, where 00:14.0
is ok and 00:00.1
is incorrect.
Search for the bus address for those devices and write down the addresses (00:00.2
and 00:14.0
)
$ lspci -nn | egrep "SMBus | IOMMU"
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD/ATI] RD890S/RD990 I/O Memory Management Unit (IOMMU) [1002:5a23]
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller [1002:4385] (rev 42)
$
Now add as kernel parameters: ivrs_ioapic[5]=00:14.0 ivrs_ioapic[6]=00:00.2
where index 5
and 6
were found in dmesg output and the values are from lspci output. You can make this permanent by editing /etc/default/grub
file, then running grub2-mkconfig -o /boot/grub2/grub.cfg
.
- Disable IOMMU in UEFI/BIOS configuration
Disabling IOMMU has a small performance benefit. But it is undesirable to disable it for security and stability of the system. IOMMU is required for certain virtualization setups (PCI pass-through, SR-IOV) and disabling it is not an option.
I updated the firmware of my motherboard and this has appeared to have fixed it.