iommu/amd: Don't report firmware bugs with cmd-line ivrs overrides
When the IVRS entries for IOAPIC and HPET are overridden on the kernel command line, a problem detected in the check function might not be a firmware bug anymore. So disable the firmware bug reporting if the user provided valid ivrs_ioapic or ivrs_hpet entries on the command line. Reviewed-by: Shuah Khan <shuahkhan@gmail.com> Signed-off-by: Joerg Roedel <joro@8bytes.org>
This commit is contained in:
parent
440e899805
commit
dfbb6d476d
1 changed files with 16 additions and 3 deletions
|
@ -219,6 +219,7 @@ static struct devid_map __initdata early_ioapic_map[EARLY_MAP_SIZE];
|
||||||
static struct devid_map __initdata early_hpet_map[EARLY_MAP_SIZE];
|
static struct devid_map __initdata early_hpet_map[EARLY_MAP_SIZE];
|
||||||
static int __initdata early_ioapic_map_size;
|
static int __initdata early_ioapic_map_size;
|
||||||
static int __initdata early_hpet_map_size;
|
static int __initdata early_hpet_map_size;
|
||||||
|
static bool __initdata cmdline_maps;
|
||||||
|
|
||||||
static enum iommu_init_state init_state = IOMMU_START_STATE;
|
static enum iommu_init_state init_state = IOMMU_START_STATE;
|
||||||
|
|
||||||
|
@ -1686,18 +1687,28 @@ static void __init free_on_init_error(void)
|
||||||
|
|
||||||
static bool __init check_ioapic_information(void)
|
static bool __init check_ioapic_information(void)
|
||||||
{
|
{
|
||||||
|
const char *fw_bug = FW_BUG;
|
||||||
bool ret, has_sb_ioapic;
|
bool ret, has_sb_ioapic;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
has_sb_ioapic = false;
|
has_sb_ioapic = false;
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we have map overrides on the kernel command line the
|
||||||
|
* messages in this function might not describe firmware bugs
|
||||||
|
* anymore - so be careful
|
||||||
|
*/
|
||||||
|
if (cmdline_maps)
|
||||||
|
fw_bug = "";
|
||||||
|
|
||||||
for (idx = 0; idx < nr_ioapics; idx++) {
|
for (idx = 0; idx < nr_ioapics; idx++) {
|
||||||
int devid, id = mpc_ioapic_id(idx);
|
int devid, id = mpc_ioapic_id(idx);
|
||||||
|
|
||||||
devid = get_ioapic_devid(id);
|
devid = get_ioapic_devid(id);
|
||||||
if (devid < 0) {
|
if (devid < 0) {
|
||||||
pr_err(FW_BUG "AMD-Vi: IOAPIC[%d] not in IVRS table\n", id);
|
pr_err("%sAMD-Vi: IOAPIC[%d] not in IVRS table\n",
|
||||||
|
fw_bug, id);
|
||||||
ret = false;
|
ret = false;
|
||||||
} else if (devid == IOAPIC_SB_DEVID) {
|
} else if (devid == IOAPIC_SB_DEVID) {
|
||||||
has_sb_ioapic = true;
|
has_sb_ioapic = true;
|
||||||
|
@ -1714,11 +1725,11 @@ static bool __init check_ioapic_information(void)
|
||||||
* when the BIOS is buggy and provides us the wrong
|
* when the BIOS is buggy and provides us the wrong
|
||||||
* device id for the IOAPIC in the system.
|
* device id for the IOAPIC in the system.
|
||||||
*/
|
*/
|
||||||
pr_err(FW_BUG "AMD-Vi: No southbridge IOAPIC found in IVRS table\n");
|
pr_err("%sAMD-Vi: No southbridge IOAPIC found\n", fw_bug);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
pr_err("AMD-Vi: Disabling interrupt remapping due to BIOS Bug(s)\n");
|
pr_err("AMD-Vi: Disabling interrupt remapping\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2166,6 +2177,7 @@ static int __init parse_ivrs_ioapic(char *str)
|
||||||
|
|
||||||
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
||||||
|
|
||||||
|
cmdline_maps = true;
|
||||||
i = early_ioapic_map_size++;
|
i = early_ioapic_map_size++;
|
||||||
early_ioapic_map[i].id = id;
|
early_ioapic_map[i].id = id;
|
||||||
early_ioapic_map[i].devid = devid;
|
early_ioapic_map[i].devid = devid;
|
||||||
|
@ -2195,6 +2207,7 @@ static int __init parse_ivrs_hpet(char *str)
|
||||||
|
|
||||||
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
||||||
|
|
||||||
|
cmdline_maps = true;
|
||||||
i = early_hpet_map_size++;
|
i = early_hpet_map_size++;
|
||||||
early_hpet_map[i].id = id;
|
early_hpet_map[i].id = id;
|
||||||
early_hpet_map[i].devid = devid;
|
early_hpet_map[i].devid = devid;
|
||||||
|
|
Loading…
Add table
Reference in a new issue