|
|
|
@ -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); |
|
|
|
|