* Examine the physical address to determine if it is an area of memory
  * that should be mapped decrypted.  If the memory is not part of the
  * kernel usable area it was accessed and created decrypted, so these
- * areas should be mapped decrypted.
+ * areas should be mapped decrypted. And since the encryption key can
+ * change across reboots, persistent memory should also be mapped
+ * decrypted.
  */
 static bool memremap_should_map_decrypted(resource_size_t phys_addr,
                                          unsigned long size)
 {
+       int is_pmem;
+
+       /*
+        * Check if the address is part of a persistent memory region.
+        * This check covers areas added by E820, EFI and ACPI.
+        */
+       is_pmem = region_intersects(phys_addr, size, IORESOURCE_MEM,
+                                   IORES_DESC_PERSISTENT_MEMORY);
+       if (is_pmem != REGION_DISJOINT)
+               return true;
+
+       /*
+        * Check if the non-volatile attribute is set for an EFI
+        * reserved area.
+        */
+       if (efi_enabled(EFI_BOOT)) {
+               switch (efi_mem_type(phys_addr)) {
+               case EFI_RESERVED_TYPE:
+                       if (efi_mem_attributes(phys_addr) & EFI_MEMORY_NV)
+                               return true;
+                       break;
+               default:
+                       break;
+               }
+       }
+
        /* Check if the address is outside kernel usable area */
        switch (e820__get_entry_type(phys_addr, phys_addr + size - 1)) {
        case E820_TYPE_RESERVED:
        case E820_TYPE_ACPI:
        case E820_TYPE_NVS:
        case E820_TYPE_UNUSABLE:
+       case E820_TYPE_PRAM:
                return true;
        default:
                break;