Files
zinnia/include/zinnia/fdt.h
T
2026-10-19 20:03:05 +02:00

89 lines
2.2 KiB
C++

// SPDX-License-Identifier: ISC
#pragma once
#include <zinnia/errno.h>
#include <zinnia/initgraph.h>
#include <zinnia/types.h>
#include <stddef.h>
#include <stdint.h>
struct fdt_header {
uint32_t magic;
uint32_t total_size;
uint32_t structs_offset;
uint32_t strings_offset;
uint32_t reserved_offset;
uint32_t version;
uint32_t compat_version;
uint32_t boot_cpuid;
uint32_t strings_size;
uint32_t structs_size;
};
constexpr uint32_t FDT_BEGIN_NODE = 0x00000001;
constexpr uint32_t FDT_END_NODE = 0x00000002;
constexpr uint32_t FDT_PROP = 0x00000003;
constexpr uint32_t FDT_NOP = 0x00000004;
constexpr uint32_t FDT_END = 0x00000009;
constexpr uint32_t FDT_MAGIC = 0xD00DFEED;
struct fdt_match {
const char* compatible;
uintptr_t data;
};
struct fdt {
const uint8_t* blob;
size_t total_size;
uint32_t version;
uint32_t compat_version;
uint32_t boot_cpuid;
const uint8_t* structs;
size_t structs_len;
const uint8_t* strings;
size_t strings_len;
};
struct fdt_node {
struct fdt* tree;
size_t offset;
};
struct fdt_prop {
struct fdt* tree;
const void* data;
size_t length;
};
uint32_t fdt_read_u32(const void* data);
uint64_t fdt_read_u64(const void* data);
bool fdt_init(struct fdt* tree, const void* data, size_t length);
struct fdt_node fdt_find(struct fdt* tree, const char* path);
struct fdt_node fdt_find_compatible(struct fdt* tree, const char* compatible);
struct fdt_prop fdt_property(struct fdt_node node, const char* name);
bool fdt_property_u32(struct fdt_node node, const char* name, uint32_t* value);
bool fdt_property_u64(struct fdt_node node, const char* name, uint64_t* value);
// Root of the device tree.
struct fdt_node fdt_root(struct fdt* tree);
struct fdt_node fdt_next_node(struct fdt_node node);
bool fdt_node_is_compatible(struct fdt_node node, const char* compatible);
bool fdt_node_reg(struct fdt_node node, size_t index, phys_t* addr, size_t* size);
struct fdt_driver {
const char* name;
const struct fdt_match* match;
const size_t num_matches;
errno_t (*probe)(struct fdt_node node, const struct fdt_match* match);
};
struct fdt* fdt_get();
errno_t fdt_driver_register(struct fdt_driver* driver);
INIT_EXTERN(fdt_stage);