[PATCH 3/4] ACPI: workaround FADT always being revision 2

From: Al Stone
Date: Tue Oct 13 2015 - 18:23:21 EST


In some environments, the FADT revision number is always 2, independent
of any other factors indicating that it may be a newer revision. So,
we cannot rely on the FADT and MADT revisions being in proper step. For
those environments, relax the checking so we only enforce the size check,
even if we do issue warnings on other problems.

If we do not relax the rules, these systems will not boot as they have in
the past.

Signed-off-by: Al Stone <al.stone@xxxxxxxxxx>
---
drivers/acpi/tables.c | 34 +++++++++++++++++++++++++++++-----
1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index 3b5ddfb..790d4b0 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -416,7 +416,6 @@ static int __init bad_madt_entry(struct acpi_table_header *table,
/* ... but relax it on legacy systems so they boot */
pr_warn("undefined version for either FADT %d.%d or MADT %d\n",
major, minor, madt->header.revision);
- return 0;
}
}

@@ -430,16 +429,41 @@ static int __init bad_madt_entry(struct acpi_table_header *table,
/* ... but relax it on legacy systems so they boot */
pr_warn("undefined MADT subtable type for FADT %d.%d: %d (length %d)\n",
major, minor, entry->type, entry->length);
- return 0;
}
}

/* verify that the table is allowed for this version of the spec */
len = ms->lengths[entry->type];
if (!len) {
- pr_err("MADT subtable %d not defined for FADT %d.%d\n",
- entry->type, major, minor);
- return 1;
+ if (IS_ENABLED(CONFIG_ARM64)) {
+ pr_err("MADT subtable %d not defined for FADT %d.%d\n",
+ entry->type, major, minor);
+ return 1;
+ } else {
+ pr_warn("MADT subtable %d not defined for FADT %d.%d\n",
+ entry->type, major, minor);
+ }
+ }
+
+ /*
+ * When we get this far, we may have issued warnings on either
+ * a mismatch in FADT/MADT revisions, or have noted that the subtable
+ * ID is not defined for the MADT revision we're using. On some
+ * architectures, this is an error, but for legacy systems, we need
+ * to push on with other checks of the subtable.
+ *
+ * In fact, there are environments where the *only* value the FADT
+ * revision will ever have is 2, regardless of anything else. So,
+ * for those systems to boot, we have to pretend the MADT is the
+ * latest version to allow all known subtables since we have no way
+ * to determine what revision it should be.
+ */
+ if (!IS_ENABLED(CONFIG_ARM64) && major == 2) {
+ ms = spec_info;
+ while (ms->num_types != 0)
+ ms++;
+ ms--;
+ len = ms->lengths[entry->type];
}

/* verify that the length is what we expect */
--
2.4.3


--------------020400080004050109020606
Content-Type: text/x-patch;
name="0004-ACPI-for-bad_madt_entry-the-GIC-ITS-table-is-20-byte.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename*0="0004-ACPI-for-bad_madt_entry-the-GIC-ITS-table-is-20-byte.pa";
filename*1="tch"