1*523fa7a6SAndroid Build Coastguard Worker /* 2*523fa7a6SAndroid Build Coastguard Worker * Copyright 2023-2024 Arm Limited and/or its affiliates. 3*523fa7a6SAndroid Build Coastguard Worker * 4*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the 5*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree. 6*523fa7a6SAndroid Build Coastguard Worker */ 7*523fa7a6SAndroid Build Coastguard Worker 8*523fa7a6SAndroid Build Coastguard Worker /* 9*523fa7a6SAndroid Build Coastguard Worker * Minimal reading function for vela_bin_stream wire format. This is an 10*523fa7a6SAndroid Build Coastguard Worker * implementation detail of the arm_backend AoT flow and ArmBackendEthosU 11*523fa7a6SAndroid Build Coastguard Worker * and subject to change. 12*523fa7a6SAndroid Build Coastguard Worker * This format captures the command stream, I/O and memory layout data to 13*523fa7a6SAndroid Build Coastguard Worker * enable execution of the command stream on Ethos-U hardware. 14*523fa7a6SAndroid Build Coastguard Worker */ 15*523fa7a6SAndroid Build Coastguard Worker 16*523fa7a6SAndroid Build Coastguard Worker #pragma once 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Worker #include <cstddef> 19*523fa7a6SAndroid Build Coastguard Worker #include <cstdint> 20*523fa7a6SAndroid Build Coastguard Worker 21*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 22*523fa7a6SAndroid Build Coastguard Worker namespace backends { 23*523fa7a6SAndroid Build Coastguard Worker namespace arm { 24*523fa7a6SAndroid Build Coastguard Worker 25*523fa7a6SAndroid Build Coastguard Worker // Standard block name size 26*523fa7a6SAndroid Build Coastguard Worker const uint32_t kVelaBlockNameLength = 16; 27*523fa7a6SAndroid Build Coastguard Worker 28*523fa7a6SAndroid Build Coastguard Worker // Generic block within the vela_bin_stream encoded by the python vela_compile 29*523fa7a6SAndroid Build Coastguard Worker // step 30*523fa7a6SAndroid Build Coastguard Worker typedef struct { 31*523fa7a6SAndroid Build Coastguard Worker char name[kVelaBlockNameLength]; // string name, can be shorter or truncated 32*523fa7a6SAndroid Build Coastguard Worker uint32_t size; // unpadded size, BinBlock size will be rounded to next_mul_16 33*523fa7a6SAndroid Build Coastguard Worker char _pad[12]; // Our data often need 16 byte alignemnt 34*523fa7a6SAndroid Build Coastguard Worker char data[]; // block.name specific format data 35*523fa7a6SAndroid Build Coastguard Worker } VelaBinBlock; 36*523fa7a6SAndroid Build Coastguard Worker 37*523fa7a6SAndroid Build Coastguard Worker // A Vela input or output descriptor in the binary stream 38*523fa7a6SAndroid Build Coastguard Worker typedef struct { 39*523fa7a6SAndroid Build Coastguard Worker int shape[4]; // Up to 4D shape of input or output 40*523fa7a6SAndroid Build Coastguard Worker int elem_size; // Element sizeof in bytes 41*523fa7a6SAndroid Build Coastguard Worker int offset; // Offset in bytes within SRAM working data 42*523fa7a6SAndroid Build Coastguard Worker int region; // Scratch region this belongs to 43*523fa7a6SAndroid Build Coastguard Worker } VelaIO; 44*523fa7a6SAndroid Build Coastguard Worker 45*523fa7a6SAndroid Build Coastguard Worker // A list of VelaIOs from the binary stream 46*523fa7a6SAndroid Build Coastguard Worker typedef struct { 47*523fa7a6SAndroid Build Coastguard Worker int count; 48*523fa7a6SAndroid Build Coastguard Worker VelaIO io[]; 49*523fa7a6SAndroid Build Coastguard Worker } VelaIOs; 50*523fa7a6SAndroid Build Coastguard Worker 51*523fa7a6SAndroid Build Coastguard Worker // Processed data used by the backend to invoke the payload 52*523fa7a6SAndroid Build Coastguard Worker typedef struct { 53*523fa7a6SAndroid Build Coastguard Worker const char* cmd_data; 54*523fa7a6SAndroid Build Coastguard Worker size_t cmd_data_size; 55*523fa7a6SAndroid Build Coastguard Worker const char* weight_data; 56*523fa7a6SAndroid Build Coastguard Worker size_t weight_data_size; 57*523fa7a6SAndroid Build Coastguard Worker char* scratch_data; 58*523fa7a6SAndroid Build Coastguard Worker size_t scratch_data_size; 59*523fa7a6SAndroid Build Coastguard Worker VelaIOs* inputs; 60*523fa7a6SAndroid Build Coastguard Worker VelaIOs* outputs; 61*523fa7a6SAndroid Build Coastguard Worker } VelaHandles; 62*523fa7a6SAndroid Build Coastguard Worker 63*523fa7a6SAndroid Build Coastguard Worker /* Takes in the preprocessed vela_bin_stream wire format and returns data 64*523fa7a6SAndroid Build Coastguard Worker * needed to launch the workload on the Ethos-U and wire up input and 65*523fa7a6SAndroid Build Coastguard Worker * output values. 66*523fa7a6SAndroid Build Coastguard Worker */ 67*523fa7a6SAndroid Build Coastguard Worker bool vela_bin_read(const char* data, VelaHandles* handles, int size); 68*523fa7a6SAndroid Build Coastguard Worker 69*523fa7a6SAndroid Build Coastguard Worker /* Does minimal validation of a vela_bin_stream to ensure the overall 70*523fa7a6SAndroid Build Coastguard Worker * structure is correct and so likely to contain valid binary data for launch 71*523fa7a6SAndroid Build Coastguard Worker * on the Ethos-U. 72*523fa7a6SAndroid Build Coastguard Worker */ 73*523fa7a6SAndroid Build Coastguard Worker bool vela_bin_validate(const char* data, int size); 74*523fa7a6SAndroid Build Coastguard Worker 75*523fa7a6SAndroid Build Coastguard Worker } // namespace arm 76*523fa7a6SAndroid Build Coastguard Worker } // namespace backends 77*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 78