Branch data Line data Source code
1 : : /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 : : * 3 : : * Copyright 2017-2021, 2023-2024 NXP 4 : : * 5 : : */ 6 : : #include <fsl_mc_sys.h> 7 : : #include <fsl_mc_cmd.h> 8 : : #include <fsl_dpkg.h> 9 : : #include <string.h> 10 : : 11 : : /** 12 : : * dpkg_prepare_key_cfg() - function prepare extract parameters 13 : : * @cfg: defining a full Key Generation profile (rule) 14 : : * @key_cfg_buf: Zeroed memory whose size is sizeo of 15 : : * "struct dpni_ext_set_rx_tc_dist" before mapping it to DMA 16 : : * 17 : : * This function has to be called before the following functions: 18 : : * - dpni_set_rx_tc_dist() 19 : : * - dpni_set_qos_table() 20 : : * - dpkg_prepare_key_cfg() 21 : : */ 22 : : int 23 : 0 : dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, uint8_t *key_cfg_buf) 24 : : { 25 : : int i, j; 26 : : struct dpni_ext_set_rx_tc_dist *dpni_ext; 27 : : struct dpni_dist_extract *extr; 28 : : 29 [ # # ]: 0 : if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS) 30 : : return -EINVAL; 31 : : 32 : : dpni_ext = (struct dpni_ext_set_rx_tc_dist *)key_cfg_buf; 33 : 0 : dpni_ext->num_extracts = cfg->num_extracts; 34 : : 35 [ # # ]: 0 : for (i = 0; i < cfg->num_extracts; i++) { 36 [ # # # # ]: 0 : extr = &dpni_ext->extracts[i]; 37 : : memset(extr, 0, sizeof(struct dpni_dist_extract)); 38 : : 39 [ # # # # ]: 0 : switch (cfg->extracts[i].type) { 40 : 0 : case DPKG_EXTRACT_FROM_HDR: 41 : 0 : extr->prot = cfg->extracts[i].extract.from_hdr.prot; 42 : 0 : dpkg_set_field(extr->efh_type, EFH_TYPE, 43 : : cfg->extracts[i].extract.from_hdr.type); 44 : 0 : extr->size = cfg->extracts[i].extract.from_hdr.size; 45 : 0 : extr->offset = cfg->extracts[i].extract.from_hdr.offset; 46 : 0 : extr->field = cpu_to_le32( 47 : : cfg->extracts[i].extract.from_hdr.field); 48 : 0 : extr->hdr_index = 49 : 0 : cfg->extracts[i].extract.from_hdr.hdr_index; 50 : 0 : break; 51 : 0 : case DPKG_EXTRACT_FROM_DATA: 52 : 0 : extr->size = cfg->extracts[i].extract.from_data.size; 53 : 0 : extr->offset = 54 : 0 : cfg->extracts[i].extract.from_data.offset; 55 : 0 : break; 56 : 0 : case DPKG_EXTRACT_FROM_PARSE: 57 : 0 : extr->size = cfg->extracts[i].extract.from_parse.size; 58 : 0 : extr->offset = 59 : 0 : cfg->extracts[i].extract.from_parse.offset; 60 : 0 : break; 61 : : default: 62 : : return -EINVAL; 63 : : } 64 : : 65 : 0 : extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks; 66 : 0 : dpkg_set_field(extr->extract_type, EXTRACT_TYPE, 67 : : cfg->extracts[i].type); 68 : : 69 [ # # ]: 0 : for (j = 0; j < DPKG_NUM_OF_MASKS; j++) { 70 : 0 : extr->masks[j].mask = cfg->extracts[i].masks[j].mask; 71 : 0 : extr->masks[j].offset = 72 : 0 : cfg->extracts[i].masks[j].offset; 73 : : } 74 : : } 75 : : 76 : : return 0; 77 : : }