1// See LICENSE for license details.
2
3#ifndef FDT_H
4#define FDT_H
5
6#define FDT_MAGIC	0xd00dfeed
7#define FDT_VERSION	17
8
9struct fdt_header {
10  uint32_t magic;
11  uint32_t totalsize;
12  uint32_t off_dt_struct;
13  uint32_t off_dt_strings;
14  uint32_t off_mem_rsvmap;
15  uint32_t version;
16  uint32_t last_comp_version; /* <= 17 */
17  uint32_t boot_cpuid_phys;
18  uint32_t size_dt_strings;
19  uint32_t size_dt_struct;
20};
21
22#define FDT_BEGIN_NODE	1
23#define FDT_END_NODE	2
24#define FDT_PROP	3
25#define FDT_NOP		4
26#define FDT_END		9
27
28struct fdt_scan_node {
29  const struct fdt_scan_node *parent;
30  const char *name;
31  int address_cells;
32  int size_cells;
33};
34
35struct fdt_scan_prop {
36  const struct fdt_scan_node *node;
37  const char *name;
38  uint32_t *value;
39  int len; // in bytes of value
40};
41
42struct fdt_cb {
43  void (*open)(const struct fdt_scan_node *node, void *extra);
44  void (*prop)(const struct fdt_scan_prop *prop, void *extra);
45  void (*done)(const struct fdt_scan_node *node, void *extra); // last property was seen
46  int  (*close)(const struct fdt_scan_node *node, void *extra); // -1 => delete the node + children
47  void *extra;
48};
49
50// Scan the contents of FDT
51void fdt_scan(uintptr_t fdt, const struct fdt_cb *cb);
52uint32_t fdt_size(uintptr_t fdt);
53
54// Extract fields
55const uint32_t *fdt_get_address(const struct fdt_scan_node *node, const uint32_t *base, uint64_t *value);
56const uint32_t *fdt_get_size(const struct fdt_scan_node *node, const uint32_t *base, uint64_t *value);
57int fdt_string_list_index(const struct fdt_scan_prop *prop, const char *str); // -1 if not found
58const uint32_t *fdt_get_value(const uint32_t *value, uint32_t *result);
59
60// Setup memory+clint+plic
61void query_mem(uintptr_t fdt);
62void query_harts(uintptr_t fdt);
63void query_plic(uintptr_t fdt);
64void query_clint(uintptr_t fdt);
65void query_chosen(uintptr_t fdt);
66
67// Remove information from FDT
68void filter_harts(uintptr_t fdt, long *disabled_hart_mask);
69void filter_plic(uintptr_t fdt);
70void filter_compat(uintptr_t fdt, const char *compat);
71
72// The hartids of available harts
73extern uint64_t hart_mask;
74
75// Optional FDT preloaded external payload
76extern void* kernel_start;
77extern void* kernel_end;
78
79#ifdef PK_PRINT_DEVICE_TREE
80// Prints the device tree to the console as a DTS
81void fdt_print(uintptr_t fdt);
82#endif
83
84#endif
85