• Toshi Kani's avatar
    ACPI: Change NFIT driver to insert new resource · af1996ef
    Toshi Kani authored
    ACPI 6 defines persistent memory (PMEM) ranges in multiple
    firmware interfaces, e820, EFI, and ACPI NFIT table.  This EFI
    change, however, leads to hit a bug in the grub bootloader, which
    treats EFI_PERSISTENT_MEMORY type as regular memory and corrupts
    stored user data [1].
    
    Therefore, BIOS may set generic reserved type in e820 and EFI to
    cover PMEM ranges.  The kernel can initialize PMEM ranges from
    ACPI NFIT table alone.
    
    This scheme causes a problem in the iomem table, though.  On x86,
    for instance, e820_reserve_resources() initializes top-level entries
    (iomem_resource.child) from the e820 table at early boot-time.
    This creates "reserved" entry for a PMEM range, which does not allow
    region_intersects() to check with PMEM type.
    
    Change acpi_nfit_register_region() to call acpi_nfit_insert_resource(),
    which calls insert_resource() to insert a PMEM entry from NFIT when
    the iomem table does not have a PMEM entry already.  That is, when
    a PMEM range is marked as reserved type in e820, it inserts
    "Persistent Memory" entry, which results as follows.
    
     + "Persistent Memory"
        + "reserved"
    
    This allows the EINJ driver, which calls region_intersects() to check
    PMEM ranges, to work continuously even if BIOS sets reserved type
    (or sets nothing) to PMEM ranges in e820 and EFI.
    
    [1]: https://lists.gnu.org/archive/html/grub-devel/2015-11/msg00209.htmlSigned-off-by: default avatarToshi Kani <toshi.kani@hpe.com>
    Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Borislav Petkov <bp@suse.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    af1996ef
nfit.c 56.5 KB