fdt.hh revision 245803
1252265Sjimharris/*-
2252265Sjimharris * Copyright (c) 2013 David Chisnall
3252265Sjimharris * All rights reserved.
4252265Sjimharris *
5252265Sjimharris * This software was developed by SRI International and the University of
6252265Sjimharris * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
7252265Sjimharris * ("CTSRD"), as part of the DARPA CRASH research programme.
8252265Sjimharris *
9252265Sjimharris * Redistribution and use in source and binary forms, with or without
10252265Sjimharris * modification, are permitted provided that the following conditions
11252265Sjimharris * are met:
12252265Sjimharris * 1. Redistributions of source code must retain the above copyright
13252265Sjimharris *    notice, this list of conditions and the following disclaimer.
14252265Sjimharris * 2. Redistributions in binary form must reproduce the above copyright
15252265Sjimharris *    notice, this list of conditions and the following disclaimer in the
16252265Sjimharris *    documentation and/or other materials provided with the distribution.
17252265Sjimharris *
18252265Sjimharris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19252265Sjimharris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20252265Sjimharris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21252265Sjimharris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22252265Sjimharris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23252265Sjimharris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24252265Sjimharris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25252265Sjimharris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26252265Sjimharris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27252265Sjimharris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28252265Sjimharris * SUCH DAMAGE.
29252265Sjimharris *
30252265Sjimharris * $FreeBSD: head/usr.bin/dtc/fdt.hh 245803 2013-01-22 17:49:51Z theraven $
31252265Sjimharris */
32253109Sjimharris
33253458Sjimharris#ifndef _FDT_HH_
34252265Sjimharris#define _FDT_HH_
35253459Sjimharris#include <map>
36252265Sjimharris
37252265Sjimharris#include "util.hh"
38252265Sjimharris#include "string.hh"
39252265Sjimharris
40252265Sjimharrisnamespace dtc
41252265Sjimharris{
42252265Sjimharris
43252265Sjimharrisnamespace dtb
44252265Sjimharris{
45252265Sjimharrisstruct output_writer;
46252265Sjimharrisclass string_table;
47252265Sjimharris}
48252265Sjimharris
49253109Sjimharrisnamespace fdt
50252265Sjimharris{
51252265Sjimharris/**
52252265Sjimharris * Properties may contain a number of different value, each with a different
53252265Sjimharris * label.  This class encapsulates a single value.
54252265Sjimharris */
55252265Sjimharrisstruct property_value
56253474Sjimharris{
57252265Sjimharris	/**
58252265Sjimharris	 * The label for this data.  This is usually empty.
59252265Sjimharris	 */
60252265Sjimharris	string label;
61252265Sjimharris	/**
62252265Sjimharris	 * If this value is a string, or something resolved from a string (a
63252265Sjimharris	 * reference) then this contains the source string.
64252265Sjimharris	 */
65252265Sjimharris	string string_data;
66253109Sjimharris	/**
67252265Sjimharris	 * The data that should be written to the final output.
68252265Sjimharris	 */
69252265Sjimharris	byte_buffer byte_data;
70252265Sjimharris	/**
71252265Sjimharris	 * Enumeration describing the possible types of a value.  Note that
72252265Sjimharris	 * property-coded arrays will appear simply as binary (or possibly
73252265Sjimharris	 * string, if they happen to be nul-terminated and printable), and must
74252265Sjimharris	 * be checked separately.
75252265Sjimharris	 */
76252265Sjimharris	enum value_type
77252265Sjimharris	{
78252265Sjimharris		/**
79252265Sjimharris		 * This is a list of strings.  When read from source, string
80252270Sjimharris		 * lists become one property value for each string, however
81252265Sjimharris		 * when read from binary we have a single property value
82253109Sjimharris		 * incorporating the entire text, with nul bytes separating the
83252265Sjimharris		 * strings.
84253109Sjimharris		 */
85253458Sjimharris		STRING_LIST,
86253459Sjimharris		/**
87253109Sjimharris		 * This property contains a single string.
88253109Sjimharris		 */
89253109Sjimharris		STRING,
90252265Sjimharris		/**
91252265Sjimharris		 * This is a binary value.  Check the size of byte_data to
92252265Sjimharris		 * determine how many bytes this contains.
93252265Sjimharris		 */
94253437Sjimharris		BINARY,
95252265Sjimharris		/** This contains a short-form address that should be replaced
96252265Sjimharris		 * by a fully-qualified version.  This will only appear when
97252270Sjimharris		 * the input is a device tree source.  When parsed from a
98252270Sjimharris		 * device tree blob, the cross reference will have already been
99252265Sjimharris		 * resolved and the property value will be a string containing
100252265Sjimharris		 * the full path of the target node.  */
101252265Sjimharris		CROSS_REFERENCE,
102252265Sjimharris		/**
103252265Sjimharris		 * This is a phandle reference.  When parsed from source, the
104252265Sjimharris		 * string_data will contain the node label for the target and,
105252265Sjimharris		 * after cross references have been resolved, the binary data
106252265Sjimharris		 * will contain a 32-bit integer that should match the phandle
107252265Sjimharris		 * property of the target node.
108252265Sjimharris		 */
109252265Sjimharris		PHANDLE,
110252265Sjimharris		/**
111252265Sjimharris		 * An empty property value.  This will never appear on a real
112252265Sjimharris		 * property value, it is used by checkers to indicate that no
113253109Sjimharris		 * property values should exist for a property.
114252265Sjimharris		 */
115		EMPTY,
116		/**
117		 * The type of this property has not yet been determined.
118		 */
119		UNKNOWN
120	};
121	/**
122	 * The type of this property.
123	 */
124	value_type type;
125	/**
126	 * Returns true if this value is a cross reference, false otherwise.
127	 */
128	inline bool is_cross_reference()
129	{
130		return is_type(CROSS_REFERENCE);
131	}
132	/**
133	 * Returns true if this value is a phandle reference, false otherwise.
134	 */
135	inline bool is_phandle()
136	{
137		return is_type(PHANDLE);
138	}
139	/**
140	 * Returns true if this value is a string, false otherwise.
141	 */
142	inline bool is_string()
143	{
144		return is_type(STRING);
145	}
146	/**
147	 * Returns true if this value is a string list (a nul-separated
148	 * sequence of strings), false otherwise.
149	 */
150	inline bool is_string_list()
151	{
152		return is_type(STRING_LIST);
153	}
154	/**
155	 * Returns true if this value is binary, false otherwise.
156	 */
157	inline bool is_binary()
158	{
159		return is_type(BINARY);
160	}
161	/**
162	 * Returns this property value as a 32-bit integer.  Returns 0 if this
163	 * property value is not 32 bits long.  The bytes in the property value
164	 * are assumed to be in big-endian format, but the return value is in
165	 * the host native endian.
166	 */
167	uint32_t get_as_uint32();
168	/**
169	 * Default constructor, specifying the label of the value.
170	 */
171	property_value(string l=string()) : label(l), type(UNKNOWN) {}
172	/**
173	 * Writes the data for this value into an output buffer.
174	 */
175	void push_to_buffer(byte_buffer &buffer);
176
177	/**
178	 * Writes the property value to the standard output.  This uses the
179	 * following heuristics for deciding how to print the output:
180	 *
181	 * - If the value is nul-terminated and only contains printable
182	 *   characters, it is written as a string.
183	 * - If it is a multiple of 4 bytes long, then it is printed as cells.
184	 * - Otherwise, it is printed as a byte buffer.
185	 */
186	void write_dts(FILE *file);
187	private:
188	/**
189	 * Returns whether the value is of the specified type.  If the type of
190	 * the value has not yet been determined, then this calculates it.
191	 */
192	inline bool is_type(value_type v)
193	{
194		if (type == UNKNOWN)
195		{
196			resolve_type();
197		}
198		return type == v;
199	}
200	/**
201	 * Determines the type of the value based on its contents.
202	 */
203	void resolve_type();
204	/**
205	 * Writes the property value to the specified file as a quoted string.
206	 * This is used when generating DTS.
207	 */
208	void write_as_string(FILE *file);
209	/**
210	 * Writes the property value to the specified file as a sequence of
211	 * 32-bit big-endian cells.  This is used when generating DTS.
212	 */
213	void write_as_cells(FILE *file);
214	/**
215	 * Writes the property value to the specified file as a sequence of
216	 * bytes.  This is used when generating DTS.
217	 */
218	void write_as_bytes(FILE *file);
219};
220
221/**
222 * A value encapsulating a single property.  This contains a key, optionally a
223 * label, and optionally one or more values.
224 */
225class property
226{
227	/**
228	 * The name of this property.
229	 */
230	string key;
231	/**
232	 * An optional label.
233	 */
234	string label;
235	/**
236	 * The values in this property.
237	 */
238	std::vector<property_value> values;
239	/**
240	 * Value indicating that this is a valid property.  If a parse error
241	 * occurs, then this value is false.
242	 */
243	bool valid;
244	/**
245	 * Parses a string property value, i.e. a value enclosed in double quotes.
246	 */
247	void parse_string(input_buffer &input);
248	/**
249	 * Parses one or more 32-bit values enclosed in angle brackets.
250	 */
251	void parse_cells(input_buffer &input);
252	/**
253	 * Parses an array of bytes, contained within square brackets.
254	 */
255	void parse_bytes(input_buffer &input);
256	/**
257	 * Parses a reference.  This is a node label preceded by an ampersand
258	 * symbol, which should expand to the full path to that node.
259	 *
260	 * Note: The specification says that the target of such a reference is
261	 * a node name, however dtc assumes that it is a label, and so we
262	 * follow their interpretation for compatibility.
263	 */
264	void parse_reference(input_buffer &input);
265	/**
266	 * Constructs a new property from two input buffers, pointing to the
267	 * struct and strings tables in the device tree blob, respectively.
268	 * The structs input buffer is assumed to have just consumed the
269	 * FDT_PROP token.
270	 */
271	property(input_buffer &structs, input_buffer &strings);
272	/**
273	 * Parses a new property from the input buffer.
274	 */
275	property(input_buffer &input, string k, string l);
276	public:
277	/**
278	 * Creates an empty property.
279	 */
280	property(string k, string l=string()) : key(k), label(l), valid(true)
281	{}
282	/**
283	 * Copy constructor.
284	 */
285	property(property &p) : key(p.key), label(p.label), values(p.values),
286		valid(p.valid) {}
287	/**
288	 * Factory method for constructing a new property.  Attempts to parse a
289	 * property from the input, and returns it on success.  On any parse
290	 * error, this will return 0.
291	 */
292	static property* parse_dtb(input_buffer &structs,
293	                           input_buffer &strings);
294	/**
295	 * Factory method for constructing a new property.  Attempts to parse a
296	 * property from the input, and returns it on success.  On any parse
297	 * error, this will return 0.
298	 */
299	static property* parse(input_buffer &input,
300	                       string key,
301	                       string label=string());
302	/**
303	 * Iterator type used for accessing the values of a property.
304	 */
305	typedef std::vector<property_value>::iterator value_iterator;
306	/**
307	 * Returns an iterator referring to the first value in this property.
308	 */
309	inline value_iterator begin()
310	{
311		return values.begin();
312	}
313	/**
314	 * Returns an iterator referring to the last value in this property.
315	 */
316	inline value_iterator end()
317	{
318		return values.end();
319	}
320	/**
321	 * Adds a new value to an existing property.
322	 */
323	inline void add_value(property_value v)
324	{
325		values.push_back(v);
326	}
327	/**
328	 * Returns the key for this property.
329	 */
330	inline string get_key()
331	{
332		return key;
333	}
334	/**
335	 * Writes the property to the specified writer.  The property name is a
336	 * reference into the strings table.
337	 */
338	void write(dtb::output_writer &writer, dtb::string_table &strings);
339	/**
340	 * Writes in DTS format to the specified file, at the given indent
341	 * level.  This will begin the line with the number of tabs specified
342	 * as the indent level and then write the property in the most
343	 * applicable way that it can determine.
344	 */
345	void write_dts(FILE *file, int indent);
346};
347
348/**
349 * Class encapsulating a device tree node.  Nodes may contain properties and
350 * other nodes.
351 */
352class node
353{
354	public:
355	/**
356	 * The label for this node, if any.  Node labels are used as the
357	 * targets for cross references.
358	 */
359	string label;
360	/**
361	 * The name of the node.
362	 */
363	string name;
364	/**
365	 * The unit address of the node, which is optionally written after the
366	 * name followed by an at symbol.
367	 */
368	string unit_address;
369	private:
370	/**
371	 * The properties contained within this node.
372	 */
373	std::vector<property*> properties;
374	/**
375	 * The children of this node.
376	 */
377	std::vector<node*> children;
378	/**
379	 * A flag indicating whether this node is valid.  This is set to false
380	 * if an error occurs during parsing.
381	 */
382	bool valid;
383	/**
384	 * Parses a name inside a node, writing the string passed as the last
385	 * argument as an error if it fails.
386	 */
387	string parse_name(input_buffer &input,
388	                  bool &is_property,
389	                  const char *error);
390	/**
391	 * Constructs a new node from two input buffers, pointing to the struct
392	 * and strings tables in the device tree blob, respectively.
393	 */
394	node(input_buffer &structs, input_buffer &strings);
395	/**
396	 * Parses a new node from the specified input buffer.  This is called
397	 * when the input cursor is on the open brace for the start of the
398	 * node.  The name, and optionally label and unit address, should have
399	 * already been parsed.
400	 */
401	node(input_buffer &input, string n, string l, string a);
402	/**
403	 * Comparison function for properties, used when sorting the properties
404	 * vector.  Orders the properties based on their names.
405	 */
406	static inline bool cmp_properties(property *p1, property *p2);
407		/*
408	{
409		return p1->get_key() < p2->get_key();
410	}
411	*/
412	/**
413	 * Comparison function for nodes, used when sorting the children
414	 * vector.  Orders the nodes based on their names or, if the names are
415	 * the same, by the unit addresses.
416	 */
417	static inline bool cmp_children(node *c1, node *c2);
418		/*
419	{
420		if (c1->name == c2->name)
421		{
422			return c1->unit_address < c2->unit_address;
423		}
424		return c1->name < c2->name;
425	}
426	*/
427	public:
428	/**
429	 * Sorts the node's properties and children into alphabetical order and
430	 * recursively sorts the children.
431	 */
432	void sort();
433	/**
434	 * Iterator type for child nodes.
435	 */
436	typedef std::vector<node*>::iterator child_iterator;
437	/**
438	 * Returns an iterator for the first child of this node.
439	 */
440	inline child_iterator child_begin()
441	{
442		return children.begin();
443	}
444	/**
445	 * Returns an iterator after the last child of this node.
446	 */
447	inline child_iterator child_end()
448	{
449		return children.end();
450	}
451	/**
452	 * Iterator type for properties of a node.
453	 */
454	typedef std::vector<property*>::iterator property_iterator;
455	/**
456	 * Returns an iterator after the last property of this node.
457	 */
458	inline property_iterator property_begin()
459	{
460		return properties.begin();
461	}
462	/**
463	 * Returns an iterator for the first property of this node.
464	 */
465	inline property_iterator property_end()
466	{
467		return properties.end();
468	}
469	/**
470	 * Factory method for constructing a new node.  Attempts to parse a
471	 * node in DTS format from the input, and returns it on success.  On
472	 * any parse error, this will return 0.  This should be called with the
473	 * cursor on the open brace of the property, after the name and so on
474	 * have been parsed.
475	 */
476	static node* parse(input_buffer &input,
477	                   string name,
478	                   string label=string(),
479	                   string address=string());
480	/**
481	 * Factory method for constructing a new node.  Attempts to parse a
482	 * node in DTB format from the input, and returns it on success.  On
483	 * any parse error, this will return 0.  This should be called with the
484	 * cursor on the open brace of the property, after the name and so on
485	 * have been parsed.
486	 */
487	static node* parse_dtb(input_buffer &structs, input_buffer &strings);
488	/**
489	 * Destroys the node, recursively deleting all of its properties and
490	 * children.
491	 */
492	~node();
493	/**
494	 * Returns a property corresponding to the specified key, or 0 if this
495	 * node does not contain a property of that name.
496	 */
497	property *get_property(string key);
498	/**
499	 * Adds a new property to this node.
500	 */
501	inline void add_property(property *p)
502	{
503		properties.push_back(p);
504	}
505	/**
506	 * Merges a node into this one.  Any properties present in both are
507	 * overridden, any properties present in only one are preserved.
508	 */
509	void merge_node(node *other);
510	/**
511	 * Write this node to the specified output.  Although nodes do not
512	 * refer to a string table directly, their properties do.  The string
513	 * table passed as the second argument is used for the names of
514	 * properties within this node and its children.
515	 */
516	void write(dtb::output_writer &writer, dtb::string_table &strings);
517	/**
518	 * Writes the current node as DTS to the specified file.  The second
519	 * parameter is the indent level.  This function will start every line
520	 * with this number of tabs.
521	 */
522	void write_dts(FILE *file, int indent);
523};
524
525/**
526 * Class encapsulating the entire parsed FDT.  This is the top-level class,
527 * which parses the entire DTS representation and write out the finished
528 * version.
529 */
530class device_tree
531{
532	public:
533	/**
534	 * Type used for node paths.  A node path is sequence of names and unit
535	 * addresses.
536	 */
537	typedef std::vector<std::pair<string,string> > node_path;
538	/**
539	 * Name that we should use for phandle nodes.
540	 */
541	enum phandle_format
542	{
543		/** linux,phandle */
544		LINUX,
545		/** phandle */
546		EPAPR,
547		/** Create both nodes. */
548		BOTH
549	};
550	private:
551	/**
552	 * The format that we should use for writing phandles.
553	 */
554	phandle_format phandle_node_name;
555	/**
556	 * Flag indicating that this tree is valid.  This will be set to false
557	 * on parse errors.
558	 */
559	bool valid;
560	/**
561	 * Type used for memory reservations.  A reservation is two 64-bit
562	 * values indicating a base address and length in memory that the
563	 * kernel should not use.  The high 32 bits are ignored on 32-bit
564	 * platforms.
565	 */
566	typedef std::pair<uint64_t, uint64_t> reservation;
567	/**
568	 * The memory reserves table.
569	 */
570	std::vector<reservation> reservations;
571	/**
572	 * Root node.  All other nodes are children of this node.
573	 */
574	node *root;
575	/**
576	 * Mapping from names to nodes.  Only unambiguous names are recorded,
577	 * duplicate names are stored as (node*)-1.
578	 */
579	std::map<string, node*> node_names;
580	/**
581	 * A map from labels to node paths.  When resolving cross references,
582	 * we look up referenced nodes in this and replace the cross reference
583	 * with the full path to its target.
584	 */
585	std::map<string, node_path> node_paths;
586	/**
587	 * A collection of property values that are references to other nodes.
588	 * These should be expanded to the full path of their targets.
589	 */
590	std::vector<property_value*> cross_references;
591	/**
592	 * A collection of property values that refer to phandles.  These will
593	 * be replaced by the value of the phandle property in their
594	 * destination.
595	 */
596	std::vector<property_value*> phandles;
597	/**
598	 * A collection of input buffers that we are using.  These input
599	 * buffers are the ones that own their memory, and so we must preserve
600	 * them for the lifetime of the device tree.
601	 */
602	std::vector<input_buffer*> buffers;
603	/**
604	 * A map of used phandle values to nodes.  All phandles must be unique,
605	 * so we keep a set of ones that the user explicitly provides in the
606	 * input to ensure that we don't reuse them.
607	 *
608	 * This is a map, rather than a set, because we also want to be able to
609	 * find phandles that were provided by the user explicitly when we are
610	 * doing checking.
611	 */
612	std::map<uint32_t, node*> used_phandles;
613	/**
614	 * Paths to search for include files.  This contains a set of
615	 * nul-terminated strings, which are not owned by this class and so
616	 * must be freed separately.
617	 */
618	std::vector<const char*> include_paths;
619	/**
620	 * The default boot CPU, specified in the device tree header.
621	 */
622	uint32_t boot_cpu;
623	/**
624	 * The number of empty reserve map entries to generate in the blob.
625	 */
626	uint32_t spare_reserve_map_entries;
627	/**
628	 * The minimum size in bytes of the blob.
629	 */
630	uint32_t minimum_blob_size;
631	/**
632	 * The number of bytes of padding to add to the end of the blob.
633	 */
634	uint32_t blob_padding;
635	/**
636	 * Visit all of the nodes recursively, and if they have labels then add
637	 * them to the node_paths and node_names vectors so that they can be
638	 * used in resolving cross references.  Also collects phandle
639	 * properties that have been explicitly added.
640	 */
641	void collect_names_recursive(node* n, node_path &path);
642	/**
643	 * Calls the recursive version of this method on every root node.
644	 */
645	void collect_names();
646	/**
647	 * Resolves all cross references.  Any properties that refer to another
648	 * node must have their values replaced by either the node path or
649	 * phandle value.
650	 */
651	void resolve_cross_references();
652	/**
653	 * Parses root nodes from the top level of a dts file.
654	 */
655	void parse_roots(input_buffer &input, std::vector<node*> &roots);
656	/**
657	 * Allocates a new mmap()'d input buffer for use in parsing.  This
658	 * object then keeps a reference to it, ensuring that it is not
659	 * deallocated until the device tree is destroyed.
660	 */
661	input_buffer *buffer_for_file(const char *path);
662	/**
663	 * Template function that writes a dtb blob using the specified writer.
664	 * The writer defines the output format (assembly, blob).
665	 */
666	template<class writer>
667	void write(int fd);
668	public:
669	/**
670	 * Returns the node referenced by the property.  If this is a tree that
671	 * is in source form, then we have a string that we can use to index
672	 * the cross_references array and so we can just look that up.
673	 */
674	node *referenced_node(property_value &v);
675	/**
676	 * Writes this FDT as a DTB to the specified output.
677	 */
678	void write_binary(int fd);
679	/**
680	 * Writes this FDT as an assembly representation of the DTB to the
681	 * specified output.  The result can then be assembled and linked into
682	 * a program.
683	 */
684	void write_asm(int fd);
685	/**
686	 * Writes the tree in DTS (source) format.
687	 */
688	void write_dts(int fd);
689	/**
690	 * Default constructor.  Creates a valid, but empty FDT.
691	 */
692	device_tree() : phandle_node_name(EPAPR), valid(true), root(0),
693		boot_cpu(0), spare_reserve_map_entries(0),
694		minimum_blob_size(0), blob_padding(0) {}
695	/**
696	 * Constructs a device tree from the specified file name, referring to
697	 * a file that contains a device tree blob.
698	 */
699	void parse_dtb(const char *fn, FILE *depfile);
700	/**
701	 * Constructs a device tree from the specified file name, referring to
702	 * a file that contains device tree source.
703	 */
704	void parse_dts(const char *fn, FILE *depfile);
705	/**
706	 * Destroy the tree and any input buffers that it holds.
707	 */
708	~device_tree();
709	/**
710	 * Returns whether this tree is valid.
711	 */
712	inline bool is_valid()
713	{
714		return valid;
715	}
716	/**
717	 * Sets the format for writing phandle properties.
718	 */
719	inline void set_phandle_format(phandle_format f)
720	{
721		phandle_node_name = f;
722	}
723	/**
724	 * Returns a pointer to the root node of this tree.  No ownership
725	 * transfer.
726	 */
727	inline node *get_root() const
728	{
729		return root;
730	}
731	/**
732	 * Sets the physical boot CPU.
733	 */
734	void set_boot_cpu(uint32_t cpu)
735	{
736		boot_cpu = cpu;
737	}
738	/**
739	 * Sorts the tree.  Useful for debugging device trees.
740	 */
741	void sort()
742	{
743		root->sort();
744	}
745	/**
746	 * Adds a path to search for include files.  The argument must be a
747	 * nul-terminated string representing the path.  The device tree keeps
748	 * a pointer to this string, but does not own it: the caller is
749	 * responsible for freeing it if required.
750	 */
751	void add_include_path(const char *path)
752	{
753		include_paths.push_back(path);
754	}
755	/**
756	 * Sets the number of empty reserve map entries to add.
757	 */
758	void set_empty_reserve_map_entries(uint32_t e)
759	{
760		spare_reserve_map_entries = e;
761	}
762	/**
763	 * Sets the minimum size, in bytes, of the blob.
764	 */
765	void set_blob_minimum_size(uint32_t s)
766	{
767		minimum_blob_size = s;
768	}
769	/**
770	 * Sets the amount of padding to add to the blob.
771	 */
772	void set_blob_padding(uint32_t p)
773	{
774		blob_padding = p;
775	}
776};
777
778} // namespace fdt
779
780} // namespace dtc
781
782#endif // !_FDT_HH_
783