Re: [PATCH v2] iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems

2019-08-19 Thread kbuild test robot
Hi Kai-Heng,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[cannot apply to v5.3-rc5 next-20190816]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:
https://github.com/0day-ci/linux/commits/Kai-Heng-Feng/iommu-amd-Override-wrong-IVRS-IOAPIC-on-Raven-Ridge-systems/20190819-133843
config: x86_64-randconfig-f001-201933 (attached as .config)
compiler: gcc-7 (Debian 7.4.0-10) 7.4.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot 

All errors (new ones prefixed by >>):

>> drivers//iommu/amd_iommu_quirks.c:87:13: error: redefinition of 
>> 'amd_iommu_apply_ivrs_quirks'
void __init amd_iommu_apply_ivrs_quirks(void)
^~~
   In file included from drivers//iommu/amd_iommu_quirks.c:11:0:
   drivers//iommu/amd_iommu.h:11:13: note: previous definition of 
'amd_iommu_apply_ivrs_quirks' was here
static void amd_iommu_apply_ivrs_quirks(void) { }
^~~
   drivers//iommu/amd_iommu.h:11:13: warning: 'amd_iommu_apply_ivrs_quirks' 
defined but not used [-Wunused-function]

vim +/amd_iommu_apply_ivrs_quirks +87 drivers//iommu/amd_iommu_quirks.c

86  
  > 87  void __init amd_iommu_apply_ivrs_quirks(void)

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: application/gzip
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

[PATCH v2] iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems

2019-08-17 Thread Kai-Heng Feng
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
Signed-off-by: Kai-Heng Feng 
---
v2:
Split the quirk to another file.

 drivers/iommu/Makefile   |  2 +-
 drivers/iommu/amd_iommu.h| 14 +
 drivers/iommu/amd_iommu_init.c   |  5 +-
 drivers/iommu/amd_iommu_quirks.c | 90 
 4 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 drivers/iommu/amd_iommu.h
 create mode 100644 drivers/iommu/amd_iommu_quirks.c

diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile
index f13f36ae1af6..c6a277e69848 100644
--- a/drivers/iommu/Makefile
+++ b/drivers/iommu/Makefile
@@ -10,7 +10,7 @@ obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o
 obj-$(CONFIG_IOMMU_IOVA) += iova.o
 obj-$(CONFIG_OF_IOMMU) += of_iommu.o
 obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o
-obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o
+obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o amd_iommu_quirks.o
 obj-$(CONFIG_AMD_IOMMU_DEBUGFS) += amd_iommu_debugfs.o
 obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o
 obj-$(CONFIG_ARM_SMMU) += arm-smmu.o
diff --git a/drivers/iommu/amd_iommu.h b/drivers/iommu/amd_iommu.h
new file mode 100644
index ..12d540d9b59b
--- /dev/null
+++ b/drivers/iommu/amd_iommu.h
@@ -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
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 4413aa67000e..568c52317757 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -32,6 +32,7 @@
 #include 
 
 #include 
+#include "amd_iommu.h"
 #include "amd_iommu_proto.h"
 #include "amd_iommu_types.h"
 #include "irq_remapping.h"
@@ -1002,7 +1003,7 @@ static void __init set_dev_entry_from_acpi(struct 
amd_iommu *iommu,
set_iommu_for_device(iommu, devid);
 }
 
-static int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line)
+int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line)
 {
struct devid_map *entry;
struct list_head *list;
@@ -1153,6 +1154,8 @@ static int __init init_iommu_from_acpi(struct amd_iommu 
*iommu,
if (ret)
return ret;
 
+   amd_iommu_apply_ivrs_quirks();
+
/*
 * First save the recommended feature enable bits from ACPI
 */
diff --git a/drivers/iommu/amd_iommu_quirks.c b/drivers/iommu/amd_iommu_quirks.c
new file mode 100644
index ..14181f0f5c2a
--- /dev/null
+++ b/drivers/iommu/amd_iommu_quirks.c
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+/*
+ * Quirks for AMD IOMMU
+ *
+ * Copyright (C) 2019 Kai-Heng Feng 
+ */
+
+#include 
+
+#include "amd_iommu.h"
+
+#define IVHD_SPECIAL_IOAPIC1
+
+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 
*)>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 *)_ioapic_quirks[DELL_INSPIRON_7375],
+   },
+   {
+   .callback = ivrs_ioapic_quirk_cb,
+   .ident = "Dell Latitude 5495",
+   .matches = {
+   DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+