forked from Freescale/linux-fslc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems
[ Upstream commit 93d0515 ] Raven Ridge systems may have malfunction touchpad or hang at boot if incorrect IVRS IOAPIC is provided by BIOS. Users already found correct "ivrs_ioapic=" values, let's put them inside kernel to workaround buggy BIOS. BugLink: https://bugs.launchpad.net/bugs/1795292 BugLink: https://bugs.launchpad.net/bugs/1837688 Reported-by: kbuild test robot <[email protected]> Signed-off-by: Kai-Heng Feng <[email protected]> Signed-off-by: Joerg Roedel <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
- Loading branch information
Showing
4 changed files
with
111 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
|
||
#ifndef AMD_IOMMU_H | ||
#define AMD_IOMMU_H | ||
|
||
int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line); | ||
|
||
#ifdef CONFIG_DMI | ||
void amd_iommu_apply_ivrs_quirks(void); | ||
#else | ||
static void amd_iommu_apply_ivrs_quirks(void) { } | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
|
||
/* | ||
* Quirks for AMD IOMMU | ||
* | ||
* Copyright (C) 2019 Kai-Heng Feng <[email protected]> | ||
*/ | ||
|
||
#ifdef CONFIG_DMI | ||
#include <linux/dmi.h> | ||
|
||
#include "amd_iommu.h" | ||
|
||
#define IVHD_SPECIAL_IOAPIC 1 | ||
|
||
struct ivrs_quirk_entry { | ||
u8 id; | ||
u16 devid; | ||
}; | ||
|
||
enum { | ||
DELL_INSPIRON_7375 = 0, | ||
DELL_LATITUDE_5495, | ||
LENOVO_IDEAPAD_330S_15ARR, | ||
}; | ||
|
||
static const struct ivrs_quirk_entry ivrs_ioapic_quirks[][3] __initconst = { | ||
/* ivrs_ioapic[4]=00:14.0 ivrs_ioapic[5]=00:00.2 */ | ||
[DELL_INSPIRON_7375] = { | ||
{ .id = 4, .devid = 0xa0 }, | ||
{ .id = 5, .devid = 0x2 }, | ||
{} | ||
}, | ||
/* ivrs_ioapic[4]=00:14.0 */ | ||
[DELL_LATITUDE_5495] = { | ||
{ .id = 4, .devid = 0xa0 }, | ||
{} | ||
}, | ||
/* ivrs_ioapic[32]=00:14.0 */ | ||
[LENOVO_IDEAPAD_330S_15ARR] = { | ||
{ .id = 32, .devid = 0xa0 }, | ||
{} | ||
}, | ||
{} | ||
}; | ||
|
||
static int __init ivrs_ioapic_quirk_cb(const struct dmi_system_id *d) | ||
{ | ||
const struct ivrs_quirk_entry *i; | ||
|
||
for (i = d->driver_data; i->id != 0 && i->devid != 0; i++) | ||
add_special_device(IVHD_SPECIAL_IOAPIC, i->id, (u16 *)&i->devid, 0); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct dmi_system_id ivrs_quirks[] __initconst = { | ||
{ | ||
.callback = ivrs_ioapic_quirk_cb, | ||
.ident = "Dell Inspiron 7375", | ||
.matches = { | ||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7375"), | ||
}, | ||
.driver_data = (void *)&ivrs_ioapic_quirks[DELL_INSPIRON_7375], | ||
}, | ||
{ | ||
.callback = ivrs_ioapic_quirk_cb, | ||
.ident = "Dell Latitude 5495", | ||
.matches = { | ||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 5495"), | ||
}, | ||
.driver_data = (void *)&ivrs_ioapic_quirks[DELL_LATITUDE_5495], | ||
}, | ||
{ | ||
.callback = ivrs_ioapic_quirk_cb, | ||
.ident = "Lenovo ideapad 330S-15ARR", | ||
.matches = { | ||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
DMI_MATCH(DMI_PRODUCT_NAME, "81FB"), | ||
}, | ||
.driver_data = (void *)&ivrs_ioapic_quirks[LENOVO_IDEAPAD_330S_15ARR], | ||
}, | ||
{} | ||
}; | ||
|
||
void __init amd_iommu_apply_ivrs_quirks(void) | ||
{ | ||
dmi_check_system(ivrs_quirks); | ||
} | ||
#endif |