/* * Copyright (c) 2024, Leon Albrecht * * SPDX-License-Identifier: BSD-2-Clause */ #include "DeviceTree.h" #include #include #include #include #include static Singleton> s_device_tree; namespace Kernel::DeviceTree { alignas(PAGE_SIZE) __attribute__((section(".bss.fdt"))) u8 s_fdt_storage[fdt_storage_size]; ErrorOr unflatten_fdt() { *s_device_tree = TRY(::DeviceTree::DeviceTree::parse({ s_fdt_storage, fdt_storage_size })); return {}; } bool verify_fdt() { static bool verified { false }; static bool verification_succeeded { false }; if (verified) return verification_succeeded; verified = true; auto& header = *bit_cast<::DeviceTree::FlattenedDeviceTreeHeader*>(&s_fdt_storage[0]); auto fdt = ReadonlyBytes(s_fdt_storage, header.totalsize); verification_succeeded = ::DeviceTree::validate_flattened_device_tree(header, fdt, ::DeviceTree::Verbose::No); return verification_succeeded; } void dump_fdt() { auto& header = *bit_cast<::DeviceTree::FlattenedDeviceTreeHeader*>(&s_fdt_storage[0]); auto fdt = ReadonlyBytes(s_fdt_storage, header.totalsize); MUST(::DeviceTree::dump(header, fdt)); } ErrorOr get_command_line_from_fdt() { auto& header = *bit_cast<::DeviceTree::FlattenedDeviceTreeHeader*>(&s_fdt_storage[0]); auto fdt = ReadonlyBytes(s_fdt_storage, header.totalsize); return TRY(::DeviceTree::slow_get_property("/chosen/bootargs"sv, header, fdt)).as_string(); } ::DeviceTree::DeviceTree const& get() { VERIFY(*s_device_tree); return **s_device_tree; } }