Squash commits for public release
This commit is contained in:
52
boot/libboot/devtree/devtree.c
Normal file
52
boot/libboot/devtree/devtree.c
Normal file
@@ -0,0 +1,52 @@
|
||||
#include "devtree.h"
|
||||
#include <libboot/log/log.h>
|
||||
#include <libboot/mem/mem.h>
|
||||
|
||||
static size_t _devtree_size = 0;
|
||||
static devtree_header_t* _devtree_header = NULL;
|
||||
static devtree_entry_t* _devtree_body = NULL;
|
||||
static char* _devtree_name_section = NULL;
|
||||
|
||||
void* devtree_start()
|
||||
{
|
||||
return (void*)_devtree_header;
|
||||
}
|
||||
|
||||
size_t devtree_size()
|
||||
{
|
||||
return _devtree_size;
|
||||
}
|
||||
|
||||
int devtree_init(void* devtree, size_t size)
|
||||
{
|
||||
if (!devtree) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
devtree_header_t* dth = (devtree_header_t*)devtree;
|
||||
_devtree_header = dth;
|
||||
_devtree_body = (devtree_entry_t*)&dth[1];
|
||||
_devtree_name_section = ((char*)dth + dth->name_list_offset);
|
||||
_devtree_size = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char* devtree_name_of_entry(devtree_entry_t* en)
|
||||
{
|
||||
return &_devtree_name_section[en->rel_name_offset];
|
||||
}
|
||||
|
||||
devtree_entry_t* devtree_find_device(const char* name)
|
||||
{
|
||||
if (!_devtree_body) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (int i = 0; i < _devtree_header->entries_count; i++) {
|
||||
const char* curdev_name = devtree_name_of_entry(&_devtree_body[i]);
|
||||
if (strcmp(curdev_name, name) == 0) {
|
||||
return &_devtree_body[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
50
boot/libboot/devtree/devtree.h
Normal file
50
boot/libboot/devtree/devtree.h
Normal file
@@ -0,0 +1,50 @@
|
||||
#ifndef _BOOT_LIBBOOT_DEVTREE_DEVTREE_H
|
||||
#define _BOOT_LIBBOOT_DEVTREE_DEVTREE_H
|
||||
|
||||
#include <libboot/mem/mem.h>
|
||||
#include <libboot/types.h>
|
||||
|
||||
#define DEVTREE_HEADER_SIGNATURE ("odtr3")
|
||||
#define DEVTREE_HEADER_SIGNATURE_LEN (sizeof(DEVTREE_HEADER_SIGNATURE) - 1)
|
||||
|
||||
struct PACKED devtree_header {
|
||||
char signature[8];
|
||||
uint32_t revision;
|
||||
uint32_t flags;
|
||||
uint32_t entries_count;
|
||||
uint32_t name_list_offset;
|
||||
};
|
||||
typedef struct devtree_header devtree_header_t;
|
||||
|
||||
#define DEVTREE_ENTRY_FLAGS_MMIO = (1 << 0)
|
||||
#define DEVTREE_ENTRY_TYPE_IO (0)
|
||||
#define DEVTREE_ENTRY_TYPE_FB (1)
|
||||
#define DEVTREE_ENTRY_TYPE_UART (2)
|
||||
#define DEVTREE_ENTRY_TYPE_RAM (3)
|
||||
#define DEVTREE_ENTRY_TYPE_STORAGE (4)
|
||||
#define DEVTREE_ENTRY_TYPE_BUS_CONTROLLER (5)
|
||||
#define DEVTREE_ENTRY_TYPE_RTC (6)
|
||||
|
||||
struct PACKED devtree_entry {
|
||||
uint32_t type;
|
||||
uint32_t flags;
|
||||
uint64_t region_base;
|
||||
uint64_t region_size;
|
||||
uint32_t irq_lane;
|
||||
uint32_t irq_flags;
|
||||
uint32_t irq_priority;
|
||||
uint32_t rel_name_offset;
|
||||
uint64_t aux1;
|
||||
uint64_t aux2;
|
||||
uint64_t aux3;
|
||||
uint64_t aux4;
|
||||
};
|
||||
typedef struct devtree_entry devtree_entry_t;
|
||||
|
||||
int devtree_init(void* devtree, size_t size);
|
||||
const char* devtree_name_of_entry(devtree_entry_t* en);
|
||||
devtree_entry_t* devtree_find_device(const char* name);
|
||||
void* devtree_start();
|
||||
size_t devtree_size();
|
||||
|
||||
#endif // _BOOT_LIBBOOT_DEVTREE_DEVTREE_H
|
||||
Reference in New Issue
Block a user