#pragma once #include #include "align.hpp" namespace maple { template struct host_command { uint32_t host_instruction; uint32_t receive_data_storage_address; struct bus_data { uint8_t command_code; uint8_t destination_ap; uint8_t source_ap; uint8_t data_size; T data_fields; } bus_data; }; static_assert((sizeof (host_command)) == 12); static_assert((sizeof (host_command[4])) == 48); template struct host_response { struct bus_data { uint8_t command_code; uint8_t destination_ap; uint8_t source_ap; uint8_t data_size; T data_fields; } bus_data; uint8_t _pad[align_32byte((sizeof (bus_data))) - (sizeof (bus_data))]; }; static_assert((sizeof (host_response)) == align_32byte((sizeof (host_response)))); void dma_start(uint32_t const * const command_buf, const uint32_t command_size, uint32_t const * const receive_buf, const uint32_t receive_size ); template constexpr uint32_t sizeof_command(T * c) { return reinterpret_cast(&c[1]) - reinterpret_cast(&c[0]); } }