]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/dtc/fdt.hh
Upgrade to OpenPAM Radula.
[FreeBSD/FreeBSD.git] / usr.bin / dtc / fdt.hh
1 /*-
2  * Copyright (c) 2013 David Chisnall
3  * All rights reserved.
4  *
5  * This software was developed by SRI International and the University of
6  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
7  * ("CTSRD"), as part of the DARPA CRASH research programme.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * $FreeBSD$
31  */
32
33 #ifndef _FDT_HH_
34 #define _FDT_HH_
35 #include <unordered_map>
36 #include <unordered_set>
37 #include <memory>
38 #include <string>
39 #include <functional>
40
41 #include "util.hh"
42 #include "input_buffer.hh"
43
44 namespace dtc
45 {
46
47 namespace dtb 
48 {
49 struct output_writer;
50 class string_table;
51 }
52
53 namespace fdt
54 {
55 class property;
56 class node;
57 /**
58  * Type for (owned) pointers to properties.
59  */
60 typedef std::shared_ptr<property> property_ptr;
61 /**
62  * Owning pointer to a node.
63  */
64 typedef std::unique_ptr<node> node_ptr;
65 /**
66  * Map from macros to property pointers.
67  */
68 typedef std::unordered_map<std::string, property_ptr> define_map;
69 /**
70  * Set of strings used for label names.
71  */
72 typedef std::unordered_set<std::string> string_set;
73 /**
74  * Properties may contain a number of different value, each with a different
75  * label.  This class encapsulates a single value.
76  */
77 struct property_value
78 {
79         /**
80          * The label for this data.  This is usually empty.
81          */
82         std::string label;
83         /**
84          * If this value is a string, or something resolved from a string (a
85          * reference) then this contains the source string.
86          */
87         std::string string_data;
88         /**
89          * The data that should be written to the final output.
90          */
91         byte_buffer byte_data;
92         /**
93          * Enumeration describing the possible types of a value.  Note that
94          * property-coded arrays will appear simply as binary (or possibly
95          * string, if they happen to be nul-terminated and printable), and must
96          * be checked separately.
97          */
98         enum value_type
99         {
100                 /**
101                  * This is a list of strings.  When read from source, string
102                  * lists become one property value for each string, however
103                  * when read from binary we have a single property value
104                  * incorporating the entire text, with nul bytes separating the
105                  * strings.
106                  */
107                 STRING_LIST,
108                 /**
109                  * This property contains a single string.
110                  */
111                 STRING,
112                 /**
113                  * This is a binary value.  Check the size of byte_data to
114                  * determine how many bytes this contains.
115                  */
116                 BINARY,
117                 /** This contains a short-form address that should be replaced
118                  * by a fully-qualified version.  This will only appear when
119                  * the input is a device tree source.  When parsed from a
120                  * device tree blob, the cross reference will have already been
121                  * resolved and the property value will be a string containing
122                  * the full path of the target node.  */
123                 CROSS_REFERENCE,
124                 /**
125                  * This is a phandle reference.  When parsed from source, the
126                  * string_data will contain the node label for the target and,
127                  * after cross references have been resolved, the binary data
128                  * will contain a 32-bit integer that should match the phandle
129                  * property of the target node.
130                  */
131                 PHANDLE,
132                 /**
133                  * An empty property value.  This will never appear on a real
134                  * property value, it is used by checkers to indicate that no
135                  * property values should exist for a property.
136                  */
137                 EMPTY,
138                 /**
139                  * The type of this property has not yet been determined.
140                  */
141                 UNKNOWN
142         };
143         /**
144          * The type of this property.
145          */
146         value_type type;
147         /**
148          * Returns true if this value is a cross reference, false otherwise.
149          */
150         inline bool is_cross_reference()
151         {
152                 return is_type(CROSS_REFERENCE);
153         }
154         /**
155          * Returns true if this value is a phandle reference, false otherwise.
156          */
157         inline bool is_phandle()
158         {
159                 return is_type(PHANDLE);
160         }
161         /**
162          * Returns true if this value is a string, false otherwise.
163          */
164         inline bool is_string()
165         {
166                 return is_type(STRING);
167         }
168         /**
169          * Returns true if this value is a string list (a nul-separated
170          * sequence of strings), false otherwise.
171          */
172         inline bool is_string_list()
173         {
174                 return is_type(STRING_LIST);
175         }
176         /**
177          * Returns true if this value is binary, false otherwise.
178          */
179         inline bool is_binary()
180         {
181                 return is_type(BINARY);
182         }
183         /**
184          * Returns this property value as a 32-bit integer.  Returns 0 if this
185          * property value is not 32 bits long.  The bytes in the property value
186          * are assumed to be in big-endian format, but the return value is in
187          * the host native endian.
188          */
189         uint32_t get_as_uint32();
190         /**
191          * Default constructor, specifying the label of the value.
192          */
193         property_value(std::string l=std::string()) : label(l), type(UNKNOWN) {}
194         /**
195          * Writes the data for this value into an output buffer.
196          */
197         void push_to_buffer(byte_buffer &buffer);
198
199         /**
200          * Writes the property value to the standard output.  This uses the
201          * following heuristics for deciding how to print the output:
202          *
203          * - If the value is nul-terminated and only contains printable
204          *   characters, it is written as a string.
205          * - If it is a multiple of 4 bytes long, then it is printed as cells.
206          * - Otherwise, it is printed as a byte buffer.
207          */
208         void write_dts(FILE *file);
209         /**
210          * Tries to merge adjacent property values, returns true if it succeeds and
211          * false otherwise.
212          */
213         bool try_to_merge(property_value &other);
214         private:
215         /**
216          * Returns whether the value is of the specified type.  If the type of
217          * the value has not yet been determined, then this calculates it.
218          */
219         inline bool is_type(value_type v)
220         {
221                 if (type == UNKNOWN)
222                 {
223                         resolve_type();
224                 }
225                 return type == v;
226         }
227         /**
228          * Determines the type of the value based on its contents.
229          */
230         void resolve_type();
231         /**
232          * Writes the property value to the specified file as a quoted string.
233          * This is used when generating DTS.
234          */
235         void write_as_string(FILE *file);
236         /**
237          * Writes the property value to the specified file as a sequence of
238          * 32-bit big-endian cells.  This is used when generating DTS.
239          */
240         void write_as_cells(FILE *file);
241         /**
242          * Writes the property value to the specified file as a sequence of
243          * bytes.  This is used when generating DTS.
244          */
245         void write_as_bytes(FILE *file);
246 };
247
248 /**
249  * A value encapsulating a single property.  This contains a key, optionally a
250  * label, and optionally one or more values.
251  */
252 class property
253 {
254         /**
255          * The name of this property.
256          */
257         std::string key;
258         /**
259          * Zero or more labels.
260          */
261         string_set labels;
262         /**
263          * The values in this property.
264          */
265         std::vector<property_value> values;
266         /**
267          * Value indicating that this is a valid property.  If a parse error
268          * occurs, then this value is false.
269          */
270         bool valid;
271         /**
272          * Parses a string property value, i.e. a value enclosed in double quotes.
273          */
274         void parse_string(text_input_buffer &input);
275         /**
276          * Parses one or more 32-bit values enclosed in angle brackets.
277          */
278         void parse_cells(text_input_buffer &input, int cell_size);
279         /**
280          * Parses an array of bytes, contained within square brackets.
281          */
282         void parse_bytes(text_input_buffer &input);
283         /**
284          * Parses a reference.  This is a node label preceded by an ampersand
285          * symbol, which should expand to the full path to that node.
286          *
287          * Note: The specification says that the target of such a reference is
288          * a node name, however dtc assumes that it is a label, and so we
289          * follow their interpretation for compatibility.
290          */
291         void parse_reference(text_input_buffer &input);
292         /**
293          * Parse a predefined macro definition for a property.
294          */
295         void parse_define(text_input_buffer &input, define_map *defines);
296         /**
297          * Constructs a new property from two input buffers, pointing to the
298          * struct and strings tables in the device tree blob, respectively.
299          * The structs input buffer is assumed to have just consumed the
300          * FDT_PROP token.
301          */
302         property(input_buffer &structs, input_buffer &strings);
303         /**
304          * Parses a new property from the input buffer.  
305          */
306         property(text_input_buffer &input,
307                  std::string &&k,
308                  string_set &&l,
309                  bool terminated,
310                  define_map *defines);
311         public:
312         /**
313          * Creates an empty property.
314          */
315         property(std::string &&k, string_set &&l=string_set())
316                 : key(k), labels(l), valid(true) {}
317         /**
318          * Copy constructor.
319          */
320         property(property &p) : key(p.key), labels(p.labels), values(p.values),
321                 valid(p.valid) {}
322         /**
323          * Factory method for constructing a new property.  Attempts to parse a
324          * property from the input, and returns it on success.  On any parse
325          * error, this will return 0.
326          */
327         static property_ptr parse_dtb(input_buffer &structs,
328                                       input_buffer &strings);
329         /**
330          * Factory method for constructing a new property.  Attempts to parse a
331          * property from the input, and returns it on success.  On any parse
332          * error, this will return 0.
333          */
334         static property_ptr parse(text_input_buffer &input,
335                                   std::string &&key,
336                                   string_set &&labels=string_set(),
337                                   bool semicolonTerminated=true,
338                                   define_map *defines=0);
339         /**
340          * Iterator type used for accessing the values of a property.
341          */
342         typedef std::vector<property_value>::iterator value_iterator;
343         /**
344          * Returns an iterator referring to the first value in this property.
345          */
346         inline value_iterator begin()
347         {
348                 return values.begin();
349         }
350         /**
351          * Returns an iterator referring to the last value in this property.
352          */
353         inline value_iterator end()
354         {
355                 return values.end();
356         }
357         /**
358          * Adds a new value to an existing property.
359          */
360         inline void add_value(property_value v)
361         {
362                 values.push_back(v);
363         }
364         /**
365          * Returns the key for this property.
366          */
367         inline std::string get_key()
368         {
369                 return key;
370         }
371         /**
372          * Writes the property to the specified writer.  The property name is a
373          * reference into the strings table.
374          */
375         void write(dtb::output_writer &writer, dtb::string_table &strings);
376         /**
377          * Writes in DTS format to the specified file, at the given indent
378          * level.  This will begin the line with the number of tabs specified
379          * as the indent level and then write the property in the most
380          * applicable way that it can determine.
381          */
382         void write_dts(FILE *file, int indent);
383 };
384
385 /**
386  * Class encapsulating a device tree node.  Nodes may contain properties and
387  * other nodes.
388  */
389 class node
390 {
391         public:
392         /**
393          * The labels for this node, if any.  Node labels are used as the
394          * targets for cross references.
395          */
396         std::unordered_set<std::string> labels;
397         /**
398          * The name of the node.
399          */
400         std::string name;
401         /**
402          * The unit address of the node, which is optionally written after the
403          * name followed by an at symbol.
404          */
405         std::string unit_address;
406         /**
407          * The type for the property vector.
408          */
409         typedef std::vector<property_ptr> property_vector;
410         /**
411          * Iterator type for child nodes.
412          */
413         typedef std::vector<node_ptr>::iterator child_iterator;
414         private:
415         /**
416          * Adaptor to use children in range-based for loops.
417          */
418         struct child_range
419         {
420                 child_range(node &nd) : n(nd) {}
421                 child_iterator begin() { return n.child_begin(); }
422                 child_iterator end() { return n.child_end(); }
423                 private:
424                 node &n;
425         };
426         /**
427          * Adaptor to use properties in range-based for loops.
428          */
429         struct property_range
430         {
431                 property_range(node &nd) : n(nd) {}
432                 property_vector::iterator begin() { return n.property_begin(); }
433                 property_vector::iterator end() { return n.property_end(); }
434                 private:
435                 node &n;
436         };
437         /**
438          * The properties contained within this node.
439          */
440         property_vector props;
441         /**
442          * The children of this node.
443          */
444         std::vector<node_ptr> children;
445         /**
446          * Children that should be deleted from this node when merging.
447          */
448         std::unordered_set<std::string> deleted_children;
449         /**
450          * Properties that should be deleted from this node when merging.
451          */
452         std::unordered_set<std::string> deleted_props;
453         /**
454          * A flag indicating whether this node is valid.  This is set to false
455          * if an error occurs during parsing.
456          */
457         bool valid;
458         /**
459          * Parses a name inside a node, writing the string passed as the last
460          * argument as an error if it fails.  
461          */
462         std::string parse_name(text_input_buffer &input,
463                                bool &is_property,
464                                const char *error);
465         /**
466          * Constructs a new node from two input buffers, pointing to the struct
467          * and strings tables in the device tree blob, respectively.
468          */
469         node(input_buffer &structs, input_buffer &strings);
470         /**
471          * Parses a new node from the specified input buffer.  This is called
472          * when the input cursor is on the open brace for the start of the
473          * node.  The name, and optionally label and unit address, should have
474          * already been parsed.
475          */
476         node(text_input_buffer &input,
477              std::string &&n,
478              std::unordered_set<std::string> &&l,
479              std::string &&a,
480              define_map*);
481         /**
482          * Comparison function for properties, used when sorting the properties
483          * vector.  Orders the properties based on their names.
484          */
485         static inline bool cmp_properties(property_ptr &p1, property_ptr &p2);
486                 /*
487         {
488                 return p1->get_key() < p2->get_key();
489         }
490         */
491         /**
492          * Comparison function for nodes, used when sorting the children
493          * vector.  Orders the nodes based on their names or, if the names are
494          * the same, by the unit addresses.
495          */
496         static inline bool cmp_children(node_ptr &c1, node_ptr &c2);
497         public:
498         /**
499          * Sorts the node's properties and children into alphabetical order and
500          * recursively sorts the children.
501          */
502         void sort();
503         /**
504          * Returns an iterator for the first child of this node.
505          */
506         inline child_iterator child_begin()
507         {
508                 return children.begin();
509         }
510         /**
511          * Returns an iterator after the last child of this node.
512          */
513         inline child_iterator child_end()
514         {
515                 return children.end();
516         }
517         /**
518          * Returns a range suitable for use in a range-based for loop describing
519          * the children of this node.
520          */
521         inline child_range child_nodes()
522         {
523                 return child_range(*this);
524         }
525         /**
526          * Accessor for the deleted children.
527          */
528         inline const std::unordered_set<std::string> &deleted_child_nodes()
529         {
530                 return deleted_children;
531         }
532         /**
533          * Accessor for the deleted properties
534          */
535         inline const std::unordered_set<std::string> &deleted_properties()
536         {
537                 return deleted_props;
538         }
539         /**
540          * Returns a range suitable for use in a range-based for loop describing
541          * the properties of this node.
542          */
543         inline property_range properties()
544         {
545                 return property_range(*this);
546         }
547         /**
548          * Returns an iterator after the last property of this node.
549          */
550         inline property_vector::iterator property_begin()
551         {
552                 return props.begin();
553         }
554         /**
555          * Returns an iterator for the first property of this node.
556          */
557         inline property_vector::iterator property_end()
558         {
559                 return props.end();
560         }
561         /**
562          * Factory method for constructing a new node.  Attempts to parse a
563          * node in DTS format from the input, and returns it on success.  On
564          * any parse error, this will return 0.  This should be called with the
565          * cursor on the open brace of the property, after the name and so on
566          * have been parsed.
567          */
568         static node_ptr parse(text_input_buffer &input,
569                               std::string &&name,
570                               std::unordered_set<std::string> &&label=std::unordered_set<std::string>(),
571                               std::string &&address=std::string(),
572                               define_map *defines=0);
573         /**
574          * Factory method for constructing a new node.  Attempts to parse a
575          * node in DTB format from the input, and returns it on success.  On
576          * any parse error, this will return 0.  This should be called with the
577          * cursor on the open brace of the property, after the name and so on
578          * have been parsed.
579          */
580         static node_ptr parse_dtb(input_buffer &structs, input_buffer &strings);
581         /**
582          * Returns a property corresponding to the specified key, or 0 if this
583          * node does not contain a property of that name.
584          */
585         property_ptr get_property(const std::string &key);
586         /**
587          * Adds a new property to this node.
588          */
589         inline void add_property(property_ptr &p)
590         {
591                 props.push_back(p);
592         }
593         /**
594          * Merges a node into this one.  Any properties present in both are
595          * overridden, any properties present in only one are preserved.
596          */
597         void merge_node(node_ptr other);
598         /**
599          * Write this node to the specified output.  Although nodes do not
600          * refer to a string table directly, their properties do.  The string
601          * table passed as the second argument is used for the names of
602          * properties within this node and its children.
603          */
604         void write(dtb::output_writer &writer, dtb::string_table &strings);
605         /**
606          * Writes the current node as DTS to the specified file.  The second
607          * parameter is the indent level.  This function will start every line
608          * with this number of tabs.  
609          */
610         void write_dts(FILE *file, int indent);
611         /**
612          * Recursively visit this node and then its children.
613          */
614         void visit(std::function<void(node&)>);
615 };
616
617 /**
618  * Class encapsulating the entire parsed FDT.  This is the top-level class,
619  * which parses the entire DTS representation and write out the finished
620  * version.
621  */
622 class device_tree
623 {
624         public:
625         /**
626          * Type used for node paths.  A node path is sequence of names and unit
627          * addresses.
628          */
629         typedef std::vector<std::pair<std::string,std::string> > node_path;
630         /**
631          * Name that we should use for phandle nodes.
632          */
633         enum phandle_format
634         {
635                 /** linux,phandle */
636                 LINUX,
637                 /** phandle */
638                 EPAPR,
639                 /** Create both nodes. */
640                 BOTH
641         };
642         private:
643         /**
644          * The format that we should use for writing phandles.
645          */
646         phandle_format phandle_node_name;
647         /**
648          * Flag indicating that this tree is valid.  This will be set to false
649          * on parse errors. 
650          */
651         bool valid;
652         /**
653          * Type used for memory reservations.  A reservation is two 64-bit
654          * values indicating a base address and length in memory that the
655          * kernel should not use.  The high 32 bits are ignored on 32-bit
656          * platforms.
657          */
658         typedef std::pair<uint64_t, uint64_t> reservation;
659         /**
660          * The memory reserves table.
661          */
662         std::vector<reservation> reservations;
663         /**
664          * Root node.  All other nodes are children of this node.
665          */
666         node_ptr root;
667         /**
668          * Mapping from names to nodes.  Only unambiguous names are recorded,
669          * duplicate names are stored as (node*)-1.
670          */
671         std::unordered_map<std::string, node*> node_names;
672         /**
673          * A map from labels to node paths.  When resolving cross references,
674          * we look up referenced nodes in this and replace the cross reference
675          * with the full path to its target.
676          */
677         std::unordered_map<std::string, node_path> node_paths;
678         /**
679          * A collection of property values that are references to other nodes.
680          * These should be expanded to the full path of their targets.
681          */
682         std::vector<property_value*> cross_references;
683         /**
684          * A collection of property values that refer to phandles.  These will
685          * be replaced by the value of the phandle property in their
686          * destination.
687          */
688         std::vector<property_value*> phandles;
689         /**
690          * The names of nodes that target phandles.
691          */
692         std::unordered_set<std::string> phandle_targets;
693         /**
694          * A collection of input buffers that we are using.  These input
695          * buffers are the ones that own their memory, and so we must preserve
696          * them for the lifetime of the device tree.  
697          */
698         std::vector<std::unique_ptr<input_buffer>> buffers;
699         /**
700          * A map of used phandle values to nodes.  All phandles must be unique,
701          * so we keep a set of ones that the user explicitly provides in the
702          * input to ensure that we don't reuse them.
703          *
704          * This is a map, rather than a set, because we also want to be able to
705          * find phandles that were provided by the user explicitly when we are
706          * doing checking.
707          */
708         std::unordered_map<uint32_t, node*> used_phandles;
709         /**
710          * Paths to search for include files.  This contains a set of
711          * nul-terminated strings, which are not owned by this class and so
712          * must be freed separately.
713          */
714         std::vector<std::string> include_paths;
715         /**
716          * Dictionary of predefined macros provided on the command line.
717          */
718         define_map               defines;
719         /**
720          * The default boot CPU, specified in the device tree header.
721          */
722         uint32_t boot_cpu;
723         /**
724          * The number of empty reserve map entries to generate in the blob.
725          */
726         uint32_t spare_reserve_map_entries;
727         /**
728          * The minimum size in bytes of the blob.
729          */
730         uint32_t minimum_blob_size;
731         /**
732          * The number of bytes of padding to add to the end of the blob.
733          */
734         uint32_t blob_padding;
735         /**
736          * Visit all of the nodes recursively, and if they have labels then add
737          * them to the node_paths and node_names vectors so that they can be
738          * used in resolving cross references.  Also collects phandle
739          * properties that have been explicitly added.  
740          */
741         void collect_names_recursive(node_ptr &n, node_path &path);
742         /**
743          * Assign phandle properties to all nodes that have been referenced and
744          * require one.  This method will recursively visit the tree starting at
745          * the node that it is passed.
746          */
747         void assign_phandles(node_ptr &n, uint32_t &next);
748         /**
749          * Calls the recursive version of this method on every root node.
750          */
751         void collect_names();
752         /**
753          * Resolves all cross references.  Any properties that refer to another
754          * node must have their values replaced by either the node path or
755          * phandle value.
756          */
757         void resolve_cross_references();
758         /**
759          * Parses a dts file in the given buffer and adds the roots to the parsed
760          * set.  The `read_header` argument indicates whether the header has
761          * already been read.  Some dts files place the header in an include,
762          * rather than in the top-level file.
763          */
764         void parse_file(text_input_buffer &input,
765                         std::vector<node_ptr> &roots,
766                         bool &read_header);
767         /**
768          * Template function that writes a dtb blob using the specified writer.
769          * The writer defines the output format (assembly, blob).
770          */
771         template<class writer>
772         void write(int fd);
773         public:
774         /**
775          * Returns the node referenced by the property.  If this is a tree that
776          * is in source form, then we have a string that we can use to index
777          * the cross_references array and so we can just look that up.  
778          */
779         node *referenced_node(property_value &v);
780         /**
781          * Writes this FDT as a DTB to the specified output.
782          */
783         void write_binary(int fd);
784         /**
785          * Writes this FDT as an assembly representation of the DTB to the
786          * specified output.  The result can then be assembled and linked into
787          * a program.
788          */
789         void write_asm(int fd);
790         /**
791          * Writes the tree in DTS (source) format.
792          */
793         void write_dts(int fd);
794         /**
795          * Default constructor.  Creates a valid, but empty FDT.
796          */
797         device_tree() : phandle_node_name(EPAPR), valid(true),
798                 boot_cpu(0), spare_reserve_map_entries(0),
799                 minimum_blob_size(0), blob_padding(0) {}
800         /**
801          * Constructs a device tree from the specified file name, referring to
802          * a file that contains a device tree blob.
803          */
804         void parse_dtb(const std::string &fn, FILE *depfile);
805         /**
806          * Constructs a device tree from the specified file name, referring to
807          * a file that contains device tree source.
808          */
809         void parse_dts(const std::string &fn, FILE *depfile);
810         /**
811          * Returns whether this tree is valid.
812          */
813         inline bool is_valid()
814         {
815                 return valid;
816         }
817         /**
818          * Sets the format for writing phandle properties.
819          */
820         inline void set_phandle_format(phandle_format f)
821         {
822                 phandle_node_name = f;
823         }
824         /**
825          * Returns a pointer to the root node of this tree.  No ownership
826          * transfer.
827          */
828         inline const node_ptr &get_root() const
829         {
830                 return root;
831         }
832         /**
833          * Sets the physical boot CPU.
834          */
835         void set_boot_cpu(uint32_t cpu)
836         {
837                 boot_cpu = cpu;
838         }
839         /**
840          * Sorts the tree.  Useful for debugging device trees.
841          */
842         void sort()
843         {
844                 root->sort();
845         }
846         /**
847          * Adds a path to search for include files.  The argument must be a
848          * nul-terminated string representing the path.  The device tree keeps
849          * a pointer to this string, but does not own it: the caller is
850          * responsible for freeing it if required.
851          */
852         void add_include_path(const char *path)
853         {
854                 std::string p(path);
855                 include_paths.push_back(std::move(p));
856         }
857         /**
858          * Sets the number of empty reserve map entries to add.
859          */
860         void set_empty_reserve_map_entries(uint32_t e)
861         {
862                 spare_reserve_map_entries = e;
863         }
864         /**
865          * Sets the minimum size, in bytes, of the blob.
866          */
867         void set_blob_minimum_size(uint32_t s)
868         {
869                 minimum_blob_size = s;
870         }
871         /**
872          * Sets the amount of padding to add to the blob.
873          */
874         void set_blob_padding(uint32_t p)
875         {
876                 blob_padding = p;
877         }
878         /**
879          * Parses a predefined macro value.
880          */
881         bool parse_define(const char *def);
882 };
883
884 } // namespace fdt
885
886 } // namespace dtc
887
888 #endif // !_FDT_HH_