All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <200509021814.08001.pantelis.antoniou@gmail.com>

diff --git a/a/1.txt b/N1/1.txt
index 4ca23fe..2d434f4 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -27,3 +27,1063 @@ Regards
 Pantelis
 
 P.S. Sorry for cross-posting, but it seems to be appropriate at this time.
+-------------- next part --------------
+diff --git a/common/Makefile b/common/Makefile
+--- a/common/Makefile
++++ b/common/Makefile
+@@ -51,7 +51,7 @@ COBJS	= main.o ACEX1K.o altera.o bedbug.
+ 	  memsize.o miiphybb.o miiphyutil.o \
+ 	  s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o \
+ 	  usb.o usb_kbd.o usb_storage.o \
+-	  virtex2.o xilinx.o
++	  virtex2.o xilinx.o ft_build.o
+ 
+ OBJS	= $(AOBJS) $(COBJS)
+ 
+diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
+--- a/common/cmd_bootm.c
++++ b/common/cmd_bootm.c
+@@ -34,6 +34,10 @@
+ #include <environment.h>
+ #include <asm/byteorder.h>
+ 
++#ifdef CONFIG_OF_FLAT_TREE
++#include <ft_build.h>
++#endif
++
+  /*cmd_boot.c*/
+  extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+ 
+@@ -487,6 +491,9 @@ fixup_silent_linux ()
+ }
+ #endif /* CONFIG_SILENT_CONSOLE */
+ 
++extern const unsigned char oftree_dtb[];
++extern const unsigned int oftree_dtb_len;
++
+ #ifdef CONFIG_PPC
+ static void
+ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
+@@ -509,6 +516,9 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+ 	bd_t	*kbd;
+ 	void	(*kernel)(bd_t *, ulong, ulong, ulong, ulong);
+ 	image_header_t *hdr = &header;
++#ifdef CONFIG_OF_FLAT_TREE
++	char	*of_flat_tree;
++#endif
+ 
+ 	if ((s = getenv ("initrd_high")) != NULL) {
+ 		/* a value of "no" or a similar string will act like 0,
+@@ -773,16 +783,24 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+ 		initrd_start = 0;
+ 		initrd_end = 0;
+ 	}
+-
++#ifdef CONFIG_OF_FLAT_TREE
++	if (initrd_start == 0)
++		of_flat_tree = (char *)(((ulong)kbd - OF_FLAT_TREE_MAX_SIZE) & ~0xF);
++	else
++		of_flat_tree = (char *)((initrd_start - OF_FLAT_TREE_MAX_SIZE) & ~0xF);
++#endif
+ 
+ 	debug ("## Transferring control to Linux (at address %08lx) ...\n",
+ 		(ulong)kernel);
+ 
+ 	SHOW_BOOT_PROGRESS (15);
+ 
++#ifndef CONFIG_OF_FLAT_TREE
++
+ #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
+ 	unlock_ram_in_cache();
+ #endif
++
+ 	/*
+ 	 * Linux Kernel Parameters:
+ 	 *   r3: ptr to board info data
+@@ -792,6 +810,25 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+ 	 *   r7: End   of command line string
+ 	 */
+ 	(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
++#else
++
++	ft_setup(of_flat_tree, OF_FLAT_TREE_MAX_SIZE, kbd);
++	/* ft_dump_blob(of_flat_tree); */
++
++#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
++	unlock_ram_in_cache();
++#endif
++	/*
++	 * Linux Kernel Parameters:
++	 *   r3: ptr to board info data
++	 *   r4: initrd_start or 0 if no initrd
++	 *   r5: initrd_end - unused if r4 is 0
++	 *   r6: Start of command line string
++	 *   r7: End   of command line string
++	 */
++	(*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end, cmd_start, cmd_end);
++
++#endif
+ }
+ #endif /* CONFIG_PPC */
+ 
+diff --git a/common/ft_build.c b/common/ft_build.c
+new file mode 100644
+--- /dev/null
++++ b/common/ft_build.c
+@@ -0,0 +1,751 @@
++/*
++ * OF flat tree builder
++ */
++
++#include <common.h>
++#include <malloc.h>
++#include <environment.h>
++
++#include <asm/errno.h>
++
++#include <ft_build.h>
++
++#ifdef CONFIG_OF_FLAT_TREE
++
++/* align addr on a size boundary - adjust address up if needed -- Cort */
++#define _ALIGN(addr,size)       (((addr)+(size)-1)&(~((size)-1)))
++
++static void ft_put_word(struct ft_cxt *cxt, u32 v)
++{
++	if (cxt->overflow)	/* do nothing */
++		return;
++
++	/* check for overflow */
++	if (cxt->p + 4 > cxt->pstr) {
++		cxt->overflow = 1;
++		return;
++	}
++
++	*(u32 *) cxt->p = cpu_to_be32(v);
++	cxt->p += 4;
++}
++
++static inline void ft_put_bin(struct ft_cxt *cxt, const void *data, int sz)
++{
++	u8 *p;
++
++	if (cxt->overflow)	/* do nothing */
++		return;
++
++	/* next pointer pos */
++	p = (u8 *) _ALIGN((unsigned long)cxt->p + sz, 4);
++
++	/* check for overflow */
++	if (p > cxt->pstr) {
++		cxt->overflow = 1;
++		return;
++	}
++
++	memcpy(cxt->p, data, sz);
++	if ((sz & 3) != 0)
++		memset(cxt->p + sz, 0, 4 - (sz & 3));
++	cxt->p = p;
++}
++
++void ft_begin_node(struct ft_cxt *cxt, const char *name)
++{
++	ft_put_word(cxt, OF_DT_BEGIN_NODE);
++	ft_put_bin(cxt, name, strlen(name) + 1);
++}
++
++void ft_end_node(struct ft_cxt *cxt)
++{
++	ft_put_word(cxt, OF_DT_END_NODE);
++}
++
++void ft_nop(struct ft_cxt *cxt)
++{
++	ft_put_word(cxt, OF_DT_NOP);
++}
++
++static int lookup_string(struct ft_cxt *cxt, const char *name)
++{
++	u8 *p;
++
++	p = cxt->pstr;
++	while (p < cxt->pstr_begin) {
++		if (strcmp(p, name) == 0)
++			return p - cxt->p_begin;
++		p += strlen(p) + 1;
++	}
++
++	return -1;
++}
++
++void ft_prop(struct ft_cxt *cxt, const char *name, const void *data, int sz)
++{
++	int len, off;
++
++	if (cxt->overflow)
++		return;
++
++	len = strlen(name) + 1;
++
++	off = lookup_string(cxt, name);
++	if (off == -1) {
++		/* check if we have space */
++		if (cxt->p + 12 + sz + len > cxt->pstr) {
++			cxt->overflow = 1;
++			return;
++		}
++
++		cxt->pstr -= len;
++		memcpy(cxt->pstr, name, len);
++		off = cxt->pstr - cxt->p_begin;
++	}
++
++	/* now put offset from beginning of *STRUCTURE* */
++	/* will be fixed up at the end */
++	ft_put_word(cxt, OF_DT_PROP);
++	ft_put_word(cxt, sz);
++	ft_put_word(cxt, off);
++	ft_put_bin(cxt, data, sz);
++}
++
++void ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
++{
++	ft_prop(cxt, name, str, strlen(str) + 1);
++}
++
++void ft_prop_int(struct ft_cxt *cxt, const char *name, int val)
++{
++	u32 v = cpu_to_be32((u32) val);
++
++	ft_prop(cxt, name, &v, 4);
++}
++
++/* start construction of the flat OF tree */
++void ft_begin(struct ft_cxt *cxt, void *blob, int max_size)
++{
++	struct boot_param_header *bph = blob;
++	u32 off;
++
++	/* clear the cxt */
++	memset(cxt, 0, sizeof(*cxt));
++
++	cxt->bph = bph;
++	cxt->max_size = max_size;
++
++	/* zero everything in the header area */
++	memset(bph, 0, sizeof(*bph));
++
++	bph->magic = cpu_to_be32(OF_DT_HEADER);
++	bph->version = cpu_to_be32(0x10);
++	bph->last_comp_version = cpu_to_be32(0x10);
++
++	/* start pointers */
++	cxt->pres_begin = (u8 *) _ALIGN((unsigned long)(bph + 1), 8);
++	cxt->pres = cxt->pres_begin;
++
++	off = (unsigned long)cxt->pres_begin - (unsigned long)bph;
++	bph->off_mem_rsvmap = cpu_to_be32(off);
++
++	((u64 *) cxt->pres)[0] = 0;	/* phys = 0, size = 0, terminate */
++	((u64 *) cxt->pres)[1] = 0;
++
++	cxt->p_anchor = cxt->pres + 16;	/* over the terminator */
++}
++
++/* add a reserver physical area to the rsvmap */
++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 */
++
++	((u64 *) cxt->pres)[0] = 0;	/* phys = 0, size = 0, terminate */
++	((u64 *) cxt->pres)[1] = 0;
++
++	/* keep track of size */
++	cxt->res_size = cxt->pres + 16 - cxt->pres_begin;
++
++	cxt->p_anchor = cxt->pres + 16;	/* over the terminator */
++}
++
++void ft_begin_tree(struct ft_cxt *cxt)
++{
++	cxt->p_begin = cxt->p_anchor;
++	cxt->pstr_begin = (char *)cxt->bph + cxt->max_size;	/* point at the end */
++
++	cxt->p = cxt->p_begin;
++	cxt->pstr = cxt->pstr_begin;
++}
++
++int ft_end_tree(struct ft_cxt *cxt)
++{
++	struct boot_param_header *bph = cxt->bph;
++	int off, sz, sz1;
++	u32 tag, v;
++	u8 *p;
++
++	ft_put_word(cxt, OF_DT_END);
++
++	if (cxt->overflow)
++		return -ENOMEM;
++
++	/* size of the areas */
++	cxt->struct_size = cxt->p - cxt->p_begin;
++	cxt->strings_size = cxt->pstr_begin - cxt->pstr;
++
++	/* the offset we must move */
++	off = (cxt->pstr_begin - cxt->p_begin) - cxt->strings_size;
++
++	/* the new strings start */
++	cxt->pstr_begin = cxt->p_begin + cxt->struct_size;
++
++	/* move the whole string area */
++	memmove(cxt->pstr_begin, cxt->pstr, cxt->strings_size);
++
++	/* now perform the fixup of the strings */
++	p = cxt->p_begin;
++	while ((tag = be32_to_cpu(*(u32 *) p)) != OF_DT_END) {
++		p += 4;
++
++		if (tag == OF_DT_BEGIN_NODE) {
++			p = (u8 *) _ALIGN((unsigned long)p + strlen(p) + 1, 4);
++			continue;
++		}
++
++		if (tag == OF_DT_END_NODE || tag == OF_DT_NOP)
++			continue;
++
++		if (tag != OF_DT_PROP)
++			return -EINVAL;
++
++		sz = be32_to_cpu(*(u32 *) p);
++		p += 4;
++
++		v = be32_to_cpu(*(u32 *) p);
++		v -= off;
++		*(u32 *) p = cpu_to_be32(v);	/* move down */
++		p += 4;
++
++		p = (u8 *) _ALIGN((unsigned long)p + sz, 4);
++	}
++
++	/* fix sizes */
++	p = (char *)cxt->bph;
++	sz = (cxt->pstr_begin + cxt->strings_size) - p;
++	sz1 = _ALIGN(sz, 16);	/* align at 16 bytes */
++	if (sz != sz1)
++		memset(p + sz, 0, sz1 - sz);
++	bph->totalsize = cpu_to_be32(sz1);
++	bph->off_dt_struct = cpu_to_be32(cxt->p_begin - p);
++	bph->off_dt_strings = cpu_to_be32(cxt->pstr_begin - p);
++
++	/* the new strings start */
++	cxt->pstr_begin = cxt->p_begin + cxt->struct_size;
++	cxt->pstr = cxt->pstr_begin + cxt->strings_size;
++
++	return 0;
++}
++
++/**********************************************************************/
++
++static inline int isprint(int c)
++{
++	return c >= 0x20 && c <= 0x7e;
++}
++
++static int is_printable_string(const void *data, int len)
++{
++	const char *s = data;
++	const char *ss;
++
++	/* zero length is not */
++	if (len == 0)
++		return 0;
++
++	/* must terminate with zero */
++	if (s[len - 1] != '\0')
++		return 0;
++
++	ss = s;
++	while (*s && isprint(*s))
++		s++;
++
++	/* not zero, or not done yet */
++	if (*s != '\0' || (s + 1 - ss) < len)
++		return 0;
++
++	return 1;
++}
++
++static void print_data(const void *data, int len)
++{
++	int i;
++	const u8 *s;
++
++	/* no data, don't print */
++	if (len == 0)
++		return;
++
++	if (is_printable_string(data, len)) {
++		printf(" = \"%s\"", (char *)data);
++		return;
++	}
++
++	switch (len) {
++	case 1:		/* byte */
++		printf(" = <0x%02x>", (*(u8 *) data) & 0xff);
++		break;
++	case 2:		/* half-word */
++		printf(" = <0x%04x>", be16_to_cpu(*(u16 *) data) & 0xffff);
++		break;
++	case 4:		/* word */
++		printf(" = <0x%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
++		break;
++	case 8:		/* double-word */
++		printf(" = <0x%16llx>", be64_to_cpu(*(uint64_t *) data));
++		break;
++	default:		/* anything else... hexdump */
++		printf(" = [");
++		for (i = 0, s = data; i < len; i++)
++			printf("%02x%s", s[i], i < len - 1 ? " " : "");
++		printf("]");
++
++		break;
++	}
++}
++
++void ft_dump_blob(const void *bphp)
++{
++	const struct boot_param_header *bph = bphp;
++	const uint64_t *p_rsvmap = (const uint64_t *)
++		((const char *)bph + be32_to_cpu(bph->off_mem_rsvmap));
++	const u32 *p_struct = (const u32 *)
++		((const char *)bph + be32_to_cpu(bph->off_dt_struct));
++	const u32 *p_strings = (const u32 *)
++		((const char *)bph + be32_to_cpu(bph->off_dt_strings));
++	u32 tag;
++	const u32 *p;
++	const char *s, *t;
++	int depth, sz, shift;
++	int i;
++	uint64_t addr, size;
++
++	depth = 0;
++	shift = 4;
++
++	for (i = 0;; i++) {
++		addr = be64_to_cpu(p_rsvmap[i * 2]);
++		size = be64_to_cpu(p_rsvmap[i * 2 + 1]);
++		if (addr == 0 && size == 0)
++			break;
++
++		printf("/memreserve/ 0x%llx 0x%llx;\n", addr, size);
++	}
++
++	p = p_struct;
++	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
++
++		/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
++
++		if (tag == OF_DT_BEGIN_NODE) {
++			s = (const char *)p;
++			p = (u32 *) _ALIGN((unsigned long)p + strlen(s) + 1, 4);
++
++			printf("%*s%s {\n", depth * shift, "", s);
++
++			depth++;
++			continue;
++		}
++
++		if (tag == OF_DT_END_NODE) {
++			depth--;
++
++			printf("%*s};\n", depth * shift, "");
++			continue;
++		}
++
++		if (tag == OF_DT_NOP) {
++			printf("%*s[NOP]\n", depth * shift, "");
++			continue;
++		}
++
++		if (tag != OF_DT_PROP) {
++			fprintf(stderr, "%*s ** Unknown tag 0x%08x\n",
++				depth * shift, "", tag);
++			break;
++		}
++		sz = be32_to_cpu(*p++);
++		s = (const char *)p_strings + be32_to_cpu(*p++);
++		t = (const char *)p;
++		p = (const u32 *)_ALIGN((unsigned long)p + sz, 4);
++		printf("%*s%s", depth * shift, "", s);
++		print_data(t, sz);
++		printf(";\n");
++	}
++}
++
++void ft_backtrack_node(struct ft_cxt *cxt)
++{
++	if (be32_to_cpu(*(u32 *) (cxt->p - 4)) != OF_DT_END_NODE)
++		return;		/* XXX only for node */
++
++	cxt->p -= 4;
++}
++
++/* note that the root node of the blob is "peeled" off */
++void ft_merge_blob(struct ft_cxt *cxt, void *blob)
++{
++	struct boot_param_header *bph = (struct boot_param_header *)blob;
++	u32 *p_struct = (u32 *) ((char *)bph + be32_to_cpu(bph->off_dt_struct));
++	u32 *p_strings =
++	    (u32 *) ((char *)bph + be32_to_cpu(bph->off_dt_strings));
++	u32 tag, *p;
++	char *s, *t;
++	int depth, sz;
++
++	if (be32_to_cpu(*(u32 *) (cxt->p - 4)) != OF_DT_END_NODE)
++		return;		/* XXX only for node */
++
++	cxt->p -= 4;
++
++	depth = 0;
++	p = p_struct;
++	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
++
++		/* printf("tag: 0x%08x (%d) - %d\n", tag, p - p_struct, depth); */
++
++		if (tag == OF_DT_BEGIN_NODE) {
++			s = (char *)p;
++			p = (u32 *) _ALIGN((unsigned long)p + strlen(s) + 1, 4);
++
++			if (depth++ > 0)
++				ft_begin_node(cxt, s);
++
++			continue;
++		}
++
++		if (tag == OF_DT_END_NODE) {
++			ft_end_node(cxt);
++			if (--depth == 0)
++				break;
++			continue;
++		}
++
++		if (tag == OF_DT_NOP)
++			continue;
++
++		if (tag != OF_DT_PROP)
++			break;
++
++		sz = be32_to_cpu(*p++);
++		s = (char *)p_strings + be32_to_cpu(*p++);
++		t = (char *)p;
++		p = (u32 *) _ALIGN((unsigned long)p + sz, 4);
++
++		ft_prop(cxt, s, t, sz);
++	}
++}
++
++void *ft_get_prop(void *bphp, const char *propname, int *szp)
++{
++	struct boot_param_header *bph = bphp;
++	uint32_t *p_struct =
++	    (uint32_t *) ((char *)bph + be32_to_cpu(bph->off_dt_struct));
++	uint32_t *p_strings =
++	    (uint32_t *) ((char *)bph + be32_to_cpu(bph->off_dt_strings));
++	uint32_t version = be32_to_cpu(bph->version);
++	uint32_t tag;
++	uint32_t *p;
++	char *s, *t;
++	char *ss;
++	int sz;
++	static char path[256], prop[256];
++
++	path[0] = '\0';
++
++	p = p_struct;
++	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
++
++		if (tag == OF_DT_BEGIN_NODE) {
++			s = (char *)p;
++			p = (uint32_t *) _ALIGN((unsigned long)p + strlen(s) +
++						1, 4);
++			strcat(path, s);
++			strcat(path, "/");
++			continue;
++		}
++
++		if (tag == OF_DT_END_NODE) {
++			path[strlen(path) - 1] = '\0';
++			ss = strrchr(path, '/');
++			if (ss != NULL)
++				ss[1] = '\0';
++			continue;
++		}
++
++		if (tag == OF_DT_NOP)
++			continue;
++
++		if (tag != OF_DT_PROP)
++			break;
++
++		sz = be32_to_cpu(*p++);
++		s = (char *)p_strings + be32_to_cpu(*p++);
++		if (version < 0x10 && sz >= 8)
++			p = (uint32_t *) _ALIGN((unsigned long)p, 8);
++		t = (char *)p;
++		p = (uint32_t *) _ALIGN((unsigned long)p + sz, 4);
++
++		strcpy(prop, path);
++		strcat(prop, s);
++
++		if (strcmp(prop, propname) == 0) {
++			*szp = sz;
++			return t;
++		}
++	}
++
++	return NULL;
++}
++
++/********************************************************************/
++
++extern unsigned char oftree_dtb[];
++extern unsigned int oftree_dtb_len;
++
++/* Function that returns a character from the environment */
++extern uchar(*env_get_char) (int);
++
++void ft_setup(void *blob, int size, bd_t * bd)
++{
++	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;
++
++	ft_begin(&cxt, blob, size);
++
++	/* fs_add_rsvmap not used */
++
++	ft_begin_tree(&cxt);
++
++	ft_begin_node(&cxt, "");
++
++	ft_end_node(&cxt);
++
++	/* copy RO tree */
++	ft_merge_blob(&cxt, oftree_dtb);
++
++	/* back into root */
++	ft_backtrack_node(&cxt);
++
++	ft_begin_node(&cxt, "u-boot-env");
++
++	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
++		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ;
++		s = tmpenv;
++		for (k = i; k < nxt && s < &tmpenv[sizeof(tmpenv) - 1]; ++k)
++			*s++ = env_get_char(k);
++		*s++ = '\0';
++		lval = tmpenv;
++		s = strchr(tmpenv, '=');
++		if (s != NULL) {
++			*s++ = '\0';
++			rval = s;
++		} else
++			continue;
++		ft_prop_str(&cxt, lval, rval);
++	}
++
++	ft_end_node(&cxt);
++
++	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? */
++
++	ft_end_node(&cxt);
++
++	ft_end_node(&cxt);	/* end root */
++
++	ft_end_tree(&cxt);
++
++	/*
++	   printf("merged OF-tree\n");
++	   ft_dump_blob(blob);
++	 */
++
++	/* paste the bd_t@the end of the flat tree */
++	end = (char *)blob +
++	    be32_to_cpu(((struct boot_param_header *)blob)->totalsize);
++	memcpy(end, bd, sizeof(*bd));
++
++#ifdef __powerpc__
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/memstart", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_memstart);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/memsize", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_memsize);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/flashstart", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_flashstart);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/flashsize", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_flashsize);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/flashoffset", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_flashoffset);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/sramstart", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_sramstart);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/sramsize", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_sramsize);
++
++#if defined(CONFIG_5xx) || defined(CONFIG_8xx) || defined(CONFIG_8260) \
++	|| defined(CONFIG_E500)
++	p = ft_get_prop(blob, "/u-boot-bd_t/immr_base", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_immr_base);
++#endif
++
++#if defined(CONFIG_MPC5xxx)
++	p = ft_get_prop(blob, "/u-boot-bd_t/mbar_base", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_mbar_base);
++#endif
++
++#if defined(CONFIG_MPC83XX)
++	p = ft_get_prop(blob, "/u-boot-bd_t/immrbar", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_immrbar);
++#endif
++
++#if defined(CONFIG_MPC8220)
++	p = ft_get_prop(blob, "/u-boot-bd_t/mbar_base", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_mbar_base);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/inpfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_nipfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/pcifreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_pcifreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/pevfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_pevfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/flbfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_flbfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/vcofreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_vcofreq);
++#endif
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/bootflags", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_bootflags);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/ip_addr", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_ip_addr);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/enetaddr", &len);
++	if (p != NULL)
++		memcpy(p, bd->bi_enetaddr, 6);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/ethspeed", &len);
++	if (p != NULL)
++		*p = cpu_to_be32((uint32_t) bd->bi_ethspeed);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/intfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_intfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/busfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_busfreq);
++
++#ifdef CONFIG_CPM2
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/cpmfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_cpmfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/brgfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_brgfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/sccfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_sccfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/vco", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_vco);
++#endif
++
++#if defined(CONFIG_MPC5xxx)
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/ipbfreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_ipbfreq);
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/pcifreq", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_pcifreq);
++#endif
++
++	p = ft_get_prop(blob, "/u-boot-bd_t/baudrate", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(bd->bi_baudrate);
++
++#if defined(CONFIG_8xx)
++	clock = gd->cpu_clk;
++#elif defined(CONFIG_8260)
++	clock = gd->brg_clk;
++#else
++	clock = 0;
++#endif
++	p = ft_get_prop(blob, "/cpus/" OF_CPU "/clock-frequency", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(clock);
++
++	p = ft_get_prop(blob, "/cpus/" OF_CPU "/timebase-frequency", &len);
++	if (p != NULL)
++		*p = cpu_to_be32(clock / 4);	/* XXX I'm just guessing */
++
++#endif				/* __powerpc__ */
++
++	/*
++	   printf("final OF-tree\n");
++	   ft_dump_blob(blob);
++	 */
++
++}
++
++#endif
+diff --git a/include/ft_build.h b/include/ft_build.h
+new file mode 100644
+--- /dev/null
++++ b/include/ft_build.h
+@@ -0,0 +1,66 @@
++/*
++ * OF Flat tree builder
++ *
++ */
++
++#ifndef FT_BUILD_H
++#define FT_BUILD_H
++
++#include <linux/types.h>
++#include <asm/u-boot.h>
++
++/* Definitions used by the flattened device tree */
++#define OF_DT_HEADER		0xd00dfeed	/* marker */
++#define OF_DT_BEGIN_NODE	0x1	/* Start of node, full name */
++#define OF_DT_END_NODE		0x2	/* End node */
++#define OF_DT_PROP		0x3	/* Property: name off, size,
++					 * content */
++#define OF_DT_NOP		0x4	/* nop */
++#define OF_DT_END		0x9
++
++#define OF_DT_VERSION		0x10
++
++struct boot_param_header {
++	u32 magic;		/* magic word OF_DT_HEADER */
++	u32 totalsize;		/* total size of DT block */
++	u32 off_dt_struct;	/* offset to structure */
++	u32 off_dt_strings;	/* offset to strings */
++	u32 off_mem_rsvmap;	/* offset to memory reserve map */
++	u32 version;		/* format version */
++	u32 last_comp_version;	/* last compatible version */
++	/* version 2 fields below */
++	u32 boot_cpuid_phys;	/* Physical CPU id we're booting on */
++	/* version 3 fields below */
++	u32 dt_strings_size;	/* size of the DT strings block */
++};
++
++struct ft_cxt {
++	struct boot_param_header *bph;
++	int max_size;		/* maximum size of tree */
++	int overflow;		/* set when this happens */
++	u8 *p, *pstr, *pres;	/* running pointers */
++	u8 *p_begin, *pstr_begin, *pres_begin;	/* starting pointers */
++	u8 *p_anchor;		/* start of constructed area */
++	int struct_size, strings_size, res_size;
++};
++
++void ft_begin_node(struct ft_cxt *cxt, const char *name);
++void ft_end_node(struct ft_cxt *cxt);
++
++void ft_begin_tree(struct ft_cxt *cxt);
++int ft_end_tree(struct ft_cxt *cxt);
++
++void ft_nop(struct ft_cxt *cxt);
++void ft_prop(struct ft_cxt *cxt, const char *name, const void *data, int sz);
++void ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
++void ft_prop_int(struct ft_cxt *cxt, const char *name, int val);
++void ft_begin(struct ft_cxt *cxt, void *blob, int max_size);
++void ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
++
++void ft_setup(void *blob, int size, bd_t * bd);
++
++void ft_dump_blob(const void *bphp);
++void ft_merge_blob(struct ft_cxt *cxt, void *blob);
++void *ft_get_prop(void *bphp, const char *propname, int *szp);
++
++#endif
+-------------- next part --------------
+diff --git a/board/stxxtc/Makefile b/board/stxxtc/Makefile
+--- a/board/stxxtc/Makefile
++++ b/board/stxxtc/Makefile
+@@ -25,11 +25,19 @@ include $(TOPDIR)/config.mk
+ 
+ LIB	= lib$(BOARD).a
+ 
+-OBJS	= $(BOARD).o
++OBJS	= $(BOARD).o oftree.o
+ 
+ $(LIB):	.depend $(OBJS)
+ 	$(AR) crv $@ $(OBJS)
+ 
++%.dtb: %.dts
++	dtc -f -V 0x10 -I dts -O dtb $< >$@
++
++%.c: %.dtb
++	xxd -i $< \
++	   | sed -e "s/^unsigned char/const unsigned char/g" \
++	   | sed -e "s/^unsigned int/const unsigned int/g" > $@
++
+ #########################################################################
+ 
+ .depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+@@ -38,3 +46,4 @@ $(LIB):	.depend $(OBJS)
+ sinclude .depend
+ 
+ #########################################################################
++
+diff --git a/board/stxxtc/oftree.dts b/board/stxxtc/oftree.dts
+new file mode 100644
+--- /dev/null
++++ b/board/stxxtc/oftree.dts
+@@ -0,0 +1,52 @@
++/ {
++	model = "STXXTC V1";
++	compatible = "STXXTC";
++	#address-cells = <2>;
++	#size-cells = <2>;
++
++	cpus {
++		linux,phandle = <1>;
++		#address-cells = <1>;
++		#size-cells = <0>;
++		PowerPC,MPC870 at 0 {
++			linux,phandle = <3>;
++			name = "PowerPC,MPC870";
++			device_type = "cpu";
++			reg = <0>;
++			clock-frequency = <0>;		/* place-holder for runtime fillup */
++			timebase-frequency = <0>;	/* dido */
++			linux,boot-cpu;
++			i-cache-size = <2000>;
++			d-cache-size = <2000>;
++			32-bit;
++		};
++	};
++
++	memory at 0 {
++		device_type = "memory";
++		reg = <00000000 00000000 00000000 20000000>;
++	};
++
++	/* copy of the bd_t information (place-holders) */
++	u-boot-bd_t {
++		memstart	= <0>;
++		memsize		= <0>;
++		flashstart	= <0>;
++		flashsize	= <0>;
++		flashoffset	= <0>;
++		sramstart	= <0>;
++		sramsize	= <0>;
++
++		immr_base	= <0>;
++
++		bootflags	= <0>;
++		ip_addr		= <0>;
++		enetaddr	= [ 00 00 00 00 00 00 ];
++		ethspeed	= <0>;
++		intfreq		= <0>;
++		busfreq		= <0>;
++
++		baudrate	= <0>;
++	};
++
++};
+diff --git a/board/stxxtc/stxxtc.c b/board/stxxtc/stxxtc.c
+--- a/board/stxxtc/stxxtc.c
++++ b/board/stxxtc/stxxtc.c
+@@ -38,6 +38,13 @@
+ #include <watchdog.h>
+ #endif
+ 
++#include <ft_build.h>
++
++/****************************************************************/
++
++extern const unsigned char oftree_dtb[];
++extern const unsigned int oftree_dtb_len;
++
+ /****************************************************************/
+ 
+ /* some sane bit macros */
+diff --git a/include/configs/stxxtc.h b/include/configs/stxxtc.h
+--- a/include/configs/stxxtc.h
++++ b/include/configs/stxxtc.h
+@@ -574,19 +574,14 @@ typedef unsigned int led_id_t;
+ #define CONFIG_CRC32_VERIFY	1
+ #define CONFIG_HUSH_OLD_PARSER_COMPATIBLE	1
+ 
+-/* Note: change below for your network setting!!!
+- * This was done just to facilitate manufacturing test and configuration.
+- */
+-#define CONFIG_ETHADDR	 00:e0:0c:07:9b:8a
++/*****************************************************************************/
+ 
+-#define CONFIG_SERVERIP 	192.168.08.1
+-#define CONFIG_IPADDR  		192.168.08.85
+-#define CONFIG_GATEWAYIP	192.168.08.1
+-#define CONFIG_NETMASK		255.255.255.0
+-#define CONFIG_HOSTNAME 	stx_xtc
+-#define CONFIG_ROOTPATH 	/xtcroot
+-#define CONFIG_BOOTFILE 	uImage
+-#define CONFIG_LOADADDR		0x1000000
++/* pass open firmware flat tree */
++#define CONFIG_OF_FLAT_TREE	1
+ 
++/* maximum size of the flat tree (8K) */
++#define OF_FLAT_TREE_MAX_SIZE	8192
++
++#define OF_CPU			"PowerPC,MPC870 at 0"
+ 
+ #endif	/* __CONFIG_H */
diff --git a/a/2.hdr b/a/2.hdr
deleted file mode 100644
index f5783ce..0000000
--- a/a/2.hdr
+++ /dev/null
@@ -1,6 +0,0 @@
-Content-Type: text/plain;
-  charset="us-ascii";
-  name="of-uboot-base.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline;
-	filename="of-uboot-base.patch"
diff --git a/a/2.txt b/a/2.txt
deleted file mode 100644
index c14b409..0000000
--- a/a/2.txt
+++ /dev/null
@@ -1,925 +0,0 @@
-diff --git a/common/Makefile b/common/Makefile
---- a/common/Makefile
-+++ b/common/Makefile
-@@ -51,7 +51,7 @@ COBJS	= main.o ACEX1K.o altera.o bedbug.
- 	  memsize.o miiphybb.o miiphyutil.o \
- 	  s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o \
- 	  usb.o usb_kbd.o usb_storage.o \
--	  virtex2.o xilinx.o
-+	  virtex2.o xilinx.o ft_build.o
- 
- OBJS	= $(AOBJS) $(COBJS)
- 
-diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
---- a/common/cmd_bootm.c
-+++ b/common/cmd_bootm.c
-@@ -34,6 +34,10 @@
- #include <environment.h>
- #include <asm/byteorder.h>
- 
-+#ifdef CONFIG_OF_FLAT_TREE
-+#include <ft_build.h>
-+#endif
-+
-  /*cmd_boot.c*/
-  extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
- 
-@@ -487,6 +491,9 @@ fixup_silent_linux ()
- }
- #endif /* CONFIG_SILENT_CONSOLE */
- 
-+extern const unsigned char oftree_dtb[];
-+extern const unsigned int oftree_dtb_len;
-+
- #ifdef CONFIG_PPC
- static void
- do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
-@@ -509,6 +516,9 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
- 	bd_t	*kbd;
- 	void	(*kernel)(bd_t *, ulong, ulong, ulong, ulong);
- 	image_header_t *hdr = &header;
-+#ifdef CONFIG_OF_FLAT_TREE
-+	char	*of_flat_tree;
-+#endif
- 
- 	if ((s = getenv ("initrd_high")) != NULL) {
- 		/* a value of "no" or a similar string will act like 0,
-@@ -773,16 +783,24 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
- 		initrd_start = 0;
- 		initrd_end = 0;
- 	}
--
-+#ifdef CONFIG_OF_FLAT_TREE
-+	if (initrd_start == 0)
-+		of_flat_tree = (char *)(((ulong)kbd - OF_FLAT_TREE_MAX_SIZE) & ~0xF);
-+	else
-+		of_flat_tree = (char *)((initrd_start - OF_FLAT_TREE_MAX_SIZE) & ~0xF);
-+#endif
- 
- 	debug ("## Transferring control to Linux (at address %08lx) ...\n",
- 		(ulong)kernel);
- 
- 	SHOW_BOOT_PROGRESS (15);
- 
-+#ifndef CONFIG_OF_FLAT_TREE
-+
- #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
- 	unlock_ram_in_cache();
- #endif
-+
- 	/*
- 	 * Linux Kernel Parameters:
- 	 *   r3: ptr to board info data
-@@ -792,6 +810,25 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
- 	 *   r7: End   of command line string
- 	 */
- 	(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
-+#else
-+
-+	ft_setup(of_flat_tree, OF_FLAT_TREE_MAX_SIZE, kbd);
-+	/* ft_dump_blob(of_flat_tree); */
-+
-+#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
-+	unlock_ram_in_cache();
-+#endif
-+	/*
-+	 * Linux Kernel Parameters:
-+	 *   r3: ptr to board info data
-+	 *   r4: initrd_start or 0 if no initrd
-+	 *   r5: initrd_end - unused if r4 is 0
-+	 *   r6: Start of command line string
-+	 *   r7: End   of command line string
-+	 */
-+	(*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end, cmd_start, cmd_end);
-+
-+#endif
- }
- #endif /* CONFIG_PPC */
- 
-diff --git a/common/ft_build.c b/common/ft_build.c
-new file mode 100644
---- /dev/null
-+++ b/common/ft_build.c
-@@ -0,0 +1,751 @@
-+/*
-+ * OF flat tree builder
-+ */
-+
-+#include <common.h>
-+#include <malloc.h>
-+#include <environment.h>
-+
-+#include <asm/errno.h>
-+
-+#include <ft_build.h>
-+
-+#ifdef CONFIG_OF_FLAT_TREE
-+
-+/* align addr on a size boundary - adjust address up if needed -- Cort */
-+#define _ALIGN(addr,size)       (((addr)+(size)-1)&(~((size)-1)))
-+
-+static void ft_put_word(struct ft_cxt *cxt, u32 v)
-+{
-+	if (cxt->overflow)	/* do nothing */
-+		return;
-+
-+	/* check for overflow */
-+	if (cxt->p + 4 > cxt->pstr) {
-+		cxt->overflow = 1;
-+		return;
-+	}
-+
-+	*(u32 *) cxt->p = cpu_to_be32(v);
-+	cxt->p += 4;
-+}
-+
-+static inline void ft_put_bin(struct ft_cxt *cxt, const void *data, int sz)
-+{
-+	u8 *p;
-+
-+	if (cxt->overflow)	/* do nothing */
-+		return;
-+
-+	/* next pointer pos */
-+	p = (u8 *) _ALIGN((unsigned long)cxt->p + sz, 4);
-+
-+	/* check for overflow */
-+	if (p > cxt->pstr) {
-+		cxt->overflow = 1;
-+		return;
-+	}
-+
-+	memcpy(cxt->p, data, sz);
-+	if ((sz & 3) != 0)
-+		memset(cxt->p + sz, 0, 4 - (sz & 3));
-+	cxt->p = p;
-+}
-+
-+void ft_begin_node(struct ft_cxt *cxt, const char *name)
-+{
-+	ft_put_word(cxt, OF_DT_BEGIN_NODE);
-+	ft_put_bin(cxt, name, strlen(name) + 1);
-+}
-+
-+void ft_end_node(struct ft_cxt *cxt)
-+{
-+	ft_put_word(cxt, OF_DT_END_NODE);
-+}
-+
-+void ft_nop(struct ft_cxt *cxt)
-+{
-+	ft_put_word(cxt, OF_DT_NOP);
-+}
-+
-+static int lookup_string(struct ft_cxt *cxt, const char *name)
-+{
-+	u8 *p;
-+
-+	p = cxt->pstr;
-+	while (p < cxt->pstr_begin) {
-+		if (strcmp(p, name) == 0)
-+			return p - cxt->p_begin;
-+		p += strlen(p) + 1;
-+	}
-+
-+	return -1;
-+}
-+
-+void ft_prop(struct ft_cxt *cxt, const char *name, const void *data, int sz)
-+{
-+	int len, off;
-+
-+	if (cxt->overflow)
-+		return;
-+
-+	len = strlen(name) + 1;
-+
-+	off = lookup_string(cxt, name);
-+	if (off == -1) {
-+		/* check if we have space */
-+		if (cxt->p + 12 + sz + len > cxt->pstr) {
-+			cxt->overflow = 1;
-+			return;
-+		}
-+
-+		cxt->pstr -= len;
-+		memcpy(cxt->pstr, name, len);
-+		off = cxt->pstr - cxt->p_begin;
-+	}
-+
-+	/* now put offset from beginning of *STRUCTURE* */
-+	/* will be fixed up at the end */
-+	ft_put_word(cxt, OF_DT_PROP);
-+	ft_put_word(cxt, sz);
-+	ft_put_word(cxt, off);
-+	ft_put_bin(cxt, data, sz);
-+}
-+
-+void ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
-+{
-+	ft_prop(cxt, name, str, strlen(str) + 1);
-+}
-+
-+void ft_prop_int(struct ft_cxt *cxt, const char *name, int val)
-+{
-+	u32 v = cpu_to_be32((u32) val);
-+
-+	ft_prop(cxt, name, &v, 4);
-+}
-+
-+/* start construction of the flat OF tree */
-+void ft_begin(struct ft_cxt *cxt, void *blob, int max_size)
-+{
-+	struct boot_param_header *bph = blob;
-+	u32 off;
-+
-+	/* clear the cxt */
-+	memset(cxt, 0, sizeof(*cxt));
-+
-+	cxt->bph = bph;
-+	cxt->max_size = max_size;
-+
-+	/* zero everything in the header area */
-+	memset(bph, 0, sizeof(*bph));
-+
-+	bph->magic = cpu_to_be32(OF_DT_HEADER);
-+	bph->version = cpu_to_be32(0x10);
-+	bph->last_comp_version = cpu_to_be32(0x10);
-+
-+	/* start pointers */
-+	cxt->pres_begin = (u8 *) _ALIGN((unsigned long)(bph + 1), 8);
-+	cxt->pres = cxt->pres_begin;
-+
-+	off = (unsigned long)cxt->pres_begin - (unsigned long)bph;
-+	bph->off_mem_rsvmap = cpu_to_be32(off);
-+
-+	((u64 *) cxt->pres)[0] = 0;	/* phys = 0, size = 0, terminate */
-+	((u64 *) cxt->pres)[1] = 0;
-+
-+	cxt->p_anchor = cxt->pres + 16;	/* over the terminator */
-+}
-+
-+/* add a reserver physical area to the rsvmap */
-+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 */
-+
-+	((u64 *) cxt->pres)[0] = 0;	/* phys = 0, size = 0, terminate */
-+	((u64 *) cxt->pres)[1] = 0;
-+
-+	/* keep track of size */
-+	cxt->res_size = cxt->pres + 16 - cxt->pres_begin;
-+
-+	cxt->p_anchor = cxt->pres + 16;	/* over the terminator */
-+}
-+
-+void ft_begin_tree(struct ft_cxt *cxt)
-+{
-+	cxt->p_begin = cxt->p_anchor;
-+	cxt->pstr_begin = (char *)cxt->bph + cxt->max_size;	/* point at the end */
-+
-+	cxt->p = cxt->p_begin;
-+	cxt->pstr = cxt->pstr_begin;
-+}
-+
-+int ft_end_tree(struct ft_cxt *cxt)
-+{
-+	struct boot_param_header *bph = cxt->bph;
-+	int off, sz, sz1;
-+	u32 tag, v;
-+	u8 *p;
-+
-+	ft_put_word(cxt, OF_DT_END);
-+
-+	if (cxt->overflow)
-+		return -ENOMEM;
-+
-+	/* size of the areas */
-+	cxt->struct_size = cxt->p - cxt->p_begin;
-+	cxt->strings_size = cxt->pstr_begin - cxt->pstr;
-+
-+	/* the offset we must move */
-+	off = (cxt->pstr_begin - cxt->p_begin) - cxt->strings_size;
-+
-+	/* the new strings start */
-+	cxt->pstr_begin = cxt->p_begin + cxt->struct_size;
-+
-+	/* move the whole string area */
-+	memmove(cxt->pstr_begin, cxt->pstr, cxt->strings_size);
-+
-+	/* now perform the fixup of the strings */
-+	p = cxt->p_begin;
-+	while ((tag = be32_to_cpu(*(u32 *) p)) != OF_DT_END) {
-+		p += 4;
-+
-+		if (tag == OF_DT_BEGIN_NODE) {
-+			p = (u8 *) _ALIGN((unsigned long)p + strlen(p) + 1, 4);
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_END_NODE || tag == OF_DT_NOP)
-+			continue;
-+
-+		if (tag != OF_DT_PROP)
-+			return -EINVAL;
-+
-+		sz = be32_to_cpu(*(u32 *) p);
-+		p += 4;
-+
-+		v = be32_to_cpu(*(u32 *) p);
-+		v -= off;
-+		*(u32 *) p = cpu_to_be32(v);	/* move down */
-+		p += 4;
-+
-+		p = (u8 *) _ALIGN((unsigned long)p + sz, 4);
-+	}
-+
-+	/* fix sizes */
-+	p = (char *)cxt->bph;
-+	sz = (cxt->pstr_begin + cxt->strings_size) - p;
-+	sz1 = _ALIGN(sz, 16);	/* align at 16 bytes */
-+	if (sz != sz1)
-+		memset(p + sz, 0, sz1 - sz);
-+	bph->totalsize = cpu_to_be32(sz1);
-+	bph->off_dt_struct = cpu_to_be32(cxt->p_begin - p);
-+	bph->off_dt_strings = cpu_to_be32(cxt->pstr_begin - p);
-+
-+	/* the new strings start */
-+	cxt->pstr_begin = cxt->p_begin + cxt->struct_size;
-+	cxt->pstr = cxt->pstr_begin + cxt->strings_size;
-+
-+	return 0;
-+}
-+
-+/**********************************************************************/
-+
-+static inline int isprint(int c)
-+{
-+	return c >= 0x20 && c <= 0x7e;
-+}
-+
-+static int is_printable_string(const void *data, int len)
-+{
-+	const char *s = data;
-+	const char *ss;
-+
-+	/* zero length is not */
-+	if (len == 0)
-+		return 0;
-+
-+	/* must terminate with zero */
-+	if (s[len - 1] != '\0')
-+		return 0;
-+
-+	ss = s;
-+	while (*s && isprint(*s))
-+		s++;
-+
-+	/* not zero, or not done yet */
-+	if (*s != '\0' || (s + 1 - ss) < len)
-+		return 0;
-+
-+	return 1;
-+}
-+
-+static void print_data(const void *data, int len)
-+{
-+	int i;
-+	const u8 *s;
-+
-+	/* no data, don't print */
-+	if (len == 0)
-+		return;
-+
-+	if (is_printable_string(data, len)) {
-+		printf(" = \"%s\"", (char *)data);
-+		return;
-+	}
-+
-+	switch (len) {
-+	case 1:		/* byte */
-+		printf(" = <0x%02x>", (*(u8 *) data) & 0xff);
-+		break;
-+	case 2:		/* half-word */
-+		printf(" = <0x%04x>", be16_to_cpu(*(u16 *) data) & 0xffff);
-+		break;
-+	case 4:		/* word */
-+		printf(" = <0x%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
-+		break;
-+	case 8:		/* double-word */
-+		printf(" = <0x%16llx>", be64_to_cpu(*(uint64_t *) data));
-+		break;
-+	default:		/* anything else... hexdump */
-+		printf(" = [");
-+		for (i = 0, s = data; i < len; i++)
-+			printf("%02x%s", s[i], i < len - 1 ? " " : "");
-+		printf("]");
-+
-+		break;
-+	}
-+}
-+
-+void ft_dump_blob(const void *bphp)
-+{
-+	const struct boot_param_header *bph = bphp;
-+	const uint64_t *p_rsvmap = (const uint64_t *)
-+		((const char *)bph + be32_to_cpu(bph->off_mem_rsvmap));
-+	const u32 *p_struct = (const u32 *)
-+		((const char *)bph + be32_to_cpu(bph->off_dt_struct));
-+	const u32 *p_strings = (const u32 *)
-+		((const char *)bph + be32_to_cpu(bph->off_dt_strings));
-+	u32 tag;
-+	const u32 *p;
-+	const char *s, *t;
-+	int depth, sz, shift;
-+	int i;
-+	uint64_t addr, size;
-+
-+	depth = 0;
-+	shift = 4;
-+
-+	for (i = 0;; i++) {
-+		addr = be64_to_cpu(p_rsvmap[i * 2]);
-+		size = be64_to_cpu(p_rsvmap[i * 2 + 1]);
-+		if (addr == 0 && size == 0)
-+			break;
-+
-+		printf("/memreserve/ 0x%llx 0x%llx;\n", addr, size);
-+	}
-+
-+	p = p_struct;
-+	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
-+
-+		/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
-+
-+		if (tag == OF_DT_BEGIN_NODE) {
-+			s = (const char *)p;
-+			p = (u32 *) _ALIGN((unsigned long)p + strlen(s) + 1, 4);
-+
-+			printf("%*s%s {\n", depth * shift, "", s);
-+
-+			depth++;
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_END_NODE) {
-+			depth--;
-+
-+			printf("%*s};\n", depth * shift, "");
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_NOP) {
-+			printf("%*s[NOP]\n", depth * shift, "");
-+			continue;
-+		}
-+
-+		if (tag != OF_DT_PROP) {
-+			fprintf(stderr, "%*s ** Unknown tag 0x%08x\n",
-+				depth * shift, "", tag);
-+			break;
-+		}
-+		sz = be32_to_cpu(*p++);
-+		s = (const char *)p_strings + be32_to_cpu(*p++);
-+		t = (const char *)p;
-+		p = (const u32 *)_ALIGN((unsigned long)p + sz, 4);
-+		printf("%*s%s", depth * shift, "", s);
-+		print_data(t, sz);
-+		printf(";\n");
-+	}
-+}
-+
-+void ft_backtrack_node(struct ft_cxt *cxt)
-+{
-+	if (be32_to_cpu(*(u32 *) (cxt->p - 4)) != OF_DT_END_NODE)
-+		return;		/* XXX only for node */
-+
-+	cxt->p -= 4;
-+}
-+
-+/* note that the root node of the blob is "peeled" off */
-+void ft_merge_blob(struct ft_cxt *cxt, void *blob)
-+{
-+	struct boot_param_header *bph = (struct boot_param_header *)blob;
-+	u32 *p_struct = (u32 *) ((char *)bph + be32_to_cpu(bph->off_dt_struct));
-+	u32 *p_strings =
-+	    (u32 *) ((char *)bph + be32_to_cpu(bph->off_dt_strings));
-+	u32 tag, *p;
-+	char *s, *t;
-+	int depth, sz;
-+
-+	if (be32_to_cpu(*(u32 *) (cxt->p - 4)) != OF_DT_END_NODE)
-+		return;		/* XXX only for node */
-+
-+	cxt->p -= 4;
-+
-+	depth = 0;
-+	p = p_struct;
-+	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
-+
-+		/* printf("tag: 0x%08x (%d) - %d\n", tag, p - p_struct, depth); */
-+
-+		if (tag == OF_DT_BEGIN_NODE) {
-+			s = (char *)p;
-+			p = (u32 *) _ALIGN((unsigned long)p + strlen(s) + 1, 4);
-+
-+			if (depth++ > 0)
-+				ft_begin_node(cxt, s);
-+
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_END_NODE) {
-+			ft_end_node(cxt);
-+			if (--depth == 0)
-+				break;
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_NOP)
-+			continue;
-+
-+		if (tag != OF_DT_PROP)
-+			break;
-+
-+		sz = be32_to_cpu(*p++);
-+		s = (char *)p_strings + be32_to_cpu(*p++);
-+		t = (char *)p;
-+		p = (u32 *) _ALIGN((unsigned long)p + sz, 4);
-+
-+		ft_prop(cxt, s, t, sz);
-+	}
-+}
-+
-+void *ft_get_prop(void *bphp, const char *propname, int *szp)
-+{
-+	struct boot_param_header *bph = bphp;
-+	uint32_t *p_struct =
-+	    (uint32_t *) ((char *)bph + be32_to_cpu(bph->off_dt_struct));
-+	uint32_t *p_strings =
-+	    (uint32_t *) ((char *)bph + be32_to_cpu(bph->off_dt_strings));
-+	uint32_t version = be32_to_cpu(bph->version);
-+	uint32_t tag;
-+	uint32_t *p;
-+	char *s, *t;
-+	char *ss;
-+	int sz;
-+	static char path[256], prop[256];
-+
-+	path[0] = '\0';
-+
-+	p = p_struct;
-+	while ((tag = be32_to_cpu(*p++)) != OF_DT_END) {
-+
-+		if (tag == OF_DT_BEGIN_NODE) {
-+			s = (char *)p;
-+			p = (uint32_t *) _ALIGN((unsigned long)p + strlen(s) +
-+						1, 4);
-+			strcat(path, s);
-+			strcat(path, "/");
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_END_NODE) {
-+			path[strlen(path) - 1] = '\0';
-+			ss = strrchr(path, '/');
-+			if (ss != NULL)
-+				ss[1] = '\0';
-+			continue;
-+		}
-+
-+		if (tag == OF_DT_NOP)
-+			continue;
-+
-+		if (tag != OF_DT_PROP)
-+			break;
-+
-+		sz = be32_to_cpu(*p++);
-+		s = (char *)p_strings + be32_to_cpu(*p++);
-+		if (version < 0x10 && sz >= 8)
-+			p = (uint32_t *) _ALIGN((unsigned long)p, 8);
-+		t = (char *)p;
-+		p = (uint32_t *) _ALIGN((unsigned long)p + sz, 4);
-+
-+		strcpy(prop, path);
-+		strcat(prop, s);
-+
-+		if (strcmp(prop, propname) == 0) {
-+			*szp = sz;
-+			return t;
-+		}
-+	}
-+
-+	return NULL;
-+}
-+
-+/********************************************************************/
-+
-+extern unsigned char oftree_dtb[];
-+extern unsigned int oftree_dtb_len;
-+
-+/* Function that returns a character from the environment */
-+extern uchar(*env_get_char) (int);
-+
-+void ft_setup(void *blob, int size, bd_t * bd)
-+{
-+	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;
-+
-+	ft_begin(&cxt, blob, size);
-+
-+	/* fs_add_rsvmap not used */
-+
-+	ft_begin_tree(&cxt);
-+
-+	ft_begin_node(&cxt, "");
-+
-+	ft_end_node(&cxt);
-+
-+	/* copy RO tree */
-+	ft_merge_blob(&cxt, oftree_dtb);
-+
-+	/* back into root */
-+	ft_backtrack_node(&cxt);
-+
-+	ft_begin_node(&cxt, "u-boot-env");
-+
-+	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
-+		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ;
-+		s = tmpenv;
-+		for (k = i; k < nxt && s < &tmpenv[sizeof(tmpenv) - 1]; ++k)
-+			*s++ = env_get_char(k);
-+		*s++ = '\0';
-+		lval = tmpenv;
-+		s = strchr(tmpenv, '=');
-+		if (s != NULL) {
-+			*s++ = '\0';
-+			rval = s;
-+		} else
-+			continue;
-+		ft_prop_str(&cxt, lval, rval);
-+	}
-+
-+	ft_end_node(&cxt);
-+
-+	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? */
-+
-+	ft_end_node(&cxt);
-+
-+	ft_end_node(&cxt);	/* end root */
-+
-+	ft_end_tree(&cxt);
-+
-+	/*
-+	   printf("merged OF-tree\n");
-+	   ft_dump_blob(blob);
-+	 */
-+
-+	/* 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));
-+
-+#ifdef __powerpc__
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/memstart", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_memstart);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/memsize", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_memsize);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/flashstart", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_flashstart);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/flashsize", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_flashsize);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/flashoffset", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_flashoffset);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/sramstart", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_sramstart);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/sramsize", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_sramsize);
-+
-+#if defined(CONFIG_5xx) || defined(CONFIG_8xx) || defined(CONFIG_8260) \
-+	|| defined(CONFIG_E500)
-+	p = ft_get_prop(blob, "/u-boot-bd_t/immr_base", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_immr_base);
-+#endif
-+
-+#if defined(CONFIG_MPC5xxx)
-+	p = ft_get_prop(blob, "/u-boot-bd_t/mbar_base", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_mbar_base);
-+#endif
-+
-+#if defined(CONFIG_MPC83XX)
-+	p = ft_get_prop(blob, "/u-boot-bd_t/immrbar", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_immrbar);
-+#endif
-+
-+#if defined(CONFIG_MPC8220)
-+	p = ft_get_prop(blob, "/u-boot-bd_t/mbar_base", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_mbar_base);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/inpfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_nipfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/pcifreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_pcifreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/pevfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_pevfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/flbfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_flbfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/vcofreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_vcofreq);
-+#endif
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/bootflags", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_bootflags);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/ip_addr", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_ip_addr);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/enetaddr", &len);
-+	if (p != NULL)
-+		memcpy(p, bd->bi_enetaddr, 6);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/ethspeed", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32((uint32_t) bd->bi_ethspeed);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/intfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_intfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/busfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_busfreq);
-+
-+#ifdef CONFIG_CPM2
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/cpmfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_cpmfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/brgfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_brgfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/sccfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_sccfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/vco", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_vco);
-+#endif
-+
-+#if defined(CONFIG_MPC5xxx)
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/ipbfreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_ipbfreq);
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/pcifreq", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_pcifreq);
-+#endif
-+
-+	p = ft_get_prop(blob, "/u-boot-bd_t/baudrate", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(bd->bi_baudrate);
-+
-+#if defined(CONFIG_8xx)
-+	clock = gd->cpu_clk;
-+#elif defined(CONFIG_8260)
-+	clock = gd->brg_clk;
-+#else
-+	clock = 0;
-+#endif
-+	p = ft_get_prop(blob, "/cpus/" OF_CPU "/clock-frequency", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(clock);
-+
-+	p = ft_get_prop(blob, "/cpus/" OF_CPU "/timebase-frequency", &len);
-+	if (p != NULL)
-+		*p = cpu_to_be32(clock / 4);	/* XXX I'm just guessing */
-+
-+#endif				/* __powerpc__ */
-+
-+	/*
-+	   printf("final OF-tree\n");
-+	   ft_dump_blob(blob);
-+	 */
-+
-+}
-+
-+#endif
-diff --git a/include/ft_build.h b/include/ft_build.h
-new file mode 100644
---- /dev/null
-+++ b/include/ft_build.h
-@@ -0,0 +1,66 @@
-+/*
-+ * OF Flat tree builder
-+ *
-+ */
-+
-+#ifndef FT_BUILD_H
-+#define FT_BUILD_H
-+
-+#include <linux/types.h>
-+#include <asm/u-boot.h>
-+
-+/* Definitions used by the flattened device tree */
-+#define OF_DT_HEADER		0xd00dfeed	/* marker */
-+#define OF_DT_BEGIN_NODE	0x1	/* Start of node, full name */
-+#define OF_DT_END_NODE		0x2	/* End node */
-+#define OF_DT_PROP		0x3	/* Property: name off, size,
-+					 * content */
-+#define OF_DT_NOP		0x4	/* nop */
-+#define OF_DT_END		0x9
-+
-+#define OF_DT_VERSION		0x10
-+
-+struct boot_param_header {
-+	u32 magic;		/* magic word OF_DT_HEADER */
-+	u32 totalsize;		/* total size of DT block */
-+	u32 off_dt_struct;	/* offset to structure */
-+	u32 off_dt_strings;	/* offset to strings */
-+	u32 off_mem_rsvmap;	/* offset to memory reserve map */
-+	u32 version;		/* format version */
-+	u32 last_comp_version;	/* last compatible version */
-+	/* version 2 fields below */
-+	u32 boot_cpuid_phys;	/* Physical CPU id we're booting on */
-+	/* version 3 fields below */
-+	u32 dt_strings_size;	/* size of the DT strings block */
-+};
-+
-+struct ft_cxt {
-+	struct boot_param_header *bph;
-+	int max_size;		/* maximum size of tree */
-+	int overflow;		/* set when this happens */
-+	u8 *p, *pstr, *pres;	/* running pointers */
-+	u8 *p_begin, *pstr_begin, *pres_begin;	/* starting pointers */
-+	u8 *p_anchor;		/* start of constructed area */
-+	int struct_size, strings_size, res_size;
-+};
-+
-+void ft_begin_node(struct ft_cxt *cxt, const char *name);
-+void ft_end_node(struct ft_cxt *cxt);
-+
-+void ft_begin_tree(struct ft_cxt *cxt);
-+int ft_end_tree(struct ft_cxt *cxt);
-+
-+void ft_nop(struct ft_cxt *cxt);
-+void ft_prop(struct ft_cxt *cxt, const char *name, const void *data, int sz);
-+void ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
-+void ft_prop_int(struct ft_cxt *cxt, const char *name, int val);
-+void ft_begin(struct ft_cxt *cxt, void *blob, int max_size);
-+void ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
-+
-+void ft_setup(void *blob, int size, bd_t * bd);
-+
-+void ft_dump_blob(const void *bphp);
-+void ft_merge_blob(struct ft_cxt *cxt, void *blob);
-+void *ft_get_prop(void *bphp, const char *propname, int *szp);
-+
-+#endif
diff --git a/a/3.hdr b/a/3.hdr
deleted file mode 100644
index 2cc7131..0000000
--- a/a/3.hdr
+++ /dev/null
@@ -1,4 +0,0 @@
-Content-Type: text/plain; charset="us-ascii"; name="of-uboot-stxxtc.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline;
-	filename="of-uboot-stxxtc.patch"
diff --git a/a/3.txt b/a/3.txt
deleted file mode 100644
index 7149145..0000000
--- a/a/3.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-diff --git a/board/stxxtc/Makefile b/board/stxxtc/Makefile
---- a/board/stxxtc/Makefile
-+++ b/board/stxxtc/Makefile
-@@ -25,11 +25,19 @@ include $(TOPDIR)/config.mk
- 
- LIB	= lib$(BOARD).a
- 
--OBJS	= $(BOARD).o
-+OBJS	= $(BOARD).o oftree.o
- 
- $(LIB):	.depend $(OBJS)
- 	$(AR) crv $@ $(OBJS)
- 
-+%.dtb: %.dts
-+	dtc -f -V 0x10 -I dts -O dtb $< >$@
-+
-+%.c: %.dtb
-+	xxd -i $< \
-+	   | sed -e "s/^unsigned char/const unsigned char/g" \
-+	   | sed -e "s/^unsigned int/const unsigned int/g" > $@
-+
- #########################################################################
- 
- .depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
-@@ -38,3 +46,4 @@ $(LIB):	.depend $(OBJS)
- sinclude .depend
- 
- #########################################################################
-+
-diff --git a/board/stxxtc/oftree.dts b/board/stxxtc/oftree.dts
-new file mode 100644
---- /dev/null
-+++ b/board/stxxtc/oftree.dts
-@@ -0,0 +1,52 @@
-+/ {
-+	model = "STXXTC V1";
-+	compatible = "STXXTC";
-+	#address-cells = <2>;
-+	#size-cells = <2>;
-+
-+	cpus {
-+		linux,phandle = <1>;
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		PowerPC,MPC870@0 {
-+			linux,phandle = <3>;
-+			name = "PowerPC,MPC870";
-+			device_type = "cpu";
-+			reg = <0>;
-+			clock-frequency = <0>;		/* place-holder for runtime fillup */
-+			timebase-frequency = <0>;	/* dido */
-+			linux,boot-cpu;
-+			i-cache-size = <2000>;
-+			d-cache-size = <2000>;
-+			32-bit;
-+		};
-+	};
-+
-+	memory@0 {
-+		device_type = "memory";
-+		reg = <00000000 00000000 00000000 20000000>;
-+	};
-+
-+	/* copy of the bd_t information (place-holders) */
-+	u-boot-bd_t {
-+		memstart	= <0>;
-+		memsize		= <0>;
-+		flashstart	= <0>;
-+		flashsize	= <0>;
-+		flashoffset	= <0>;
-+		sramstart	= <0>;
-+		sramsize	= <0>;
-+
-+		immr_base	= <0>;
-+
-+		bootflags	= <0>;
-+		ip_addr		= <0>;
-+		enetaddr	= [ 00 00 00 00 00 00 ];
-+		ethspeed	= <0>;
-+		intfreq		= <0>;
-+		busfreq		= <0>;
-+
-+		baudrate	= <0>;
-+	};
-+
-+};
-diff --git a/board/stxxtc/stxxtc.c b/board/stxxtc/stxxtc.c
---- a/board/stxxtc/stxxtc.c
-+++ b/board/stxxtc/stxxtc.c
-@@ -38,6 +38,13 @@
- #include <watchdog.h>
- #endif
- 
-+#include <ft_build.h>
-+
-+/****************************************************************/
-+
-+extern const unsigned char oftree_dtb[];
-+extern const unsigned int oftree_dtb_len;
-+
- /****************************************************************/
- 
- /* some sane bit macros */
-diff --git a/include/configs/stxxtc.h b/include/configs/stxxtc.h
---- a/include/configs/stxxtc.h
-+++ b/include/configs/stxxtc.h
-@@ -574,19 +574,14 @@ typedef unsigned int led_id_t;
- #define CONFIG_CRC32_VERIFY	1
- #define CONFIG_HUSH_OLD_PARSER_COMPATIBLE	1
- 
--/* Note: change below for your network setting!!!
-- * This was done just to facilitate manufacturing test and configuration.
-- */
--#define CONFIG_ETHADDR	 00:e0:0c:07:9b:8a
-+/*****************************************************************************/
- 
--#define CONFIG_SERVERIP 	192.168.08.1
--#define CONFIG_IPADDR  		192.168.08.85
--#define CONFIG_GATEWAYIP	192.168.08.1
--#define CONFIG_NETMASK		255.255.255.0
--#define CONFIG_HOSTNAME 	stx_xtc
--#define CONFIG_ROOTPATH 	/xtcroot
--#define CONFIG_BOOTFILE 	uImage
--#define CONFIG_LOADADDR		0x1000000
-+/* pass open firmware flat tree */
-+#define CONFIG_OF_FLAT_TREE	1
- 
-+/* maximum size of the flat tree (8K) */
-+#define OF_FLAT_TREE_MAX_SIZE	8192
-+
-+#define OF_CPU			"PowerPC,MPC870@0"
- 
- #endif	/* __CONFIG_H */
diff --git a/a/content_digest b/N1/content_digest
index aefdf13..07f592a 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,11 +1,8 @@
  "From\0Pantelis Antoniou <pantelis.antoniou@gmail.com>\0"
- "Subject\0[PATCH] Add Flat OF tree support.\0"
+ "Subject\0[U-Boot-Users] [PATCH] Add Flat OF tree support.\0"
  "Date\0Fri, 2 Sep 2005 18:14:07 +0300\0"
- "To\0Wolfgang Denk <wd@denx.de>"
-  u-boot-users@lists.sourceforge.net
-  linuxppc-embedded@ozlabs.org
- " linuxppc-dev@ozlabs.org\0"
- "\01:1\0"
+ "To\0u-boot@lists.denx.de\0"
+ "\00:1\0"
  "b\0"
  "Hi all.\n"
  "\n"
@@ -35,10 +32,8 @@
  "\n"
  "Pantelis\n"
  "\n"
- P.S. Sorry for cross-posting, but it seems to be appropriate at this time.
- "\01:2\0"
- "fn\0of-uboot-base.patch\0"
- "b\0"
+ "P.S. Sorry for cross-posting, but it seems to be appropriate at this time.\n"
+ "-------------- next part --------------\n"
  "diff --git a/common/Makefile b/common/Makefile\n"
  "--- a/common/Makefile\n"
  "+++ b/common/Makefile\n"
@@ -730,7 +725,7 @@
  "+\t   ft_dump_blob(blob);\n"
  "+\t */\n"
  "+\n"
- "+\t/* paste the bd_t at the end of the flat tree */\n"
+ "+\t/* paste the bd_t@the end of the flat tree */\n"
  "+\tend = (char *)blob +\n"
  "+\t    be32_to_cpu(((struct boot_param_header *)blob)->totalsize);\n"
  "+\tmemcpy(end, bd, sizeof(*bd));\n"
@@ -963,10 +958,8 @@
  "+void ft_merge_blob(struct ft_cxt *cxt, void *blob);\n"
  "+void *ft_get_prop(void *bphp, const char *propname, int *szp);\n"
  "+\n"
- +#endif
- "\01:3\0"
- "fn\0of-uboot-stxxtc.patch\0"
- "b\0"
+ "+#endif\n"
+ "-------------- next part --------------\n"
  "diff --git a/board/stxxtc/Makefile b/board/stxxtc/Makefile\n"
  "--- a/board/stxxtc/Makefile\n"
  "+++ b/board/stxxtc/Makefile\n"
@@ -1011,7 +1004,7 @@
  "+\t\tlinux,phandle = <1>;\n"
  "+\t\t#address-cells = <1>;\n"
  "+\t\t#size-cells = <0>;\n"
- "+\t\tPowerPC,MPC870@0 {\n"
+ "+\t\tPowerPC,MPC870 at 0 {\n"
  "+\t\t\tlinux,phandle = <3>;\n"
  "+\t\t\tname = \"PowerPC,MPC870\";\n"
  "+\t\t\tdevice_type = \"cpu\";\n"
@@ -1025,7 +1018,7 @@
  "+\t\t};\n"
  "+\t};\n"
  "+\n"
- "+\tmemory@0 {\n"
+ "+\tmemory at 0 {\n"
  "+\t\tdevice_type = \"memory\";\n"
  "+\t\treg = <00000000 00000000 00000000 20000000>;\n"
  "+\t};\n"
@@ -1097,8 +1090,8 @@
  "+/* maximum size of the flat tree (8K) */\n"
  "+#define OF_FLAT_TREE_MAX_SIZE\t8192\n"
  "+\n"
- "+#define OF_CPU\t\t\t\"PowerPC,MPC870@0\"\n"
+ "+#define OF_CPU\t\t\t\"PowerPC,MPC870 at 0\"\n"
  " \n"
  " #endif\t/* __CONFIG_H */"
 
-b0a86ff418ae1bcae76bf552ed1ff94094ad348dccf05ebc2183eb8f6255c433
+22c75fc8dcb896b7ed2f9215cf261eca7ec7ecb353de86e9c0ef541a1f331926

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.