diff --git a/Kernel/Arch/aarch64/RPi/Mailbox.cpp b/Kernel/Arch/aarch64/RPi/Mailbox.cpp index e5278e9f1f..87cdc22c59 100644 --- a/Kernel/Arch/aarch64/RPi/Mailbox.cpp +++ b/Kernel/Arch/aarch64/RPi/Mailbox.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace Kernel::RPi { @@ -171,4 +172,60 @@ StringView Mailbox::query_kernel_command_line(Bytes buffer) return StringView { (char const*)&message[5], response_length }; } +class QueryARMMemoryMailboxMessage : RPi::Mailbox::Message { +public: + u32 base; + u32 size; + + QueryARMMemoryMailboxMessage() + : RPi::Mailbox::Message(0x0001'0005, 8) + { + base = 0; + size = 0; + } +}; + +Mailbox::MemoryRange Mailbox::query_lower_arm_memory_range() +{ + struct __attribute__((aligned(16))) { + MessageHeader header; + QueryARMMemoryMailboxMessage query_arm_memory; + MessageTail tail; + } message_queue; + + if (!the().send_queue(&message_queue, sizeof(message_queue))) { + PANIC("Failed to determine the available RAM range"); + } + + return { message_queue.query_arm_memory.base, message_queue.query_arm_memory.size }; +} + +class QueryVCMemoryMailboxMessage : RPi::Mailbox::Message { +public: + u32 base; + u32 size; + + QueryVCMemoryMailboxMessage() + : RPi::Mailbox::Message(0x0001'0006, 8) + { + base = 0; + size = 0; + } +}; + +Mailbox::MemoryRange Mailbox::query_videocore_memory_range() +{ + struct __attribute__((aligned(16))) { + MessageHeader header; + QueryVCMemoryMailboxMessage query_vc_memory; + MessageTail tail; + } message_queue; + + if (!the().send_queue(&message_queue, sizeof(message_queue))) { + PANIC("Failed to determine the VideoCore memory range"); + } + + return { message_queue.query_vc_memory.base, message_queue.query_vc_memory.size }; +} + } diff --git a/Kernel/Arch/aarch64/RPi/Mailbox.h b/Kernel/Arch/aarch64/RPi/Mailbox.h index 658254d6c4..ec20d4ac00 100644 --- a/Kernel/Arch/aarch64/RPi/Mailbox.h +++ b/Kernel/Arch/aarch64/RPi/Mailbox.h @@ -55,6 +55,15 @@ public: // Returns the kernel command line as a StringView into the given buffer. StringView query_kernel_command_line(Bytes buffer); + + struct MemoryRange { + u32 base; + u32 size; + }; + // Returns the RAM available to the CPU in the first 1GB of the physical address space. + // FIXME: Remove in favor of parsing the device tree. + MemoryRange query_lower_arm_memory_range(); + MemoryRange query_videocore_memory_range(); }; }