diff options
Diffstat (limited to 'boot/fdt_support.c')
| -rw-r--r-- | boot/fdt_support.c | 39 | 
1 files changed, 38 insertions, 1 deletions
| diff --git a/boot/fdt_support.c b/boot/fdt_support.c index 49efeec3681..92f2f534ee0 100644 --- a/boot/fdt_support.c +++ b/boot/fdt_support.c @@ -18,6 +18,7 @@  #include <dm/ofnode.h>  #include <linux/ctype.h>  #include <linux/types.h> +#include <linux/sizes.h>  #include <asm/global_data.h>  #include <asm/unaligned.h>  #include <linux/libfdt.h> @@ -464,7 +465,6 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,  	do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);  } -#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY  /*   * fdt_pack_reg - pack address and size array into the "reg"-suitable stream   */ @@ -493,6 +493,7 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,  	return p - (char *)buf;  } +#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY  #if CONFIG_NR_DRAM_BANKS > 4  #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS  #else @@ -2222,3 +2223,39 @@ int fdt_valid(struct fdt_header **blobp)  	}  	return 1;  } + +int fdt_fixup_pmem_region(void *fdt, u64 pmem_start, u64 pmem_size) +{ +	char node_name[32]; +	int nodeoffset, len; +	int err; +	u8 tmp[4 * 16]; /* Up to 64-bit address + 64-bit size */ + +	if (!IS_ALIGNED(pmem_start, SZ_2M) || +	    !IS_ALIGNED(pmem_start + pmem_size, SZ_2M)) { +		printf("Start and end address must be 2MiB aligned\n"); +		return -1; +	} + +	snprintf(node_name, sizeof(node_name), "pmem@%llx", pmem_start); +	nodeoffset = fdt_find_or_add_subnode(fdt, 0, node_name); +	if (nodeoffset < 0) +		return nodeoffset; + +	err = fdt_setprop_string(fdt, nodeoffset, "compatible", "pmem-region"); +	if (err) +		return err; +	err = fdt_setprop_empty(fdt, nodeoffset, "volatile"); +	if (err) +		return err; + +	len = fdt_pack_reg(fdt, tmp, &pmem_start, &pmem_size, 1); +	err = fdt_setprop(fdt, nodeoffset, "reg", tmp, len); +	if (err < 0) { +		printf("WARNING: could not set pmem %s %s.\n", "reg", +		       fdt_strerror(err)); +		return err; +	} + +	return 0; +} | 
