lkml.org 
[lkml]   [2022]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v20 4/5] of: fdt: Add memory for devices by DT property "linux,usable-memory-range"
    From
    On 1/24/22 2:47 AM, Zhen Lei wrote:
    > From: Chen Zhou <chenzhou10@huawei.com>
    >
    > When reserving crashkernel in high memory, some low memory is reserved
    > for crash dump kernel devices and never mapped by the first kernel.
    > This memory range is advertised to crash dump kernel via DT property
    > under /chosen,
    > linux,usable-memory-range = <BASE1 SIZE1 [BASE2 SIZE2]>
    >
    > We reused the DT property linux,usable-memory-range and made the low
    > memory region as the second range "BASE2 SIZE2", which keeps compatibility
    > with existing user-space and older kdump kernels.
    >
    > Crash dump kernel reads this property at boot time and call memblock_add()
    > to add the low memory region after memblock_cap_memory_range() has been
    > called.
    >
    > Signed-off-by: Chen Zhou <chenzhou10@huawei.com>
    > Co-developed-by: Zhen Lei <thunder.leizhen@huawei.com>
    > Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    > Reviewed-by: Rob Herring <robh@kernel.org>
    > Tested-by: Dave Kleikamp <dave.kleikamp@oracle.com>

    Acked-by: John Donnelly <john.p.donnelly@oracle.com>

    > ---
    > drivers/of/fdt.c | 33 +++++++++++++++++++++++----------
    > 1 file changed, 23 insertions(+), 10 deletions(-)
    >
    > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
    > index ad85ff6474ff139..df4b9d2418a13d4 100644
    > --- a/drivers/of/fdt.c
    > +++ b/drivers/of/fdt.c
    > @@ -973,16 +973,24 @@ static void __init early_init_dt_check_for_elfcorehdr(unsigned long node)
    >
    > static unsigned long chosen_node_offset = -FDT_ERR_NOTFOUND;
    >
    > +/*
    > + * The main usage of linux,usable-memory-range is for crash dump kernel.
    > + * Originally, the number of usable-memory regions is one. Now there may
    > + * be two regions, low region and high region.
    > + * To make compatibility with existing user-space and older kdump, the low
    > + * region is always the last range of linux,usable-memory-range if exist.
    > + */
    > +#define MAX_USABLE_RANGES 2
    > +
    > /**
    > * early_init_dt_check_for_usable_mem_range - Decode usable memory range
    > * location from flat tree
    > */
    > void __init early_init_dt_check_for_usable_mem_range(void)
    > {
    > - const __be32 *prop;
    > - int len;
    > - phys_addr_t cap_mem_addr;
    > - phys_addr_t cap_mem_size;
    > + struct memblock_region rgn[MAX_USABLE_RANGES] = {0};
    > + const __be32 *prop, *endp;
    > + int len, i;
    > unsigned long node = chosen_node_offset;
    >
    > if ((long)node < 0)
    > @@ -991,16 +999,21 @@ void __init early_init_dt_check_for_usable_mem_range(void)
    > pr_debug("Looking for usable-memory-range property... ");
    >
    > prop = of_get_flat_dt_prop(node, "linux,usable-memory-range", &len);
    > - if (!prop || (len < (dt_root_addr_cells + dt_root_size_cells)))
    > + if (!prop || (len % (dt_root_addr_cells + dt_root_size_cells)))
    > return;
    >
    > - cap_mem_addr = dt_mem_next_cell(dt_root_addr_cells, &prop);
    > - cap_mem_size = dt_mem_next_cell(dt_root_size_cells, &prop);
    > + endp = prop + (len / sizeof(__be32));
    > + for (i = 0; i < MAX_USABLE_RANGES && prop < endp; i++) {
    > + rgn[i].base = dt_mem_next_cell(dt_root_addr_cells, &prop);
    > + rgn[i].size = dt_mem_next_cell(dt_root_size_cells, &prop);
    >
    > - pr_debug("cap_mem_start=%pa cap_mem_size=%pa\n", &cap_mem_addr,
    > - &cap_mem_size);
    > + pr_debug("cap_mem_regions[%d]: base=%pa, size=%pa\n",
    > + i, &rgn[i].base, &rgn[i].size);
    > + }
    >
    > - memblock_cap_memory_range(cap_mem_addr, cap_mem_size);
    > + memblock_cap_memory_range(rgn[0].base, rgn[0].size);
    > + for (i = 1; i < MAX_USABLE_RANGES && rgn[i].size; i++)
    > + memblock_add(rgn[i].base, rgn[i].size);
    > }
    >
    > #ifdef CONFIG_SERIAL_EARLYCON

    \
     
     \ /
      Last update: 2022-01-26 16:20    [W:4.058 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site