[coreboot] dt compiler patch

Myles Watson mylesgw at gmail.com
Tue Nov 25 15:28:29 CET 2008



> -----Original Message-----
> From: coreboot-bounces at coreboot.org [mailto:coreboot-bounces at coreboot.org]
> On Behalf Of ron minnich
> Sent: Monday, November 24, 2008 11:06 AM
> To: Coreboot
> Subject: [coreboot] dt compiler patch
> 
> This has been tested and builds a working boot-to-linux coreboot on
> the dbe62 (old style dts) and builds a serengeti target (new dts, but
> that new dts not submitted yet).
> 
> ron

Here's my first pass.

Thanks,
Myles

> I took the opportunity to do some cleanup. 
> 
> Signed-off-by: Ronald G. Minnich <rminnich at gmail.com>
> Index: util/dtc/flattree.c
> ===================================================================
> --- util/dtc/flattree.c	(revision 1046)
> +++ util/dtc/flattree.c	(working copy)
> @@ -443,10 +449,7 @@
>  {
>  	struct data d = p->val;
>  	FILE *f = e;
> -	int i;
>  	char *cleanname;
> -	int vallen = d.len > 4 ? 4 : d.len;
> -

Lets take out the commented code that uses these variables at the same time.

>  	/* nothing to do? */
>  	if (d.len == 0)
>  		return;
> @@ -865,7 +875,7 @@
>  
>  	if (tree->config){
>  		int i;
> -//		treename = clean(tree->label, 0);
> +//		treename = clean(tree->dtslabel, 0);

Maybe just remove this line.

>  		treename = toname(tree->config->label, "_config");
>  		for(i = 0; i < emitted_names_count; i++)
>  			if (!strcmp(treename, emitted_names[i]))
> Index: util/dtc/livetree.c
> ===================================================================
> --- util/dtc/livetree.c	(revision 1046)
> +++ util/dtc/livetree.c	(working copy)
> @@ -43,6 +44,74 @@
>  	return new;
>  }
>  
> +/* XXX HACK */
> +void move_proplist_to_config(struct node *f)
> +{
> +	struct node *n = f;
> +	while (n) {
> +		n->config = n->proplist; 
> +		n->proplist = NULL;
> +		move_proplist_to_config(n->children);
> +		n = n->next_sibling;
> +	} 
> +}
> +
> +/** 
> + * Given a set of nodes from a chip dts, and a set of nodes from the
mainboard dts, 
> + * update the chip dts nodes with values from the mainboard dts. 
> + * All this work is so that a chip dts can set default values and a
mainboard 
> + * can override them. 
> + * Node definitions come from the chip dts.
> + * These definitions have properties that are used in turn to create the 
> + * C structures. 
> + * Changing the vlaues of properties in the node definitions is done by
> + * creating nodes in the mainboard dts. 
> + * For each of the node defintions from 'config', we 
> + * have to match the node definitions in 'subnodes', 
> + * that have matching labels. For each matching label, we modify the 
> + * property settings for the node in config. 
> + * Finally, for all subnodes that are leftover, i.e. did not match
anything in the 
> + * config, we simply append them to the list of subnodes from config. 
> + * Later, it might be an error to have a missing match. 
> + * 
> + */
> +void
> +fixup_properties(struct node *chipnodes, struct node *mainboardnodes)
> +{
> +	struct node *c;
> +	struct node *m = mainboardnodes;
> +	struct node *del = NULL;
> +	struct node *head = mainboardnodes;
> +
> +	while (m) {
> +		for (c = chipnodes; c; c = c->next) {
> +			if (strcmp(c->dtslabel, m->dtslabel)) {
> +				continue;
> +			}
> +			/* match */
> +			/* the chip properties are in c->config list
> +			 * the dts properties are in the m->proplist. 
> +			 * So copy the mainboard properties to the chip
proplist. 
> +			 */
> +			c->proplist = m->proplist;

This is a replacement, shouldn't it be an append?

> +			c->children = m->children;

Again, this is a replacement, shouldn't it be an append?

> +			/* since we matched this node we have to delete it.
*/

The delete function says you can't have children, so the children link needs
to be NULL here.

> +			del = m;
> +			break;
> +		}
> +		/* must track head node for append_node below. */
> +		if (m == head)
> +			head = m->next;
> +		m = m->next;
> +		if (del)
> +			del_node(del);
> +		del = NULL;
> +	}
> +	/* backwards compatibility: anything left gets appended to the chip
list */
> +	if (head)
> +		append_node(chipnodes, head);
> +}
> +
>  struct property *chain_property(struct property *first, struct property
*list)
>  {
>  	assert(first->next == NULL);
> @@ -51,12 +120,9 @@
>  	return first;      
>  }
>  
> -struct node *build_node(struct property *config, struct property
*proplist, struct node *children)
> +struct node *new_node(struct property *config, struct property *proplist,
struct node *children)
>  {
> -	static struct node *last_node = NULL;
> -
>  	struct node *new = xmalloc(sizeof(*new));
> -	struct node *child;
>  
>  	memset(new, 0, sizeof(*new));
>  
> @@ -64,6 +130,39 @@
>  	new->proplist = proplist;
>  	new->children = children;
>  
> +	return new;
> +}
> +
> +/* we should only ever delete simple nodes: nodes with no kids. */
> +void del_node(struct node *node)
> +{
> +	struct node *n;
> +	assert(! node->children);
> +	if (first_node == node) {
> +		first_node = node->next;
> +		free(node);
> +		return;
> +	}
> +	for_all_nodes(n) {
> +		if (n->next != node)
> +			continue;
> +		n->next = node->next;
> +		n->next_sibling = node->next_sibling;

Will this always be true?  It seems like you need to go through again to do
the sibling links right.

> +		if (node == last_node)
> +			last_node = n;
> +		break;
> +	}
> +	free(node);
> +}
> +
> +struct node *build_node(struct property *config, struct property
*proplist, struct node *children)
> +{
> +
> +	struct node *new;
> +	struct node *child;
> +
> +	new = new_node(config, proplist, children);
> +
>  	for_each_child(new, child) {
>  		child->parent = new;
>  	}
> @@ -85,7 +184,7 @@
>  
>  	node->name = name;
>  
> -	node->label = label;
> +	node->dtslabel = label;
>  
>  	return node;
>  }
> @@ -98,6 +197,16 @@
>  	return first;
>  }
>  

Do we guarantee that you will never be appending to a NULL list (first ==
NULL), I didn't see that check.

> +struct node *append_node(struct node *first, struct node *list)
> +{
> +	struct node *n = first;
> +	while(n->next_sibling) {
> +		n = n->next_sibling;
> +	} 
> +	n->next_sibling = list;
> +	return first;
> +}
> +
>  void add_property(struct node *node, struct property *prop)
>  {
>  	struct property **p;





More information about the coreboot mailing list