[fdt] Add ability to parse a MAC address from a flattened device tree
[ipxe.git] / src / include / ipxe / fdt.h
1 #ifndef _IPXE_FDT_H
2 #define _IPXE_FDT_H
3
4 /** @file
5 *
6 * Flattened Device Tree
7 *
8 */
9
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
12 #include <stdint.h>
13
14 struct net_device;
15
16 /** Device tree header */
17 struct fdt_header {
18 /** Magic signature */
19 uint32_t magic;
20 /** Total size of device tree */
21 uint32_t totalsize;
22 /** Offset to structure block */
23 uint32_t off_dt_struct;
24 /** Offset to strings block */
25 uint32_t off_dt_strings;
26 /** Offset to memory reservation block */
27 uint32_t off_mem_rsvmap;
28 /** Version of this data structure */
29 uint32_t version;
30 /** Lowest version to which this structure is compatible */
31 uint32_t last_comp_version;
32 /** Physical ID of the boot CPU */
33 uint32_t boot_cpuid_phys;
34 /** Length of string block */
35 uint32_t size_dt_strings;
36 /** Length of structure block */
37 uint32_t size_dt_struct;
38 } __attribute__ (( packed ));
39
40 /** Magic signature */
41 #define FDT_MAGIC 0xd00dfeed
42
43 /** Expected device tree version */
44 #define FDT_VERSION 16
45
46 /** Device tree token */
47 typedef uint32_t fdt_token_t;
48
49 /** Begin node token */
50 #define FDT_BEGIN_NODE 0x00000001
51
52 /** End node token */
53 #define FDT_END_NODE 0x00000002
54
55 /** Property token */
56 #define FDT_PROP 0x00000003
57
58 /** Property fragment */
59 struct fdt_prop {
60 /** Data length */
61 uint32_t len;
62 /** Name offset */
63 uint32_t name_off;
64 } __attribute__ (( packed ));
65
66 /** NOP token */
67 #define FDT_NOP 0x00000004
68
69 /** End of structure block */
70 #define FDT_END 0x00000009
71
72 /** Alignment of structure block */
73 #define FDT_STRUCTURE_ALIGN ( sizeof ( fdt_token_t ) )
74
75 /** A device tree */
76 struct fdt {
77 /** Tree data */
78 union {
79 /** Tree header */
80 const struct fdt_header *hdr;
81 /** Raw data */
82 const void *raw;
83 };
84 /** Length of tree */
85 size_t len;
86 /** Offset to structure block */
87 unsigned int structure;
88 /** Length of structure block */
89 size_t structure_len;
90 /** Offset to strings block */
91 unsigned int strings;
92 /** Length of strings block */
93 size_t strings_len;
94 };
95
96 extern int fdt_path ( const char *path, unsigned int *offset );
97 extern int fdt_alias ( const char *name, unsigned int *offset );
98 extern const char * fdt_string ( unsigned int offset, const char *name );
99 extern int fdt_mac ( unsigned int offset, struct net_device *netdev );
100 extern int register_fdt ( const struct fdt_header *hdr );
101
102 #endif /* _IPXE_FDT_H */