The Pedigree Project 0.1
DeviceTree.h
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7
8#ifndef KERNEL_MACHINE_VIRT_DEVICETREE_H
9#define KERNEL_MACHINE_VIRT_DEVICETREE_H
10
11#include "pedigree/kernel/BootstrapInfo.h"
12
13#include <stddef.h>
14#include <stdint.h>
15
17 uint64_t base;
18 uint64_t size;
19};
20
22 uint64_t base;
23 uint64_t size;
24 uint32_t irq;
25};
26
28 uint64_t base;
29 uint64_t size;
30 uint32_t firstBus;
31 uint32_t lastBus;
32};
33
35 uint32_t space;
36 uint64_t pciBase;
37 uint64_t cpuBase;
38 uint64_t size;
39 bool prefetchable = false;
40};
41
43 enum class Type : uint8_t { None, GicV2m, GicV3Its };
44 Type type;
45 uint64_t base;
46 uint64_t size;
47 uint16_t spiBase;
48 uint16_t spiCount;
49};
50
53 public:
54 static bool initialise(const void* dtb);
55 static bool initialiseAcpi(uint64_t rsdpPhysical,
56 const BootstrapStruct_t::MemoryMapEntry* memoryMap,
57 size_t memoryMapCount);
58 static bool valid();
59 static bool memoryRegion(size_t index, VirtMemoryRegion& region);
60 static bool virtioMmio(size_t index, VirtMmioDevice& device);
61 static bool pciHost(VirtPciHost& host);
62 static bool pciWindow(size_t index, VirtPciWindow& window);
63 static bool pciTranslate(uint64_t address, uint64_t size, bool io, uint64_t& physical);
64 static uint32_t pciInterrupt(uint8_t bus, uint8_t device, uint8_t function, uint8_t pin);
65 static bool pciMsiController(VirtMsiController& controller);
66 static bool pciMsiDeviceId(uint8_t bus, uint8_t device, uint8_t function, uint32_t& id);
68 static uintptr_t uartBase();
69 static uint32_t uartIrq();
70 static uintptr_t rtcBase();
71 static uint32_t gicVersion();
72 static uintptr_t gicDistributorBase();
73 static uintptr_t gicCpuBase();
74 static uintptr_t gicRedistributorBase();
75 static uint64_t gicRedistributorPhysical();
76 static uint32_t physicalTimerIrq();
77 static uint32_t virtualTimerIrq();
78 static bool psciAvailable();
79 static bool psciUsesHvc();
80 static bool initrd(uint64_t& start, uint64_t& end);
81 static const char* bootargs();
82 static size_t blobSize();
83};
84
85extern "C" void virtSetDeviceTree(const void* dtb);
86extern "C" bool virtGetMemoryRegion(size_t index, uint64_t* base, uint64_t* size);
87extern "C" bool virtGetVirtioMmio(size_t index, uint64_t* base, uint64_t* size, uint32_t* irq);
88extern "C" bool virtGetInitrd(uint64_t* start, uint64_t* end);
89extern "C" bool virtGetBootargs(const char** text);
90
91#endif
static uintptr_t uartBase()