int pnpbios;
 };
 
+/**
+ * enum x86_legacy_i8042_state - i8042 keyboard controller state
+ * @X86_LEGACY_I8042_PLATFORM_ABSENT: the controller is always absent on
+ *     given platform/subarch.
+ * @X86_LEGACY_I8042_FIRMWARE_ABSENT: firmware reports that the controller
+ *     is absent.
+ * @X86_LEGACY_i8042_EXPECTED_PRESENT: the controller is likely to be
+ *     present, the i8042 driver should probe for controller existence.
+ */
+enum x86_legacy_i8042_state {
+       X86_LEGACY_I8042_PLATFORM_ABSENT,
+       X86_LEGACY_I8042_FIRMWARE_ABSENT,
+       X86_LEGACY_I8042_EXPECTED_PRESENT,
+};
+
 /**
  * struct x86_legacy_features - legacy x86 features
  *
+ * @i8042: indicated if we expect the device to have i8042 controller
+ *     present.
  * @rtc: this device has a CMOS real-time clock present
  * @reserve_bios_regions: boot code will search for the EBDA address and the
  *     start of the 640k - 1M BIOS region.  If false, the platform must
  *     documentation for further details.
  */
 struct x86_legacy_features {
+       enum x86_legacy_i8042_state i8042;
        int rtc;
        int reserve_bios_regions;
        struct x86_legacy_devices devices;
 
                x86_platform.legacy.devices.pnpbios = 0;
        }
 
+       if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
+           !(acpi_gbl_FADT.boot_flags & ACPI_FADT_8042) &&
+           x86_platform.legacy.i8042 != X86_LEGACY_I8042_PLATFORM_ABSENT) {
+               pr_debug("ACPI: i8042 controller is absent\n");
+               x86_platform.legacy.i8042 = X86_LEGACY_I8042_FIRMWARE_ABSENT;
+       }
+
        if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC) {
                pr_debug("ACPI: not registering RTC platform device\n");
                x86_platform.legacy.rtc = 0;
 
 
 void __init x86_early_init_platform_quirks(void)
 {
+       x86_platform.legacy.i8042 = X86_LEGACY_I8042_EXPECTED_PRESENT;
        x86_platform.legacy.rtc = 1;
        x86_platform.legacy.reserve_bios_regions = 0;
        x86_platform.legacy.devices.pnpbios = 1;
                break;
        case X86_SUBARCH_XEN:
        case X86_SUBARCH_LGUEST:
+               x86_platform.legacy.devices.pnpbios = 0;
+               x86_platform.legacy.rtc = 0;
+               break;
        case X86_SUBARCH_INTEL_MID:
        case X86_SUBARCH_CE4100:
                x86_platform.legacy.devices.pnpbios = 0;
                x86_platform.legacy.rtc = 0;
+               x86_platform.legacy.i8042 = X86_LEGACY_I8042_PLATFORM_ABSENT;
                break;
        }