1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 * 3 * Copyright 2017-2021, 2023 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 dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, 24 void *key_cfg_buf) 25 { 26 int i, j; 27 struct dpni_ext_set_rx_tc_dist *dpni_ext; 28 struct dpni_dist_extract *extr; 29 30 if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS) 31 return -EINVAL; 32 33 dpni_ext = key_cfg_buf; 34 dpni_ext->num_extracts = cfg->num_extracts; 35 36 for (i = 0; i < cfg->num_extracts; i++) { 37 extr = &dpni_ext->extracts[i]; 38 memset(extr, 0, sizeof(struct dpni_dist_extract)); 39 40 switch (cfg->extracts[i].type) { 41 case DPKG_EXTRACT_FROM_HDR: 42 extr->prot = cfg->extracts[i].extract.from_hdr.prot; 43 dpkg_set_field(extr->efh_type, EFH_TYPE, 44 cfg->extracts[i].extract.from_hdr.type); 45 extr->size = cfg->extracts[i].extract.from_hdr.size; 46 extr->offset = cfg->extracts[i].extract.from_hdr.offset; 47 extr->field = cpu_to_le32( 48 cfg->extracts[i].extract.from_hdr.field); 49 extr->hdr_index = 50 cfg->extracts[i].extract.from_hdr.hdr_index; 51 break; 52 case DPKG_EXTRACT_FROM_DATA: 53 extr->size = cfg->extracts[i].extract.from_data.size; 54 extr->offset = 55 cfg->extracts[i].extract.from_data.offset; 56 break; 57 case DPKG_EXTRACT_FROM_PARSE: 58 extr->size = cfg->extracts[i].extract.from_parse.size; 59 extr->offset = 60 cfg->extracts[i].extract.from_parse.offset; 61 break; 62 default: 63 return -EINVAL; 64 } 65 66 extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks; 67 dpkg_set_field(extr->extract_type, EXTRACT_TYPE, 68 cfg->extracts[i].type); 69 70 for (j = 0; j < DPKG_NUM_OF_MASKS; j++) { 71 extr->masks[j].mask = cfg->extracts[i].masks[j].mask; 72 extr->masks[j].offset = 73 cfg->extracts[i].masks[j].offset; 74 } 75 } 76 77 return 0; 78 } 79