diff options
Diffstat (limited to 'common/ft_build.c')
| -rw-r--r-- | common/ft_build.c | 49 | 
1 files changed, 38 insertions, 11 deletions
| diff --git a/common/ft_build.c b/common/ft_build.c index 65a274f84..9e9c906fc 100644 --- a/common/ft_build.c +++ b/common/ft_build.c @@ -163,7 +163,7 @@ void ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)  	((u64 *) cxt->pres)[0] = cpu_to_be64(physaddr);	/* phys = 0, size = 0, terminate */  	((u64 *) cxt->pres)[1] = cpu_to_be64(size); -	cxt->pres += 18;	/* advance */ +	cxt->pres += 16;	/* advance */  	((u64 *) cxt->pres)[0] = 0;	/* phys = 0, size = 0, terminate */  	((u64 *) cxt->pres)[1] = 0; @@ -529,6 +529,7 @@ extern uchar(*env_get_char) (int);  #define BDM(x)	{	.name = #x, .offset = offsetof(bd_t, bi_ ##x ) } +#ifdef CONFIG_OF_HAS_BD_T  static const struct {  	const char *name;  	int offset; @@ -574,19 +575,24 @@ static const struct {  #endif  	BDM(baudrate),  }; +#endif -void ft_setup(void *blob, int size, bd_t * bd) +void ft_setup(void *blob, int size, bd_t * bd, ulong initrd_start, ulong initrd_end)  { -	DECLARE_GLOBAL_DATA_PTR; -	u8 *end;  	u32 *p;  	int len;  	struct ft_cxt cxt; -	int i, k, nxt; -	static char tmpenv[256]; -	char *s, *lval, *rval;  	ulong clock; -	uint32_t v; +#if defined(CONFIG_OF_HAS_UBOOT_ENV) +	int k, nxt; +#endif +#if defined(CONFIG_OF_HAS_BD_T) +	u8 *end; +#endif +#if defined(CONFIG_OF_HAS_UBOOT_ENV) || defined(CONFIG_OF_HAS_BD_T) +	int i; +	static char tmpenv[256]; +#endif  	/* disable OF tree; booting old kernel */  	if (getenv("disable_of") != NULL) { @@ -596,7 +602,8 @@ void ft_setup(void *blob, int size, bd_t * bd)  	ft_begin(&cxt, blob, size); -	/* fs_add_rsvmap not used */ +	if (initrd_start && initrd_end) +		ft_add_rsvmap(&cxt, initrd_start, initrd_end - initrd_start + 1);  	ft_begin_tree(&cxt); @@ -610,9 +617,12 @@ void ft_setup(void *blob, int size, bd_t * bd)  	/* back into root */  	ft_backtrack_node(&cxt); +#ifdef CONFIG_OF_HAS_UBOOT_ENV  	ft_begin_node(&cxt, "u-boot-env");  	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { +		char *s, *lval, *rval; +  		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ;  		s = tmpenv;  		for (k = i; k < nxt && s < &tmpenv[sizeof(tmpenv) - 1]; ++k) @@ -629,12 +639,20 @@ void ft_setup(void *blob, int size, bd_t * bd)  	}  	ft_end_node(&cxt); +#endif  	ft_begin_node(&cxt, "chosen");  	ft_prop_str(&cxt, "name", "chosen");  	ft_prop_str(&cxt, "bootargs", getenv("bootargs"));  	ft_prop_int(&cxt, "linux,platform", 0x600);	/* what is this? */ +	if (initrd_start && initrd_end) { +		ft_prop_int(&cxt, "linux,initrd-start", initrd_start); +		ft_prop_int(&cxt, "linux,initrd-end", initrd_end); +	} +#ifdef OF_STDOUT_PATH +	ft_prop_str(&cxt, "linux,stdout-path", OF_STDOUT_PATH); +#endif  	ft_end_node(&cxt); @@ -647,14 +665,19 @@ void ft_setup(void *blob, int size, bd_t * bd)  	   ft_dump_blob(blob);  	 */ +#ifdef CONFIG_OF_HAS_BD_T  	/* paste the bd_t at the end of the flat tree */  	end = (char *)blob +  	    be32_to_cpu(((struct boot_param_header *)blob)->totalsize);  	memcpy(end, bd, sizeof(*bd)); +#endif  #ifdef CONFIG_PPC +#ifdef CONFIG_OF_HAS_BD_T  	for (i = 0; i < sizeof(bd_map)/sizeof(bd_map[0]); i++) { +		uint32_t v; +  		sprintf(tmpenv, "/bd_t/%s", bd_map[i].name);  		v = *(uint32_t *)((char *)bd + bd_map[i].offset); @@ -670,6 +693,7 @@ void ft_setup(void *blob, int size, bd_t * bd)  	p = ft_get_prop(blob, "/bd_t/ethspeed", &len);  	if (p != NULL)  		*p = cpu_to_be32((uint32_t) bd->bi_ethspeed); +#endif  	clock = bd->bi_intfreq;  	p = ft_get_prop(blob, "/cpus/" OF_CPU "/clock-frequency", &len); @@ -680,11 +704,14 @@ void ft_setup(void *blob, int size, bd_t * bd)  	clock = OF_TBCLK;  	p = ft_get_prop(blob, "/cpus/" OF_CPU "/timebase-frequency", &len);  	if (p != NULL) -		*p = cpu_to_be32(OF_TBCLK); +		*p = cpu_to_be32(clock);  #endif -  #endif				/* __powerpc__ */ +#ifdef CONFIG_OF_BOARD_SETUP +	ft_board_setup(blob, bd); +#endif +  	/*  	   printf("final OF-tree\n");  	   ft_dump_blob(blob); |