1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2022-08-25     GuEe-GUI     first version
9  */
10 
11 #ifndef __OFW_RAW_H__
12 #define __OFW_RAW_H__
13 
14 #include <libfdt/libfdt.h>
15 
16 #define FDT_SIZE_KB 1024
17 #define FDT_SIZE_MB (1024 * FDT_SIZE_KB)
18 
19 #define FDT_SIZE_MAX        (2 * FDT_SIZE_MB)
20 #define FDT_PADDING_SIZE    (1 * FDT_SIZE_KB)
21 
22 typedef uint8_t fdt8_t;
23 
fdt8_to_cpu(fdt8_t x)24 static inline uint8_t fdt8_to_cpu(fdt8_t x)
25 {
26     return (uint8_t)x;
27 }
28 
29 int fdt_add_subnode_possible(void *fdt, int parentoffset, const char *name);
30 int fdt_add_mem_rsv_possible(void *fdt, size_t addr, size_t size);
31 
32 #define fdt_setprop_cstring(fdt, nodeoffset, name, str) \
33     fdt_setprop((fdt), (nodeoffset), (name), (str), sizeof(str))
34 
35 #define fdt_prop_cells_ops(ops, fdt, nodeoffset, prop, ...) \
36 ({                                                          \
37     int ret = 0;                                            \
38     uint32_t tmp[] = { __VA_ARGS__ };                       \
39     for (int i = 0; i < sizeof(tmp) / sizeof(tmp[0]); ++i)  \
40     {                                                       \
41         tmp[i] = cpu_to_fdt32(tmp[i]);                      \
42     }                                                       \
43     ret += ops(fdt, nodeoffset, prop, tmp, sizeof(tmp));    \
44     ret;                                                    \
45 })
46 
47 #define fdt_setprop_cells(fdt, nodeoffset, prop, ...)   \
48     fdt_prop_cells_ops(fdt_setprop, fdt, nodeoffset, prop, __VA_ARGS__)
49 
50 #define fdt_appendprop_cells(fdt, nodeoffset, prop, ...)    \
51     fdt_prop_cells_ops(fdt_appendprop, fdt, nodeoffset, prop, __VA_ARGS__)
52 
53 int fdt_setprop_uxx(void *fdt, int nodeoffset, const char *name, uint64_t val, bool is_u64);
54 int fdt_getprop_u8(void *fdt, int nodeoffset, const char *name, uint8_t *out_value, int *lenp);
55 int fdt_getprop_s8(void *fdt, int nodeoffset, const char *name, int8_t *out_value, int *lenp);
56 int fdt_getprop_u16(void *fdt, int nodeoffset, const char *name, uint16_t *out_value, int *lenp);
57 int fdt_getprop_s16(void *fdt, int nodeoffset, const char *name, int16_t *out_value, int *lenp);
58 int fdt_getprop_u32(void *fdt, int nodeoffset, const char *name, uint32_t *out_value, int *lenp);
59 int fdt_getprop_s32(void *fdt, int nodeoffset, const char *name, int32_t *out_value, int *lenp);
60 
61 int fdt_io_addr_cells(void *fdt, int nodeoffset);
62 int fdt_io_size_cells(void *fdt, int nodeoffset);
63 
64 int fdt_install_initrd(void *fdt, char *os_name, size_t initrd_addr, size_t initrd_size);
65 
66 #endif /* __OFW_RAW_H__ */
67