1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "devtree.h"
10#include <libboot/mem/mem.h>
11
12static size_t _devtree_size = 0;
13static devtree_header_t* _devtree_header = NULL;
14static devtree_entry_t* _devtree_body = NULL;
15static char* _devtree_name_section = NULL;
16
17void* devtree_start()
18{
19 return (void*)_devtree_header;
20}
21
22size_t devtree_size()
23{
24 return _devtree_size;
25}
26
27int devtree_init(void* devtree, size_t size)
28{
29 if (!devtree) {
30 return 0;
31 }
32
33 devtree_header_t* dth = (devtree_header_t*)devtree;
34 _devtree_header = dth;
35 _devtree_body = (devtree_entry_t*)&dth[1];
36 _devtree_name_section = ((char*)dth + dth->name_list_offset);
37 _devtree_size = size;
38 return 0;
39}
40
41const char* devtree_name_of_entry(devtree_entry_t* en)
42{
43 return &_devtree_name_section[en->rel_name_offset];
44}
45
46devtree_entry_t* devtree_find_device(const char* name)
47{
48 if (!_devtree_body) {
49 return NULL;
50 }
51
52 for (int i = 0; i < _devtree_header->entries_count; i++) {
53 const char* curdev_name = devtree_name_of_entry(&_devtree_body[i]);
54 if (strcmp(curdev_name, name) == 0) {
55 return &_devtree_body[i];
56 }
57 }
58 return NULL;
59}