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_FDT_H__ 12 #define __OFW_FDT_H__ 13 14 #include <mm_page.h> 15 #include <drivers/ofw.h> 16 17 struct rt_fdt_earlycon 18 { 19 union { rt_ubase_t mmio, port; }; 20 union { rt_ubase_t size, width; }; 21 22 void *fdt; 23 char options[32]; 24 long nodeoffset; 25 26 void *data; 27 void (*console_putc)(void *data, char c); 28 29 #define FDT_EARLYCON_KICK_UPDATE 0 30 #define FDT_EARLYCON_KICK_COMPLETED 1 31 void (*console_kick)(struct rt_fdt_earlycon *earlycon, int why); 32 33 long msg_idx; 34 char msg[RT_FDT_EARLYCON_MSG_SIZE * 1024]; 35 }; 36 37 struct rt_fdt_earlycon_id 38 { 39 char *name; 40 char *type; 41 char *compatible; 42 rt_err_t (*setup)(struct rt_fdt_earlycon *earlycon, const char *options); 43 }; 44 45 #define RT_FDT_EARLYCON_EXPORT(_name, _type, _compatible, _setup) \ 46 static const struct rt_fdt_earlycon_id __rt_fdt_##_name##_earlycon \ 47 rt_used RT_OFW_SYMBOL(earlycon, _) = \ 48 { \ 49 .name = #_name, \ 50 .type = _type, \ 51 .compatible = _compatible, \ 52 .setup = _setup, \ 53 } 54 55 const char *rt_fdt_node_name(const char *full_name); 56 rt_uint64_t rt_fdt_read_number(const fdt32_t *cell, int size); 57 rt_uint64_t rt_fdt_next_cell(const fdt32_t **cellptr, int size); 58 rt_uint64_t rt_fdt_translate_address(void *fdt, int nodeoffset, rt_uint64_t address); 59 rt_bool_t rt_fdt_device_is_available(void *fdt, int nodeoffset); 60 61 rt_err_t rt_fdt_commit_memregion_early(rt_region_t *region, rt_bool_t is_reserved); 62 rt_err_t rt_fdt_commit_memregion_request(rt_region_t **out_region, rt_size_t *out_nr, rt_bool_t is_reserved); 63 64 rt_err_t rt_fdt_prefetch(void *fdt); 65 rt_err_t rt_fdt_scan_root(void); 66 rt_err_t rt_fdt_scan_memory(void); 67 rt_err_t rt_fdt_scan_initrd(rt_uint64_t *ranges); 68 rt_err_t rt_fdt_model_dump(void); 69 rt_err_t rt_fdt_boot_dump(void); 70 void rt_fdt_earlycon_output(const char *str); 71 void rt_fdt_earlycon_kick(int why); 72 rt_err_t rt_fdt_scan_chosen_stdout(void); 73 rt_err_t rt_fdt_bootargs_select(const char *key, int index, const char **out_result); 74 rt_err_t rt_fdt_unflatten(void); 75 76 struct rt_ofw_node *rt_fdt_unflatten_single(void *fdt); 77 78 #endif /* __OFW_FDT_H__ */ 79