return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
-       status = acpi_hw_read(ticks, &acpi_gbl_FADT.xpm_timer_block);
+       /* ACPI 5.0A: PM Timer is optional */
+
+       if (!acpi_gbl_FADT.xpm_timer_block.address) {
+               return_ACPI_STATUS(AE_SUPPORT);
+       }
 
+       status = acpi_hw_read(ticks, &acpi_gbl_FADT.xpm_timer_block);
        return_ACPI_STATUS(status);
 }
 
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
+       /* ACPI 5.0A: PM Timer is optional */
+
+       if (!acpi_gbl_FADT.xpm_timer_block.address) {
+               return_ACPI_STATUS(AE_SUPPORT);
+       }
+
        /*
         * Compute Tick Delta:
         * Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
 
         ACPI_FADT_OFFSET(pm_timer_block),
         ACPI_FADT_OFFSET(pm_timer_length),
         ACPI_PM_TIMER_WIDTH,
-        ACPI_FADT_REQUIRED},
+        ACPI_FADT_SEPARATE_LENGTH},    /* ACPI 5.0A: Timer is optional */
 
        {"Gpe0Block",
         ACPI_FADT_OFFSET(xgpe0_block),
 
                if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
                        /*
-                        * Field is required (Pm1a_event, Pm1a_control, pm_timer).
+                        * Field is required (Pm1a_event, Pm1a_control).
                         * Both the address and length must be non-zero.
                         */
                        if (!address64->address || !length) {