Message ID | 20200219184342.15974-2-michael@amarulasolutions.com |
---|---|
State | Superseded |
Headers | show |
Series | Update reserved memory for simple framebuffer | expand |
Hi Michael, On Wed, 19 Feb 2020 at 11:43, Michael Trimarchi <michael at amarulasolutions.com> wrote: > > We need to reserve memory and not put in kernel linear mapping. > This avoid problem during memory remapping from the simple > frame buffer in linux kernel > > Signed-off-by: Michael Trimarchi <michael at amarulasolutions.com> > --- > common/fdt_support.c | 40 ++++++++++++++++++++++++++++++++++++++++ > include/fdt_support.h | 11 +++++++++++ > 2 files changed, 51 insertions(+) Reviewed-by: Simon Glass <sjg at chromium.org> nits below > > diff --git a/common/fdt_support.c b/common/fdt_support.c > index 02cf5c6241..a3662f4358 100644 > --- a/common/fdt_support.c > +++ b/common/fdt_support.c > @@ -410,6 +410,46 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size, > return p - (char *)buf; > } > > +int fdt_fixup_reserved_memory(void *blob, const char *area, u64 start[], u64 size[]) > +{ > + int offs, len; > + const char *subpath; > + const char *path = "/reserved-memory"; > + fdt32_t address_cells = cpu_to_fdt32(fdt_address_cells(blob, 0)); > + fdt32_t size_cells = cpu_to_fdt32(fdt_size_cells(blob, 0)); > + u8 temp[16]; /* Up to 64-bit address + 64-bit size */ > + > + offs = fdt_path_offset(blob, path); > + if (offs < 0) { > + debug("Node %s not found\n", path); > + path = "/"; > + subpath = "reserved-memory"; > + offs = fdt_path_offset(blob, path); This is always 0 by definition. > + offs = fdt_add_subnode(blob, offs, subpath); > + if (offs < 0) { > + printf("Could not create %s%s node.\n", path, subpath); > + return -1; This is -EPERM. I think it would be better to return ofs. > + } > + path = "/reserved-memory"; > + offs = fdt_path_offset(blob, path); > + > + fdt_setprop(blob, offs, "#address-cells", &address_cells, sizeof(address_cells)); > + fdt_setprop(blob, offs, "#size-cells", &size_cells, sizeof(size_cells)); > + fdt_setprop(blob, offs, "ranges", NULL, 0); > + } > + > + offs = fdt_add_subnode(blob, offs, area ? : "private"); > + if (offs < 0) { > + printf("Could not create %s%s node.\n", path, subpath); > + return -1; and here > + } > + > + fdt_setprop(blob, offs, "no-map", NULL, 0); > + len = fdt_pack_reg(blob, temp, start, size, 1); > + fdt_setprop(blob, offs, "reg", temp, len); blank line before return > + return 0; > +} > + > #if CONFIG_NR_DRAM_BANKS > 4 > #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS > #else > diff --git a/include/fdt_support.h b/include/fdt_support.h > index ba14acd7f6..7c8a280f53 100644 > --- a/include/fdt_support.h > +++ b/include/fdt_support.h > @@ -93,6 +93,17 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat, > */ > int fdt_fixup_memory(void *blob, u64 start, u64 size); > > +/** > + * Setup the memory reserved node in the DT. Creates one if none was existing before. > + * > + * @param blob FDT blob to update > + * @param area Reserved area name > + * @param start Begin of DRAM mapping in physical memory > + * @param size Size of the single memory bank > + * @return 0 if ok, or -1 or -FDT_ERR_... on error check this > + */ > +int fdt_fixup_reserved_memory(void *blob, const char *area, u64 start[], u64 size[]); > + > /** > * Fill the DT memory node with multiple memory banks. > * Creates the node if none was existing before. > -- > 2.17.1 > Regards, Simon
diff --git a/common/fdt_support.c b/common/fdt_support.c index 02cf5c6241..a3662f4358 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -410,6 +410,46 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size, return p - (char *)buf; } +int fdt_fixup_reserved_memory(void *blob, const char *area, u64 start[], u64 size[]) +{ + int offs, len; + const char *subpath; + const char *path = "/reserved-memory"; + fdt32_t address_cells = cpu_to_fdt32(fdt_address_cells(blob, 0)); + fdt32_t size_cells = cpu_to_fdt32(fdt_size_cells(blob, 0)); + u8 temp[16]; /* Up to 64-bit address + 64-bit size */ + + offs = fdt_path_offset(blob, path); + if (offs < 0) { + debug("Node %s not found\n", path); + path = "/"; + subpath = "reserved-memory"; + offs = fdt_path_offset(blob, path); + offs = fdt_add_subnode(blob, offs, subpath); + if (offs < 0) { + printf("Could not create %s%s node.\n", path, subpath); + return -1; + } + path = "/reserved-memory"; + offs = fdt_path_offset(blob, path); + + fdt_setprop(blob, offs, "#address-cells", &address_cells, sizeof(address_cells)); + fdt_setprop(blob, offs, "#size-cells", &size_cells, sizeof(size_cells)); + fdt_setprop(blob, offs, "ranges", NULL, 0); + } + + offs = fdt_add_subnode(blob, offs, area ? : "private"); + if (offs < 0) { + printf("Could not create %s%s node.\n", path, subpath); + return -1; + } + + fdt_setprop(blob, offs, "no-map", NULL, 0); + len = fdt_pack_reg(blob, temp, start, size, 1); + fdt_setprop(blob, offs, "reg", temp, len); + return 0; +} + #if CONFIG_NR_DRAM_BANKS > 4 #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS #else diff --git a/include/fdt_support.h b/include/fdt_support.h index ba14acd7f6..7c8a280f53 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -93,6 +93,17 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat, */ int fdt_fixup_memory(void *blob, u64 start, u64 size); +/** + * Setup the memory reserved node in the DT. Creates one if none was existing before. + * + * @param blob FDT blob to update + * @param area Reserved area name + * @param start Begin of DRAM mapping in physical memory + * @param size Size of the single memory bank + * @return 0 if ok, or -1 or -FDT_ERR_... on error + */ +int fdt_fixup_reserved_memory(void *blob, const char *area, u64 start[], u64 size[]); + /** * Fill the DT memory node with multiple memory banks. * Creates the node if none was existing before.
We need to reserve memory and not put in kernel linear mapping. This avoid problem during memory remapping from the simple frame buffer in linux kernel Signed-off-by: Michael Trimarchi <michael at amarulasolutions.com> --- common/fdt_support.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/fdt_support.h | 11 +++++++++++ 2 files changed, 51 insertions(+)