13523988fSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause 23523988fSSrikanth Yalavarthi * Copyright (c) 2022 Marvell. 33523988fSSrikanth Yalavarthi */ 43523988fSSrikanth Yalavarthi 53523988fSSrikanth Yalavarthi #ifndef _CN10K_ML_MODEL_H_ 63523988fSSrikanth Yalavarthi #define _CN10K_ML_MODEL_H_ 73523988fSSrikanth Yalavarthi 83523988fSSrikanth Yalavarthi #include <rte_mldev.h> 93523988fSSrikanth Yalavarthi 103523988fSSrikanth Yalavarthi #include <roc_api.h> 113523988fSSrikanth Yalavarthi 12699b7b81SSrikanth Yalavarthi #include "cn10k_ml_ocm.h" 133523988fSSrikanth Yalavarthi 14cc254869SSrikanth Yalavarthi #include "cnxk_ml_io.h" 15cc254869SSrikanth Yalavarthi 16cc254869SSrikanth Yalavarthi struct cnxk_ml_dev; 1754362031SSrikanth Yalavarthi struct cnxk_ml_model; 1854362031SSrikanth Yalavarthi struct cnxk_ml_layer; 196e402621SSrikanth Yalavarthi struct cnxk_ml_req; 203523988fSSrikanth Yalavarthi 21c699a013SSrikanth Yalavarthi /* Model Metadata : v 2.3.0.1 */ 22b9dda1b2SSrikanth Yalavarthi #define MRVL_ML_MODEL_MAGIC_STRING "MRVL" 23b9dda1b2SSrikanth Yalavarthi #define MRVL_ML_MODEL_TARGET_ARCH 128 24c699a013SSrikanth Yalavarthi #define MRVL_ML_MODEL_VERSION_MIN 2100 25b9dda1b2SSrikanth Yalavarthi #define MRVL_ML_MODEL_NAME_LEN 64 26b9dda1b2SSrikanth Yalavarthi #define MRVL_ML_INPUT_NAME_LEN 16 27b9dda1b2SSrikanth Yalavarthi #define MRVL_ML_OUTPUT_NAME_LEN 16 28c699a013SSrikanth Yalavarthi #define MRVL_ML_NUM_INPUT_OUTPUT_1 8 29c699a013SSrikanth Yalavarthi #define MRVL_ML_NUM_INPUT_OUTPUT_2 24 30f181aa7dSSrikanth Yalavarthi #define MRVL_ML_NUM_INPUT_OUTPUT (MRVL_ML_NUM_INPUT_OUTPUT_1 + MRVL_ML_NUM_INPUT_OUTPUT_2) 31b9dda1b2SSrikanth Yalavarthi 32b9dda1b2SSrikanth Yalavarthi /* Header (256-byte) */ 33faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_header { 34b9dda1b2SSrikanth Yalavarthi /* Magic string ('M', 'R', 'V', 'L') */ 35b9dda1b2SSrikanth Yalavarthi uint8_t magic[4]; 36b9dda1b2SSrikanth Yalavarthi 37b9dda1b2SSrikanth Yalavarthi /* Metadata version */ 38b9dda1b2SSrikanth Yalavarthi uint8_t version[4]; 39b9dda1b2SSrikanth Yalavarthi 40b9dda1b2SSrikanth Yalavarthi /* Metadata size */ 41b9dda1b2SSrikanth Yalavarthi uint32_t metadata_size; 42b9dda1b2SSrikanth Yalavarthi 43b9dda1b2SSrikanth Yalavarthi /* Unique ID */ 44b9dda1b2SSrikanth Yalavarthi uint8_t uuid[128]; 45b9dda1b2SSrikanth Yalavarthi 46b9dda1b2SSrikanth Yalavarthi /* Model target architecture 47b9dda1b2SSrikanth Yalavarthi * 0 = Undefined 48b9dda1b2SSrikanth Yalavarthi * 1 = M1K 49b9dda1b2SSrikanth Yalavarthi * 128 = MLIP 50b9dda1b2SSrikanth Yalavarthi * 256 = Experimental 51b9dda1b2SSrikanth Yalavarthi */ 52b9dda1b2SSrikanth Yalavarthi uint32_t target_architecture; 53b9dda1b2SSrikanth Yalavarthi uint8_t reserved[104]; 54b9dda1b2SSrikanth Yalavarthi 55faf1344eSSrikanth Yalavarthi /* CRC of data after header (i.e. after first 256 bytes) */ 56b9dda1b2SSrikanth Yalavarthi uint32_t payload_crc32c; 57b9dda1b2SSrikanth Yalavarthi 58faf1344eSSrikanth Yalavarthi /* CRC of first 252 bytes of header, after payload_crc calculation */ 59b9dda1b2SSrikanth Yalavarthi uint32_t header_crc32c; 60faf1344eSSrikanth Yalavarthi }; 61b9dda1b2SSrikanth Yalavarthi 62b9dda1b2SSrikanth Yalavarthi /* Model information (256-byte) */ 63faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_model { 64b9dda1b2SSrikanth Yalavarthi /* Model name string */ 65b9dda1b2SSrikanth Yalavarthi uint8_t name[MRVL_ML_MODEL_NAME_LEN]; 66b9dda1b2SSrikanth Yalavarthi 67b9dda1b2SSrikanth Yalavarthi /* Model version info (xx.xx.xx.xx) */ 68b9dda1b2SSrikanth Yalavarthi uint8_t version[4]; 69b9dda1b2SSrikanth Yalavarthi 70b9dda1b2SSrikanth Yalavarthi /* Model code size (Init + Main + Finish) */ 71b9dda1b2SSrikanth Yalavarthi uint32_t code_size; 72b9dda1b2SSrikanth Yalavarthi 73b9dda1b2SSrikanth Yalavarthi /* Model data size (Weights and Bias) */ 74b9dda1b2SSrikanth Yalavarthi uint32_t data_size; 75b9dda1b2SSrikanth Yalavarthi 76b9dda1b2SSrikanth Yalavarthi /* OCM start offset, set to ocm_wb_range_start */ 77b9dda1b2SSrikanth Yalavarthi uint32_t ocm_start; 78b9dda1b2SSrikanth Yalavarthi 79b9dda1b2SSrikanth Yalavarthi /* OCM start offset, set to max OCM size */ 80b9dda1b2SSrikanth Yalavarthi uint32_t ocm_end; 81b9dda1b2SSrikanth Yalavarthi 82b9dda1b2SSrikanth Yalavarthi /* Relocatable flag (always yes) 83b9dda1b2SSrikanth Yalavarthi * 0 = Not relocatable 84b9dda1b2SSrikanth Yalavarthi * 1 = Relocatable 85b9dda1b2SSrikanth Yalavarthi */ 86b9dda1b2SSrikanth Yalavarthi uint8_t ocm_relocatable; 87b9dda1b2SSrikanth Yalavarthi 88b9dda1b2SSrikanth Yalavarthi /* Tile relocatable flag (always yes) 89b9dda1b2SSrikanth Yalavarthi * 0 = Not relocatable 90b9dda1b2SSrikanth Yalavarthi * 1 = Relocatable 91b9dda1b2SSrikanth Yalavarthi */ 92b9dda1b2SSrikanth Yalavarthi uint8_t tile_relocatable; 93b9dda1b2SSrikanth Yalavarthi 94b9dda1b2SSrikanth Yalavarthi /* Start tile (Always 0) */ 95b9dda1b2SSrikanth Yalavarthi uint8_t tile_start; 96b9dda1b2SSrikanth Yalavarthi 97b9dda1b2SSrikanth Yalavarthi /* End tile (num_tiles - 1) */ 98b9dda1b2SSrikanth Yalavarthi uint8_t tile_end; 99b9dda1b2SSrikanth Yalavarthi 100b9dda1b2SSrikanth Yalavarthi /* Inference batch size */ 101b9dda1b2SSrikanth Yalavarthi uint8_t batch_size; 102b9dda1b2SSrikanth Yalavarthi 103c699a013SSrikanth Yalavarthi /* Number of input tensors (Max 32) */ 104b9dda1b2SSrikanth Yalavarthi uint8_t num_input; 105b9dda1b2SSrikanth Yalavarthi 106c699a013SSrikanth Yalavarthi /* Number of output tensors (Max 32) */ 107b9dda1b2SSrikanth Yalavarthi uint8_t num_output; 108faf1344eSSrikanth Yalavarthi uint8_t reserved_1; 109b9dda1b2SSrikanth Yalavarthi 110b9dda1b2SSrikanth Yalavarthi /* Total input size in bytes */ 111b9dda1b2SSrikanth Yalavarthi uint32_t input_size; 112b9dda1b2SSrikanth Yalavarthi 113b9dda1b2SSrikanth Yalavarthi /* Total output size in bytes */ 114b9dda1b2SSrikanth Yalavarthi uint32_t output_size; 115b9dda1b2SSrikanth Yalavarthi 116b9dda1b2SSrikanth Yalavarthi /* Table size in bytes */ 117b9dda1b2SSrikanth Yalavarthi uint32_t table_size; 118b9dda1b2SSrikanth Yalavarthi 119b9dda1b2SSrikanth Yalavarthi /* Number of layers in the network */ 120b9dda1b2SSrikanth Yalavarthi uint32_t num_layers; 121faf1344eSSrikanth Yalavarthi uint32_t reserved_2; 122b9dda1b2SSrikanth Yalavarthi 123b9dda1b2SSrikanth Yalavarthi /* Floor of absolute OCM region */ 124b9dda1b2SSrikanth Yalavarthi uint64_t ocm_tmp_range_floor; 125b9dda1b2SSrikanth Yalavarthi 126b9dda1b2SSrikanth Yalavarthi /* Relative OCM start address of WB data block */ 127b9dda1b2SSrikanth Yalavarthi uint64_t ocm_wb_range_start; 128b9dda1b2SSrikanth Yalavarthi 129b9dda1b2SSrikanth Yalavarthi /* Relative OCM end address of WB data block */ 130b9dda1b2SSrikanth Yalavarthi uint64_t ocm_wb_range_end; 131b9dda1b2SSrikanth Yalavarthi 132b9dda1b2SSrikanth Yalavarthi /* Relative DDR start address of WB data block */ 133b9dda1b2SSrikanth Yalavarthi uint64_t ddr_wb_range_start; 134b9dda1b2SSrikanth Yalavarthi 135b9dda1b2SSrikanth Yalavarthi /* Relative DDR end address of all outputs */ 136b9dda1b2SSrikanth Yalavarthi uint64_t ddr_wb_range_end; 137b9dda1b2SSrikanth Yalavarthi 138b9dda1b2SSrikanth Yalavarthi /* Relative DDR start address of all inputs */ 139b9dda1b2SSrikanth Yalavarthi uint64_t ddr_input_range_start; 140b9dda1b2SSrikanth Yalavarthi 141b9dda1b2SSrikanth Yalavarthi /* Relative DDR end address of all inputs */ 142b9dda1b2SSrikanth Yalavarthi uint64_t ddr_input_range_end; 143b9dda1b2SSrikanth Yalavarthi 144b9dda1b2SSrikanth Yalavarthi /* Relative DDR start address of all outputs */ 145b9dda1b2SSrikanth Yalavarthi uint64_t ddr_output_range_start; 146b9dda1b2SSrikanth Yalavarthi 147b9dda1b2SSrikanth Yalavarthi /* Relative DDR end address of all outputs */ 148b9dda1b2SSrikanth Yalavarthi uint64_t ddr_output_range_end; 149b9dda1b2SSrikanth Yalavarthi 150b9dda1b2SSrikanth Yalavarthi /* Compiler version */ 151b9dda1b2SSrikanth Yalavarthi uint8_t compiler_version[8]; 152b9dda1b2SSrikanth Yalavarthi 153b9dda1b2SSrikanth Yalavarthi /* CDK version */ 154b9dda1b2SSrikanth Yalavarthi uint8_t cdk_version[4]; 155b9dda1b2SSrikanth Yalavarthi 156b9dda1b2SSrikanth Yalavarthi /* Lower batch optimization support 157b9dda1b2SSrikanth Yalavarthi * 0 - No, 158b9dda1b2SSrikanth Yalavarthi * 1 - Yes 159b9dda1b2SSrikanth Yalavarthi */ 160b9dda1b2SSrikanth Yalavarthi uint8_t supports_lower_batch_size_optimization; 161c699a013SSrikanth Yalavarthi uint8_t reserved_3[3]; 162c699a013SSrikanth Yalavarthi 163c699a013SSrikanth Yalavarthi /* Relative DDR start address of scratch space */ 164c699a013SSrikanth Yalavarthi uint64_t ddr_scratch_range_start; 165c699a013SSrikanth Yalavarthi 166c699a013SSrikanth Yalavarthi /* Relative DDR end address of scratch space */ 167c699a013SSrikanth Yalavarthi uint64_t ddr_scratch_range_end; 168c699a013SSrikanth Yalavarthi uint8_t reserved_4[40]; 169faf1344eSSrikanth Yalavarthi }; 170b9dda1b2SSrikanth Yalavarthi 171b9dda1b2SSrikanth Yalavarthi /* Init section (64-byte) */ 172faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_init_section { 173b9dda1b2SSrikanth Yalavarthi uint32_t file_offset; 174b9dda1b2SSrikanth Yalavarthi uint32_t file_size; 175b9dda1b2SSrikanth Yalavarthi uint8_t reserved[56]; 176faf1344eSSrikanth Yalavarthi }; 177b9dda1b2SSrikanth Yalavarthi 178b9dda1b2SSrikanth Yalavarthi /* Main section (64-byte) */ 179faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_main_section { 180b9dda1b2SSrikanth Yalavarthi uint32_t file_offset; 181b9dda1b2SSrikanth Yalavarthi uint32_t file_size; 182b9dda1b2SSrikanth Yalavarthi uint8_t reserved[56]; 183faf1344eSSrikanth Yalavarthi }; 184b9dda1b2SSrikanth Yalavarthi 185b9dda1b2SSrikanth Yalavarthi /* Finish section (64-byte) */ 186faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_finish_section { 187b9dda1b2SSrikanth Yalavarthi uint32_t file_offset; 188b9dda1b2SSrikanth Yalavarthi uint32_t file_size; 189b9dda1b2SSrikanth Yalavarthi uint8_t reserved[56]; 190faf1344eSSrikanth Yalavarthi }; 191b9dda1b2SSrikanth Yalavarthi 192b9dda1b2SSrikanth Yalavarthi /* Weights and Bias (64-byte) */ 193faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_weights_bias_section { 194b9dda1b2SSrikanth Yalavarthi /* Memory offset, set to ddr_wb_range_start */ 195b9dda1b2SSrikanth Yalavarthi uint64_t mem_offset; 196b9dda1b2SSrikanth Yalavarthi uint32_t file_offset; 197b9dda1b2SSrikanth Yalavarthi uint32_t file_size; 198b9dda1b2SSrikanth Yalavarthi 199b9dda1b2SSrikanth Yalavarthi /* Relocatable flag for WB 200b9dda1b2SSrikanth Yalavarthi * 1 = Relocatable 201b9dda1b2SSrikanth Yalavarthi * 2 = Not relocatable 202b9dda1b2SSrikanth Yalavarthi */ 203b9dda1b2SSrikanth Yalavarthi uint8_t relocatable; 204b9dda1b2SSrikanth Yalavarthi uint8_t reserved[47]; 205faf1344eSSrikanth Yalavarthi }; 206b9dda1b2SSrikanth Yalavarthi 207faf1344eSSrikanth Yalavarthi /* Input section (64-byte per input) */ 208faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_input_section { 209b9dda1b2SSrikanth Yalavarthi /* DDR offset (in OCM absolute addresses for input) */ 210b9dda1b2SSrikanth Yalavarthi uint64_t mem_offset; 211b9dda1b2SSrikanth Yalavarthi 212b9dda1b2SSrikanth Yalavarthi /* Relocatable flag 213b9dda1b2SSrikanth Yalavarthi * 1 = Relocatable 214b9dda1b2SSrikanth Yalavarthi * 2 = Not relocatable 215b9dda1b2SSrikanth Yalavarthi */ 216b9dda1b2SSrikanth Yalavarthi uint8_t relocatable; 217b9dda1b2SSrikanth Yalavarthi 218b9dda1b2SSrikanth Yalavarthi /* Input quantization 219b9dda1b2SSrikanth Yalavarthi * 1 = Requires quantization 220b9dda1b2SSrikanth Yalavarthi * 2 = Pre-quantized 221b9dda1b2SSrikanth Yalavarthi */ 222b9dda1b2SSrikanth Yalavarthi uint8_t quantize; 223b9dda1b2SSrikanth Yalavarthi 224b9dda1b2SSrikanth Yalavarthi /* Type of incoming input 225b9dda1b2SSrikanth Yalavarthi * 1 = INT8, 2 = UINT8, 3 = INT16, 4 = UINT16, 226b9dda1b2SSrikanth Yalavarthi * 5 = INT32, 6 = UINT32, 7 = FP16, 8 = FP32 227b9dda1b2SSrikanth Yalavarthi */ 228b9dda1b2SSrikanth Yalavarthi uint8_t input_type; 229b9dda1b2SSrikanth Yalavarthi 230b9dda1b2SSrikanth Yalavarthi /* Type of input required by model 231b9dda1b2SSrikanth Yalavarthi * 1 = INT8, 2 = UINT8, 3 = INT16, 4 = UINT16, 232b9dda1b2SSrikanth Yalavarthi * 5 = INT32, 6 = UINT32, 7 = FP16, 8 = FP32 233b9dda1b2SSrikanth Yalavarthi */ 234b9dda1b2SSrikanth Yalavarthi uint8_t model_input_type; 235b9dda1b2SSrikanth Yalavarthi 236b9dda1b2SSrikanth Yalavarthi /* float_32 qscale value 237b9dda1b2SSrikanth Yalavarthi * quantized = non-quantized * qscale 238b9dda1b2SSrikanth Yalavarthi */ 239b9dda1b2SSrikanth Yalavarthi float qscale; 240b9dda1b2SSrikanth Yalavarthi 241b9dda1b2SSrikanth Yalavarthi /* Input shape */ 242b9dda1b2SSrikanth Yalavarthi struct { 243b9dda1b2SSrikanth Yalavarthi /* Input format 244b9dda1b2SSrikanth Yalavarthi * 1 = NCHW 245b9dda1b2SSrikanth Yalavarthi * 2 = NHWC 246b9dda1b2SSrikanth Yalavarthi */ 247b9dda1b2SSrikanth Yalavarthi uint8_t format; 248b9dda1b2SSrikanth Yalavarthi uint8_t reserved[3]; 249b9dda1b2SSrikanth Yalavarthi uint32_t w; 250b9dda1b2SSrikanth Yalavarthi uint32_t x; 251b9dda1b2SSrikanth Yalavarthi uint32_t y; 252b9dda1b2SSrikanth Yalavarthi uint32_t z; 253b9dda1b2SSrikanth Yalavarthi } shape; 254b9dda1b2SSrikanth Yalavarthi uint8_t reserved[4]; 255b9dda1b2SSrikanth Yalavarthi 256b9dda1b2SSrikanth Yalavarthi /* Name of input */ 257b9dda1b2SSrikanth Yalavarthi uint8_t input_name[MRVL_ML_INPUT_NAME_LEN]; 258b9dda1b2SSrikanth Yalavarthi 259b9dda1b2SSrikanth Yalavarthi /* DDR range end 260b9dda1b2SSrikanth Yalavarthi * new = mem_offset + size_bytes - 1 261b9dda1b2SSrikanth Yalavarthi */ 262b9dda1b2SSrikanth Yalavarthi uint64_t ddr_range_end; 263faf1344eSSrikanth Yalavarthi }; 264b9dda1b2SSrikanth Yalavarthi 265faf1344eSSrikanth Yalavarthi /* Output section (64-byte per output) */ 266faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_output_section { 267b9dda1b2SSrikanth Yalavarthi /* DDR offset in OCM absolute addresses for output */ 268b9dda1b2SSrikanth Yalavarthi uint64_t mem_offset; 269b9dda1b2SSrikanth Yalavarthi 270b9dda1b2SSrikanth Yalavarthi /* Relocatable flag 271b9dda1b2SSrikanth Yalavarthi * 1 = Relocatable 272b9dda1b2SSrikanth Yalavarthi * 2 = Not relocatable 273b9dda1b2SSrikanth Yalavarthi */ 274b9dda1b2SSrikanth Yalavarthi uint8_t relocatable; 275b9dda1b2SSrikanth Yalavarthi 276b9dda1b2SSrikanth Yalavarthi /* Output dequantization 277b9dda1b2SSrikanth Yalavarthi * 1 = De-quantization required 278b9dda1b2SSrikanth Yalavarthi * 2 = De-quantization not required 279b9dda1b2SSrikanth Yalavarthi */ 280b9dda1b2SSrikanth Yalavarthi uint8_t dequantize; 281b9dda1b2SSrikanth Yalavarthi 282b9dda1b2SSrikanth Yalavarthi /* Type of outgoing output 283b9dda1b2SSrikanth Yalavarthi * 1 = INT8, 2 = UINT8, 3 = INT16, 4 = UINT16 284b9dda1b2SSrikanth Yalavarthi * 5 = INT32, 6 = UINT32, 7 = FP16, 8 = FP32 285b9dda1b2SSrikanth Yalavarthi */ 286b9dda1b2SSrikanth Yalavarthi uint8_t output_type; 287b9dda1b2SSrikanth Yalavarthi 288b9dda1b2SSrikanth Yalavarthi /* Type of output produced by model 289b9dda1b2SSrikanth Yalavarthi * 1 = INT8, 2 = UINT8, 3 = INT16, 4 = UINT16 290b9dda1b2SSrikanth Yalavarthi * 5 = INT32, 6 = UINT32, 7 = FP16, 8 = FP32 291b9dda1b2SSrikanth Yalavarthi */ 292b9dda1b2SSrikanth Yalavarthi uint8_t model_output_type; 293b9dda1b2SSrikanth Yalavarthi 294b9dda1b2SSrikanth Yalavarthi /* float_32 dscale value 295b9dda1b2SSrikanth Yalavarthi * dequantized = quantized * dscale 296b9dda1b2SSrikanth Yalavarthi */ 297b9dda1b2SSrikanth Yalavarthi float dscale; 298b9dda1b2SSrikanth Yalavarthi 299b9dda1b2SSrikanth Yalavarthi /* Number of items in the output */ 300b9dda1b2SSrikanth Yalavarthi uint32_t size; 301b9dda1b2SSrikanth Yalavarthi uint8_t reserved[20]; 302b9dda1b2SSrikanth Yalavarthi 303b9dda1b2SSrikanth Yalavarthi /* DDR range end 304b9dda1b2SSrikanth Yalavarthi * new = mem_offset + size_bytes - 1 305b9dda1b2SSrikanth Yalavarthi */ 306b9dda1b2SSrikanth Yalavarthi uint64_t ddr_range_end; 307b9dda1b2SSrikanth Yalavarthi uint8_t output_name[MRVL_ML_OUTPUT_NAME_LEN]; 308faf1344eSSrikanth Yalavarthi }; 309b9dda1b2SSrikanth Yalavarthi 310b9dda1b2SSrikanth Yalavarthi /* Model data */ 311faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_data_section { 312c699a013SSrikanth Yalavarthi uint8_t reserved[996]; 313b9dda1b2SSrikanth Yalavarthi 314b9dda1b2SSrikanth Yalavarthi /* Beta: xx.xx.xx.xx, 315b9dda1b2SSrikanth Yalavarthi * Later: YYYYMM.xx.xx 316b9dda1b2SSrikanth Yalavarthi */ 317b9dda1b2SSrikanth Yalavarthi uint8_t compiler_version[8]; 318b9dda1b2SSrikanth Yalavarthi 319b9dda1b2SSrikanth Yalavarthi /* M1K CDK version (xx.xx.xx.xx) */ 320b9dda1b2SSrikanth Yalavarthi uint8_t m1k_cdk_version[4]; 321faf1344eSSrikanth Yalavarthi }; 322faf1344eSSrikanth Yalavarthi 323faf1344eSSrikanth Yalavarthi /* Model file metadata structure */ 324faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata { 325faf1344eSSrikanth Yalavarthi /* Header (256-byte) */ 326faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_header header; 327faf1344eSSrikanth Yalavarthi 328faf1344eSSrikanth Yalavarthi /* Model information (256-byte) */ 329faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_model model; 330faf1344eSSrikanth Yalavarthi 331faf1344eSSrikanth Yalavarthi /* Init section (64-byte) */ 332faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_init_section init_model; 333faf1344eSSrikanth Yalavarthi 334faf1344eSSrikanth Yalavarthi /* Main section (64-byte) */ 335faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_main_section main_model; 336faf1344eSSrikanth Yalavarthi 337faf1344eSSrikanth Yalavarthi /* Finish section (64-byte) */ 338faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_finish_section finish_model; 339faf1344eSSrikanth Yalavarthi 340faf1344eSSrikanth Yalavarthi uint8_t reserved_1[512]; /* End of 2k bytes */ 341faf1344eSSrikanth Yalavarthi 342faf1344eSSrikanth Yalavarthi /* Weights and Bias (64-byte) */ 343faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_weights_bias_section weights_bias; 344faf1344eSSrikanth Yalavarthi 345faf1344eSSrikanth Yalavarthi /* Input (512-bytes, 64-byte per input) provisioned for 8 inputs */ 346c699a013SSrikanth Yalavarthi struct cn10k_ml_model_metadata_input_section input1[MRVL_ML_NUM_INPUT_OUTPUT_1]; 347faf1344eSSrikanth Yalavarthi 348faf1344eSSrikanth Yalavarthi /* Output (512-bytes, 64-byte per output) provisioned for 8 outputs */ 349c699a013SSrikanth Yalavarthi struct cn10k_ml_model_metadata_output_section output1[MRVL_ML_NUM_INPUT_OUTPUT_1]; 350faf1344eSSrikanth Yalavarthi 351faf1344eSSrikanth Yalavarthi uint8_t reserved_2[1792]; 352faf1344eSSrikanth Yalavarthi 353c699a013SSrikanth Yalavarthi /* Input (1536-bytes, 64-byte per input) provisioned for 24 inputs */ 354c699a013SSrikanth Yalavarthi struct cn10k_ml_model_metadata_input_section input2[MRVL_ML_NUM_INPUT_OUTPUT_2]; 355c699a013SSrikanth Yalavarthi 356c699a013SSrikanth Yalavarthi /* Output (1536-bytes, 64-byte per output) provisioned for 24 outputs */ 357c699a013SSrikanth Yalavarthi struct cn10k_ml_model_metadata_output_section output2[MRVL_ML_NUM_INPUT_OUTPUT_2]; 358c699a013SSrikanth Yalavarthi 359faf1344eSSrikanth Yalavarthi /* Model data */ 360faf1344eSSrikanth Yalavarthi struct cn10k_ml_model_metadata_data_section data; 361b9dda1b2SSrikanth Yalavarthi 362b9dda1b2SSrikanth Yalavarthi /* Hidden 16 bytes of magic code */ 363faf1344eSSrikanth Yalavarthi uint8_t reserved_3[16]; 364b9dda1b2SSrikanth Yalavarthi }; 365b9dda1b2SSrikanth Yalavarthi 366298b2af4SSrikanth Yalavarthi /* Model address structure */ 36754362031SSrikanth Yalavarthi struct cn10k_ml_layer_addr { 368298b2af4SSrikanth Yalavarthi /* Base DMA address for load */ 369298b2af4SSrikanth Yalavarthi void *base_dma_addr_load; 370298b2af4SSrikanth Yalavarthi 371298b2af4SSrikanth Yalavarthi /* Init section load address */ 372298b2af4SSrikanth Yalavarthi void *init_load_addr; 373298b2af4SSrikanth Yalavarthi 374298b2af4SSrikanth Yalavarthi /* Main section load address */ 375298b2af4SSrikanth Yalavarthi void *main_load_addr; 376298b2af4SSrikanth Yalavarthi 377298b2af4SSrikanth Yalavarthi /* Finish section load address */ 378298b2af4SSrikanth Yalavarthi void *finish_load_addr; 379298b2af4SSrikanth Yalavarthi 380298b2af4SSrikanth Yalavarthi /* Weights and Bias base address */ 381298b2af4SSrikanth Yalavarthi void *wb_base_addr; 382298b2af4SSrikanth Yalavarthi 383298b2af4SSrikanth Yalavarthi /* Weights and bias load address */ 384298b2af4SSrikanth Yalavarthi void *wb_load_addr; 385298b2af4SSrikanth Yalavarthi 386daee4eaaSSrikanth Yalavarthi /* Scratch base address */ 387daee4eaaSSrikanth Yalavarthi void *scratch_base_addr; 388daee4eaaSSrikanth Yalavarthi 389298b2af4SSrikanth Yalavarthi /* Start tile */ 390298b2af4SSrikanth Yalavarthi uint8_t tile_start; 391298b2af4SSrikanth Yalavarthi 392298b2af4SSrikanth Yalavarthi /* End tile */ 393298b2af4SSrikanth Yalavarthi uint8_t tile_end; 394298b2af4SSrikanth Yalavarthi }; 395298b2af4SSrikanth Yalavarthi 3964ff4ab8eSSrikanth Yalavarthi /* Model fast-path stats */ 3970e6a598bSSrikanth Yalavarthi struct cn10k_ml_layer_xstats { 3984ff4ab8eSSrikanth Yalavarthi /* Total hardware latency, sum of all inferences */ 3994ff4ab8eSSrikanth Yalavarthi uint64_t hw_latency_tot; 4004ff4ab8eSSrikanth Yalavarthi 4014ff4ab8eSSrikanth Yalavarthi /* Minimum hardware latency */ 4024ff4ab8eSSrikanth Yalavarthi uint64_t hw_latency_min; 4034ff4ab8eSSrikanth Yalavarthi 4044ff4ab8eSSrikanth Yalavarthi /* Maximum hardware latency */ 4054ff4ab8eSSrikanth Yalavarthi uint64_t hw_latency_max; 4064ff4ab8eSSrikanth Yalavarthi 4074ff4ab8eSSrikanth Yalavarthi /* Total firmware latency, sum of all inferences */ 4084ff4ab8eSSrikanth Yalavarthi uint64_t fw_latency_tot; 4094ff4ab8eSSrikanth Yalavarthi 4104ff4ab8eSSrikanth Yalavarthi /* Minimum firmware latency */ 4114ff4ab8eSSrikanth Yalavarthi uint64_t fw_latency_min; 4124ff4ab8eSSrikanth Yalavarthi 4134ff4ab8eSSrikanth Yalavarthi /* Maximum firmware latency */ 4144ff4ab8eSSrikanth Yalavarthi uint64_t fw_latency_max; 4154ff4ab8eSSrikanth Yalavarthi 4164ff4ab8eSSrikanth Yalavarthi /* Total jobs dequeued */ 4174ff4ab8eSSrikanth Yalavarthi uint64_t dequeued_count; 4184ff4ab8eSSrikanth Yalavarthi 4194ff4ab8eSSrikanth Yalavarthi /* Hardware stats reset index */ 4204ff4ab8eSSrikanth Yalavarthi uint64_t hw_reset_count; 4214ff4ab8eSSrikanth Yalavarthi 4224ff4ab8eSSrikanth Yalavarthi /* Firmware stats reset index */ 4234ff4ab8eSSrikanth Yalavarthi uint64_t fw_reset_count; 4244ff4ab8eSSrikanth Yalavarthi }; 4254ff4ab8eSSrikanth Yalavarthi 42654362031SSrikanth Yalavarthi struct cn10k_ml_layer_data { 42754362031SSrikanth Yalavarthi /* Model / Layer: metadata */ 428b9dda1b2SSrikanth Yalavarthi struct cn10k_ml_model_metadata metadata; 429b9dda1b2SSrikanth Yalavarthi 43054362031SSrikanth Yalavarthi /* Layer: address structure */ 43154362031SSrikanth Yalavarthi struct cn10k_ml_layer_addr addr; 432298b2af4SSrikanth Yalavarthi 43354362031SSrikanth Yalavarthi /* Layer: Tile and memory information object */ 43454362031SSrikanth Yalavarthi struct cn10k_ml_ocm_layer_map ocm_map; 435699b7b81SSrikanth Yalavarthi 43654362031SSrikanth Yalavarthi /* Layer: Slow-path operations request pointer */ 4376e402621SSrikanth Yalavarthi struct cnxk_ml_req *req; 4384ff4ab8eSSrikanth Yalavarthi 43954362031SSrikanth Yalavarthi /* Layer: Stats for burst ops */ 4400e6a598bSSrikanth Yalavarthi struct cn10k_ml_layer_xstats *burst_xstats; 4414ff4ab8eSSrikanth Yalavarthi 44254362031SSrikanth Yalavarthi /* Layer: Stats for sync ops */ 4430e6a598bSSrikanth Yalavarthi struct cn10k_ml_layer_xstats *sync_xstats; 44454362031SSrikanth Yalavarthi }; 44554362031SSrikanth Yalavarthi 44654362031SSrikanth Yalavarthi struct cn10k_ml_model_data { 44754362031SSrikanth Yalavarthi /* Model / Layer: metadata */ 44854362031SSrikanth Yalavarthi struct cn10k_ml_model_metadata metadata; 4493523988fSSrikanth Yalavarthi }; 4503523988fSSrikanth Yalavarthi 451b9dda1b2SSrikanth Yalavarthi int cn10k_ml_model_metadata_check(uint8_t *buffer, uint64_t size); 452b9dda1b2SSrikanth Yalavarthi void cn10k_ml_model_metadata_update(struct cn10k_ml_model_metadata *metadata); 45354362031SSrikanth Yalavarthi void cn10k_ml_layer_addr_update(struct cnxk_ml_layer *layer, uint8_t *buffer, 454298b2af4SSrikanth Yalavarthi uint8_t *base_dma_addr); 455cc254869SSrikanth Yalavarthi void cn10k_ml_layer_io_info_set(struct cnxk_ml_io_info *io_info, 456cc254869SSrikanth Yalavarthi struct cn10k_ml_model_metadata *metadata); 457cc254869SSrikanth Yalavarthi struct cnxk_ml_io_info *cn10k_ml_model_io_info_get(struct cnxk_ml_model *model, uint16_t layer_id); 458cc254869SSrikanth Yalavarthi int cn10k_ml_model_ocm_pages_count(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, 4594af704caSSrikanth Yalavarthi uint8_t *buffer, uint16_t *wb_pages, uint16_t *scratch_pages); 460cc254869SSrikanth Yalavarthi void cn10k_ml_model_info_set(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_model *model, 461cc254869SSrikanth Yalavarthi struct cnxk_ml_io_info *io_info, 462cc254869SSrikanth Yalavarthi struct cn10k_ml_model_metadata *metadata); 4637e9975c8SSrikanth Yalavarthi void cn10k_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, FILE *fp); 464*8e4dd45cSSrikanth Yalavarthi int cn10k_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, 465*8e4dd45cSSrikanth Yalavarthi uint16_t *layer_id); 466b9dda1b2SSrikanth Yalavarthi 4673523988fSSrikanth Yalavarthi #endif /* _CN10K_ML_MODEL_H_ */ 468