diff options
| -rw-r--r-- | common/fdt_support.c | 109 | ||||
| -rw-r--r-- | include/fdt_support.h | 1 | ||||
| -rw-r--r-- | lib_ppc/bootm.c | 28 | 
3 files changed, 70 insertions, 68 deletions
| diff --git a/common/fdt_support.c b/common/fdt_support.c index c0ca9e060..a7773aba0 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -99,44 +99,85 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)  }  #endif -int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force) +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  {  	int   nodeoffset; -	int   err; -	u32   tmp;		/* used to set 32 bit integer properties */ -	char  *str;		/* used to set string properties */ +	int   err, j, total; +	u32   tmp;  	const char *path; +	uint64_t addr, size; -	err = fdt_check_header(fdt); -	if (err < 0) { -		printf("fdt_chosen: %s\n", fdt_strerror(err)); -		return err; +	/* Find the "chosen" node.  */ +	nodeoffset = fdt_path_offset (fdt, "/chosen"); + +	/* If there is no "chosen" node in the blob return */ +	if (nodeoffset < 0) { +		printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset)); +		return nodeoffset;  	} -	if (initrd_start && initrd_end) { -		uint64_t addr, size; -		int  total = fdt_num_mem_rsv(fdt); -		int  j; +	/* just return if initrd_start/end aren't valid */ +	if ((initrd_start == 0) || (initrd_end == 0)) +		return 0; -		/* -		 * Look for an existing entry and update it.  If we don't find -		 * the entry, we will j be the next available slot. -		 */ -		for (j = 0; j < total; j++) { -			err = fdt_get_mem_rsv(fdt, j, &addr, &size); -			if (addr == initrd_start) { -				fdt_del_mem_rsv(fdt, j); -				break; -			} +	total = fdt_num_mem_rsv(fdt); + +	/* +	 * Look for an existing entry and update it.  If we don't find +	 * the entry, we will j be the next available slot. +	 */ +	for (j = 0; j < total; j++) { +		err = fdt_get_mem_rsv(fdt, j, &addr, &size); +		if (addr == initrd_start) { +			fdt_del_mem_rsv(fdt, j); +			break;  		} +	} -		err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start + 1); +	err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start + 1); +	if (err < 0) { +		printf("fdt_initrd: %s\n", fdt_strerror(err)); +		return err; +	} + +	path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); +	if ((path == NULL) || force) { +		tmp = __cpu_to_be32(initrd_start); +		err = fdt_setprop(fdt, nodeoffset, +			"linux,initrd-start", &tmp, sizeof(tmp)); +		if (err < 0) { +			printf("WARNING: " +				"could not set linux,initrd-start %s.\n", +				fdt_strerror(err)); +			return err; +		} +		tmp = __cpu_to_be32(initrd_end); +		err = fdt_setprop(fdt, nodeoffset, +			"linux,initrd-end", &tmp, sizeof(tmp));  		if (err < 0) { -			printf("fdt_chosen: %s\n", fdt_strerror(err)); +			printf("WARNING: could not set linux,initrd-end %s.\n", +				fdt_strerror(err)); +  			return err;  		}  	} +	return 0; +} + +int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force) +{ +	int   nodeoffset; +	int   err; +	char  *str;		/* used to set string properties */ +	const char *path; + +	err = fdt_check_header(fdt); +	if (err < 0) { +		printf("fdt_chosen: %s\n", fdt_strerror(err)); +		return err; +	} +  	/*  	 * Find the "chosen" node.  	 */ @@ -173,24 +214,8 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)  					fdt_strerror(err));  		}  	} -	if (initrd_start && initrd_end) { -		path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); -		if ((path == NULL) || force) { -			tmp = __cpu_to_be32(initrd_start); -			err = fdt_setprop(fdt, nodeoffset, -				"linux,initrd-start", &tmp, sizeof(tmp)); -			if (err < 0) -				printf("WARNING: " -					"could not set linux,initrd-start %s.\n", -					fdt_strerror(err)); -			tmp = __cpu_to_be32(initrd_end); -			err = fdt_setprop(fdt, nodeoffset, -				"linux,initrd-end", &tmp, sizeof(tmp)); -			if (err < 0) -				printf("WARNING: could not set linux,initrd-end %s.\n", -					fdt_strerror(err)); -		} -	} + +	fdt_initrd(fdt, initrd_start, initrd_end, force);  #ifdef CONFIG_OF_STDOUT_VIA_ALIAS  	path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL); diff --git a/include/fdt_support.h b/include/fdt_support.h index aa0fc5801..424c3c6b7 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -29,6 +29,7 @@  #include <fdt.h>  int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force); +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);  void do_fixup_by_path(void *fdt, const char *path, const char *prop,  		      const void *val, int len, int create);  void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index 300e00a2d..9892aface 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -182,32 +182,8 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],  #if defined(CONFIG_OF_LIBFDT)  	/* fixup the initrd now that we know where it should be */ -	if ((of_flat_tree) && (initrd_start && initrd_end)) { -		uint64_t addr, size; -		int  total = fdt_num_mem_rsv(of_flat_tree); -		int  j; - -		/* Look for the dummy entry and delete it */ -		for (j = 0; j < total; j++) { -			fdt_get_mem_rsv(of_flat_tree, j, &addr, &size); -			if (addr == images->rd_start) { -				fdt_del_mem_rsv(of_flat_tree, j); -				break; -			} -		} - -		ret = fdt_add_mem_rsv(of_flat_tree, initrd_start, -					initrd_end - initrd_start + 1); -		if (ret < 0) { -			printf("fdt_chosen: %s\n", fdt_strerror(ret)); -			goto error; -		} - -		do_fixup_by_path_u32(of_flat_tree, "/chosen", -					"linux,initrd-start", initrd_start, 0); -		do_fixup_by_path_u32(of_flat_tree, "/chosen", -					"linux,initrd-end", initrd_end, 0); -	} +	if ((of_flat_tree) && (initrd_start && initrd_end)) +		fdt_initrd(of_flat_tree, initrd_start, initrd_end, 1);  #endif  	debug ("## Transferring control to Linux (at address %08lx) ...\n",  		(ulong)kernel); |