FlattenedDeviceTree.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2021-2023, Andrew Kaster <akaster@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Endian.h>
  8. #include <AK/Error.h>
  9. #include <AK/Function.h>
  10. #include <AK/IterationDecision.h>
  11. #include <AK/StringView.h>
  12. #include <AK/Types.h>
  13. #include "DeviceTree.h"
  14. namespace DeviceTree {
  15. // https://devicetree-specification.readthedocs.io/en/v0.3/flattened-format.html
  16. struct FlattenedDeviceTreeHeader {
  17. BigEndian<u32> magic; // 0xDOODFEED (BE)
  18. BigEndian<u32> totalsize; // Total size of entire blob including padding b/w and after fields
  19. BigEndian<u32> off_dt_struct; // Offset of StructureBlock from beginning of header
  20. // https://devicetree-specification.readthedocs.io/en/v0.3/flattened-format.html#sect-fdt-structure-block
  21. BigEndian<u32> off_dt_strings; // Offset of StringsBlock from beginning of header
  22. // https://devicetree-specification.readthedocs.io/en/v0.3/flattened-format.html#sect-fdt-strings-block
  23. BigEndian<u32> off_mem_rsvmap; // Offset of MemoryReservationBlock from beginning of header
  24. BigEndian<u32> version; // 0.3 spec defines version 17
  25. BigEndian<u32> last_comp_version; // 0.3 spec back-compatible with version 16, mandated to be 16
  26. BigEndian<u32> boot_cpuid_phys; // Physical ID given in `reg` property of CPU node of boot cpu
  27. BigEndian<u32> size_dt_strings; // Length in bytes of StringsBlock
  28. BigEndian<u32> size_dt_struct; // Length in bytes of StructureBlock
  29. };
  30. static_assert(sizeof(FlattenedDeviceTreeHeader) == 40, "FDT Header size must match specification");
  31. // https://devicetree-specification.readthedocs.io/en/v0.3/flattened-format.html#format
  32. struct FlattenedDeviceTreeReserveEntry {
  33. BigEndian<u64> address;
  34. BigEndian<u64> size;
  35. bool operator==(FlattenedDeviceTreeReserveEntry const& other) const { return other.address == address && other.size == size; }
  36. };
  37. static_assert(sizeof(FlattenedDeviceTreeReserveEntry) == 16, "FDT Memory Reservation entry size must match specification");
  38. // https://devicetree-specification.readthedocs.io/en/v0.3/flattened-format.html#lexical-structure
  39. enum FlattenedDeviceTreeTokenType : u32 {
  40. BeginNode = 1,
  41. EndNode = 2,
  42. Property = 3,
  43. NoOp = 4,
  44. End = 9
  45. };
  46. struct DeviceTreeCallbacks {
  47. Function<ErrorOr<IterationDecision>(StringView)> on_node_begin;
  48. Function<ErrorOr<IterationDecision>(StringView)> on_node_end;
  49. Function<ErrorOr<IterationDecision>(StringView, ReadonlyBytes)> on_property;
  50. Function<ErrorOr<IterationDecision>()> on_noop;
  51. Function<ErrorOr<void>()> on_end;
  52. };
  53. ErrorOr<void> walk_device_tree(FlattenedDeviceTreeHeader const&, ReadonlyBytes raw_device_tree, DeviceTreeCallbacks);
  54. ErrorOr<DeviceTreeProperty> slow_get_property(StringView name, FlattenedDeviceTreeHeader const&, ReadonlyBytes raw_device_tree);
  55. } // namespace DeviceTree