xref: /dpdk/drivers/ml/cnxk/cn10k_ml_model.h (revision 8e4dd45c1c1de22225a4660eefd03c4ca593043b)
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