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