xref: /aosp_15_r20/external/executorch/backends/arm/runtime/VelaBinStream.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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