lkml.org 
[lkml]   [2020]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH v2 03/22] efi/fake_mem: Arrange for a resource entry per efi_fake_mem instance
    From
    Date
    In preparation for attaching a platform device per iomem resource teach
    the efi_fake_mem code to create an e820 entry per instance. Similar to
    E820_TYPE_PRAM, bypass merging resource when the e820 map is sanitized.

    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: x86@kernel.org
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    ---
    arch/x86/kernel/e820.c | 16 +++++++++++++++-
    drivers/firmware/efi/x86_fake_mem.c | 12 +++++++++---
    2 files changed, 24 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
    index 983cd53ed4c9..22aad412f965 100644
    --- a/arch/x86/kernel/e820.c
    +++ b/arch/x86/kernel/e820.c
    @@ -305,6 +305,20 @@ static int __init cpcompare(const void *a, const void *b)
    return (ap->addr != ap->entry->addr) - (bp->addr != bp->entry->addr);
    }

    +static bool e820_nomerge(enum e820_type type)
    +{
    + /*
    + * These types may indicate distinct platform ranges aligned to
    + * numa node, protection domain, performance domain, or other
    + * boundaries. Do not merge them.
    + */
    + if (type == E820_TYPE_PRAM)
    + return true;
    + if (type == E820_TYPE_SOFT_RESERVED)
    + return true;
    + return false;
    +}
    +
    int __init e820__update_table(struct e820_table *table)
    {
    struct e820_entry *entries = table->entries;
    @@ -380,7 +394,7 @@ int __init e820__update_table(struct e820_table *table)
    }

    /* Continue building up new map based on this information: */
    - if (current_type != last_type || current_type == E820_TYPE_PRAM) {
    + if (current_type != last_type || e820_nomerge(current_type)) {
    if (last_type != 0) {
    new_entries[new_nr_entries].size = change_point[chg_idx]->addr - last_addr;
    /* Move forward only if the new size was non-zero: */
    diff --git a/drivers/firmware/efi/x86_fake_mem.c b/drivers/firmware/efi/x86_fake_mem.c
    index e5d6d5a1b240..0bafcc1bb0f6 100644
    --- a/drivers/firmware/efi/x86_fake_mem.c
    +++ b/drivers/firmware/efi/x86_fake_mem.c
    @@ -38,7 +38,7 @@ void __init efi_fake_memmap_early(void)
    m_start = mem->range.start;
    m_end = mem->range.end;
    for_each_efi_memory_desc(md) {
    - u64 start, end;
    + u64 start, end, size;

    if (md->type != EFI_CONVENTIONAL_MEMORY)
    continue;
    @@ -58,11 +58,17 @@ void __init efi_fake_memmap_early(void)
    */
    start = max(start, m_start);
    end = min(end, m_end);
    + size = end - start + 1;

    if (end <= start)
    continue;
    - e820__range_update(start, end - start + 1, E820_TYPE_RAM,
    - E820_TYPE_SOFT_RESERVED);
    +
    + /*
    + * Ensure each efi_fake_mem instance results in
    + * a unique e820 resource
    + */
    + e820__range_remove(start, size, E820_TYPE_RAM, 1);
    + e820__range_add(start, size, E820_TYPE_SOFT_RESERVED);
    e820__update_table(e820_table);
    }
    }
    \
     
     \ /
      Last update: 2020-07-12 18:43    [W:4.075 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site