1 /*
2  * Copyright (c) 2020 Travis Geiselbrecht
3  *
4  * Use of this source code is governed by a MIT-style
5  * license that can be found in the LICENSE file or at
6  * https://opensource.org/licenses/MIT
7  */
8 #pragma once
9 
10 #include <lk/compiler.h>
11 #include <sys/types.h>
12 
13 __BEGIN_CDECLS
14 
15 /*
16  * A set of routines to assist with walking a Flattened Device Tree in memory
17  * for interesting nodes. Uses libfdt internally.
18  */
19 
20 struct fdt_walk_pcie_info {
21     // location of the ECAM and the pci ranges it covers
22     uint64_t ecam_base;
23     uint64_t ecam_len;
24     uint8_t bus_start;
25     uint8_t bus_end;
26 
27     // discovered io and mmio apertures
28     uint64_t io_base;
29     uint64_t io_base_mmio;
30     uint64_t io_len;
31     uint64_t mmio_base;
32     uint64_t mmio_len;
33     uint64_t mmio64_base;
34     uint64_t mmio64_len;
35 };
36 
37 struct fdt_walk_memory_region {
38     uint64_t base;
39     uint64_t len;
40 };
41 
42 struct fdt_walk_cpu_info {
43     uint32_t id;
44 #if ARCH_RISCV
45     const char *isa_string; // pointer to riscv,isa inside device tree
46     const char *isa_extensions_string; // pointer to riscv,isa-etensions inside device tree
47 #endif
48 };
49 
50 status_t fdt_walk_dump(const void *fdt);
51 
52 // New style walkers, finds a single topic at a time
53 status_t fdt_walk_find_pcie_info(const void *fdt, struct fdt_walk_pcie_info *, size_t *count);
54 status_t fdt_walk_find_memory(const void *fdt, struct fdt_walk_memory_region *memory, size_t *mem_count,
55                               struct fdt_walk_memory_region *reserved_memory, size_t *reserved_mem_count);
56 status_t fdt_walk_find_cpus(const void *fdt, struct fdt_walk_cpu_info *cpu, size_t *cpu_count);
57 
58 // Helper routines that initialize various subsystems based on device tree info
59 status_t fdtwalk_setup_memory(const void *fdt, paddr_t fdt_phys, paddr_t default_mem_base, size_t default_mem_size);
60 #if ARCH_RISCV
61 status_t fdtwalk_setup_cpus_riscv(const void *fdt);
62 #endif
63 #if ARCH_ARM || ARCH_ARM64
64 status_t fdtwalk_setup_cpus_arm(const void *fdt);
65 #endif
66 #if WITH_DEV_BUS_PCI
67 status_t fdtwalk_setup_pci(const void *fdt);
68 #endif
69 status_t fdtwalk_reserve_fdt_memory(const void *fdt, paddr_t fdt_phys);
70 
71 __END_CDECLS
72