*/
 u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE);
 
+/*
+ * Optionally truncate I/O addresses to 16 bits. Provides compatibility
+ * with other ACPI implementations. NOTE: During ACPICA initialization,
+ * this value is set to TRUE if any Windows OSI strings have been
+ * requested by the BIOS.
+ */
+u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE);
+
 /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
 
 struct acpi_table_fadt acpi_gbl_FADT;
 
        u32 one_byte;
        u32 i;
 
+       /* Truncate address to 16 bits if requested */
+
+       if (acpi_gbl_truncate_io_addresses) {
+               address &= ACPI_UINT16_MAX;
+       }
+
        /* Validate the entire request and perform the I/O */
 
        status = acpi_hw_validate_io_request(address, width);
        acpi_status status;
        u32 i;
 
+       /* Truncate address to 16 bits if requested */
+
+       if (acpi_gbl_truncate_io_addresses) {
+               address &= ACPI_UINT16_MAX;
+       }
+
        /* Validate the entire request and perform the I/O */
 
        status = acpi_hw_validate_io_request(address, width);
 
                                        acpi_ns_init_one_device, NULL, &info,
                                        NULL);
 
+       /*
+        * Any _OSI requests should be completed by now. If the BIOS has
+        * requested any Windows OSI strings, we will always truncate
+        * I/O addresses to 16 bits -- for Windows compatibility.
+        */
+       if (acpi_gbl_osi_data >= ACPI_OSI_WIN_2000) {
+               acpi_gbl_truncate_io_addresses = TRUE;
+       }
+
        ACPI_FREE(info.evaluate_info);
        if (ACPI_FAILURE(status)) {
                goto error_exit;
 
 extern u32 acpi_gbl_trace_flags;
 extern u8 acpi_gbl_enable_aml_debug_object;
 extern u8 acpi_gbl_copy_dsdt_locally;
+extern u8 acpi_gbl_truncate_io_addresses;
 
 extern u32 acpi_current_gpe_count;
 extern struct acpi_table_fadt acpi_gbl_FADT;