mirror of https://github.com/ipxe/ipxe.git
120 lines
2.8 KiB
C
120 lines
2.8 KiB
C
#ifndef _IPXE_FDT_H
|
|
#define _IPXE_FDT_H
|
|
|
|
/** @file
|
|
*
|
|
* Flattened Device Tree
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/image.h>
|
|
|
|
struct net_device;
|
|
|
|
/** Device tree header */
|
|
struct fdt_header {
|
|
/** Magic signature */
|
|
uint32_t magic;
|
|
/** Total size of device tree */
|
|
uint32_t totalsize;
|
|
/** Offset to structure block */
|
|
uint32_t off_dt_struct;
|
|
/** Offset to strings block */
|
|
uint32_t off_dt_strings;
|
|
/** Offset to memory reservation block */
|
|
uint32_t off_mem_rsvmap;
|
|
/** Version of this data structure */
|
|
uint32_t version;
|
|
/** Lowest version to which this structure is compatible */
|
|
uint32_t last_comp_version;
|
|
/** Physical ID of the boot CPU */
|
|
uint32_t boot_cpuid_phys;
|
|
/** Length of string block */
|
|
uint32_t size_dt_strings;
|
|
/** Length of structure block */
|
|
uint32_t size_dt_struct;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** Magic signature */
|
|
#define FDT_MAGIC 0xd00dfeed
|
|
|
|
/** Expected device tree version */
|
|
#define FDT_VERSION 16
|
|
|
|
/** Device tree token */
|
|
typedef uint32_t fdt_token_t;
|
|
|
|
/** Begin node token */
|
|
#define FDT_BEGIN_NODE 0x00000001
|
|
|
|
/** End node token */
|
|
#define FDT_END_NODE 0x00000002
|
|
|
|
/** Property token */
|
|
#define FDT_PROP 0x00000003
|
|
|
|
/** Property fragment */
|
|
struct fdt_prop {
|
|
/** Data length */
|
|
uint32_t len;
|
|
/** Name offset */
|
|
uint32_t name_off;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** NOP token */
|
|
#define FDT_NOP 0x00000004
|
|
|
|
/** End of structure block */
|
|
#define FDT_END 0x00000009
|
|
|
|
/** Alignment of structure block */
|
|
#define FDT_STRUCTURE_ALIGN ( sizeof ( fdt_token_t ) )
|
|
|
|
/** A device tree */
|
|
struct fdt {
|
|
/** Tree data */
|
|
union {
|
|
/** Tree header */
|
|
struct fdt_header *hdr;
|
|
/** Raw data */
|
|
void *raw;
|
|
};
|
|
/** Length of tree */
|
|
size_t len;
|
|
/** Used length of tree */
|
|
size_t used;
|
|
/** Offset to structure block */
|
|
unsigned int structure;
|
|
/** Length of structure block */
|
|
size_t structure_len;
|
|
/** Offset to strings block */
|
|
unsigned int strings;
|
|
/** Length of strings block */
|
|
size_t strings_len;
|
|
/** Offset to memory reservation block */
|
|
unsigned int reservations;
|
|
};
|
|
|
|
extern struct image_tag fdt_image __image_tag;
|
|
extern struct fdt sysfdt;
|
|
|
|
extern int fdt_path ( struct fdt *fdt, const char *path,
|
|
unsigned int *offset );
|
|
extern int fdt_alias ( struct fdt *fdt, const char *name,
|
|
unsigned int *offset );
|
|
extern const char * fdt_string ( struct fdt *fdt, unsigned int offset,
|
|
const char *name );
|
|
extern int fdt_u64 ( struct fdt *fdt, unsigned int offset, const char *name,
|
|
uint64_t *value );
|
|
extern int fdt_mac ( struct fdt *fdt, unsigned int offset,
|
|
struct net_device *netdev );
|
|
extern int fdt_parse ( struct fdt *fdt, struct fdt_header *hdr,
|
|
size_t max_len );
|
|
extern int fdt_create ( struct fdt_header **hdr );
|
|
extern void fdt_remove ( struct fdt_header *hdr );
|
|
|
|
#endif /* _IPXE_FDT_H */
|