|
@@ -649,6 +649,21 @@ void __init dmi_scan_machine(void)
|
|
|
if (p == NULL)
|
|
|
goto error;
|
|
|
|
|
|
+ /*
|
|
|
+ * Same logic as above, look for a 64-bit entry point
|
|
|
+ * first, and if not found, fall back to 32-bit entry point.
|
|
|
+ */
|
|
|
+ memcpy_fromio(buf, p, 16);
|
|
|
+ for (q = p + 16; q < p + 0x10000; q += 16) {
|
|
|
+ memcpy_fromio(buf + 16, q, 16);
|
|
|
+ if (!dmi_smbios3_present(buf)) {
|
|
|
+ dmi_available = 1;
|
|
|
+ dmi_early_unmap(p, 0x10000);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ memcpy(buf, buf + 16, 16);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Iterate over all possible DMI header addresses q.
|
|
|
* Maintain the 32 bytes around q in buf. On the
|
|
@@ -659,7 +674,7 @@ void __init dmi_scan_machine(void)
|
|
|
memset(buf, 0, 16);
|
|
|
for (q = p; q < p + 0x10000; q += 16) {
|
|
|
memcpy_fromio(buf + 16, q, 16);
|
|
|
- if (!dmi_smbios3_present(buf) || !dmi_present(buf)) {
|
|
|
+ if (!dmi_present(buf)) {
|
|
|
dmi_available = 1;
|
|
|
dmi_early_unmap(p, 0x10000);
|
|
|
goto out;
|