提交 dfbb6d47 编写于 作者: J Joerg Roedel

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: NShuah Khan <shuahkhan@gmail.com>
Signed-off-by: NJoerg Roedel <joro@8bytes.org>
上级 440e8998
...@@ -219,6 +219,7 @@ static struct devid_map __initdata early_ioapic_map[EARLY_MAP_SIZE]; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册