diff options
Diffstat (limited to 'scripts/dtc/dtc.h')
| -rw-r--r-- | scripts/dtc/dtc.h | 107 | 
1 files changed, 65 insertions, 42 deletions
diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h index 08d54c87008..264a20cf66a 100644 --- a/scripts/dtc/dtc.h +++ b/scripts/dtc/dtc.h @@ -25,6 +25,7 @@  #include <string.h>  #include <stdlib.h>  #include <stdint.h> +#include <stdbool.h>  #include <stdarg.h>  #include <assert.h>  #include <ctype.h> @@ -34,7 +35,17 @@  #include <libfdt_env.h>  #include <fdt.h> +#include "util.h" + +#ifdef DEBUG +#define debug(fmt,args...)	printf(fmt, ##args) +#else +#define debug(fmt,args...) +#endif + +  #define DEFAULT_FDT_VERSION	17 +  /*   * Command line options   */ @@ -42,36 +53,11 @@ extern int quiet;		/* Level of quietness */  extern int reservenum;		/* Number of memory reservation slots */  extern int minsize;		/* Minimum blob size */  extern int padsize;		/* Additional padding to blob */ +extern int phandle_format;	/* Use linux,phandle or phandle properties */ -static inline void __attribute__((noreturn)) die(char * str, ...) -{ -	va_list ap; - -	va_start(ap, str); -	fprintf(stderr, "FATAL ERROR: "); -	vfprintf(stderr, str, ap); -	exit(1); -} - -static inline void *xmalloc(size_t len) -{ -	void *new = malloc(len); - -	if (! new) -		die("malloc() failed\n"); - -	return new; -} - -static inline void *xrealloc(void *p, size_t len) -{ -	void *new = realloc(p, len); - -	if (! new) -		die("realloc() failed (len=%d)\n", len); - -	return new; -} +#define PHANDLE_LEGACY	0x1 +#define PHANDLE_EPAPR	0x2 +#define PHANDLE_BOTH	0x3  typedef uint32_t cell_t; @@ -80,7 +66,6 @@ typedef uint32_t cell_t;  #define strneq(a, b, n)	(strncmp((a), (b), (n)) == 0)  #define ALIGN(x, a)	(((x) + (a) - 1) & ~((a) - 1)) -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))  /* Data blobs */  enum markertype { @@ -124,6 +109,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,  				  const void *p, int len);  struct data data_merge(struct data d1, struct data d2);  struct data data_append_cell(struct data d, cell_t word); +struct data data_append_integer(struct data d, uint64_t word, int bits);  struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);  struct data data_append_addr(struct data d, uint64_t addr);  struct data data_append_byte(struct data d, uint8_t byte); @@ -140,16 +126,24 @@ int data_is_one_string(struct data d);  #define MAX_NODENAME_LEN	31  /* Live trees */ +struct label { +	int deleted; +	char *label; +	struct label *next; +}; +  struct property { +	int deleted;  	char *name;  	struct data val;  	struct property *next; -	char *label; +	struct label *labels;  };  struct node { +	int deleted;  	char *name;  	struct property *proplist;  	struct node *children; @@ -163,29 +157,58 @@ struct node {  	cell_t phandle;  	int addr_cells, size_cells; -	char *label; +	struct label *labels;  }; -#define for_each_property(n, p) \ +#define for_each_label_withdel(l0, l) \ +	for ((l) = (l0); (l); (l) = (l)->next) + +#define for_each_label(l0, l) \ +	for_each_label_withdel(l0, l) \ +		if (!(l)->deleted) + +#define for_each_property_withdel(n, p) \  	for ((p) = (n)->proplist; (p); (p) = (p)->next) -#define for_each_child(n, c)	\ +#define for_each_property(n, p) \ +	for_each_property_withdel(n, p) \ +		if (!(p)->deleted) + +#define for_each_child_withdel(n, c) \  	for ((c) = (n)->children; (c); (c) = (c)->next_sibling) -struct property *build_property(char *name, struct data val, char *label); +#define for_each_child(n, c) \ +	for_each_child_withdel(n, c) \ +		if (!(c)->deleted) + +void add_label(struct label **labels, char *label); +void delete_labels(struct label **labels); + +struct property *build_property(char *name, struct data val); +struct property *build_property_delete(char *name);  struct property *chain_property(struct property *first, struct property *list);  struct property *reverse_properties(struct property *first);  struct node *build_node(struct property *proplist, struct node *children); -struct node *name_node(struct node *node, char *name, char *label); +struct node *build_node_delete(void); +struct node *name_node(struct node *node, char *name);  struct node *chain_node(struct node *first, struct node *list); +struct node *merge_nodes(struct node *old_node, struct node *new_node);  void add_property(struct node *node, struct property *prop); +void delete_property_by_name(struct node *node, char *name); +void delete_property(struct property *prop);  void add_child(struct node *parent, struct node *child); +void delete_node_by_name(struct node *parent, char *name); +void delete_node(struct node *node);  const char *get_unitname(struct node *node);  struct property *get_property(struct node *node, const char *propname);  cell_t propval_cell(struct property *prop); +struct property *get_property_by_label(struct node *tree, const char *label, +				       struct node **node); +struct marker *get_marker_label(struct node *tree, const char *label, +				struct node **node, struct property **prop);  struct node *get_subnode(struct node *node, const char *nodename);  struct node *get_node_by_path(struct node *tree, const char *path);  struct node *get_node_by_label(struct node *tree, const char *label); @@ -193,6 +216,8 @@ struct node *get_node_by_phandle(struct node *tree, cell_t phandle);  struct node *get_node_by_ref(struct node *tree, const char *ref);  cell_t get_node_phandle(struct node *root, struct node *node); +uint32_t guess_boot_cpuid(struct node *tree); +  /* Boot info (tree plus memreserve information */  struct reserve_info { @@ -200,10 +225,10 @@ struct reserve_info {  	struct reserve_info *next; -	char *label; +	struct label *labels;  }; -struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label); +struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len);  struct reserve_info *chain_reserve_entry(struct reserve_info *first,  					 struct reserve_info *list);  struct reserve_info *add_reserve_entry(struct reserve_info *list, @@ -218,9 +243,11 @@ struct boot_info {  struct boot_info *build_boot_info(struct reserve_info *reservelist,  				  struct node *tree, uint32_t boot_cpuid_phys); +void sort_tree(struct boot_info *bi);  /* Checks */ +void parse_checks_option(bool warn, bool error, const char *optarg);  void process_checks(int force, struct boot_info *bi);  /* Flattened trees */ @@ -239,8 +266,4 @@ struct boot_info *dt_from_source(const char *f);  struct boot_info *dt_from_fs(const char *dirname); -/* misc */ - -char *join_path(const char *path, const char *name); -  #endif /* _DTC_H */  | 
