xref: /dpdk/drivers/net/dpaa2/mc/dpkg.c (revision 591200ef6f32b56adc367ebe3647cc3dbe9362db)
1131a75b6SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
216bbc98aSShreyansh Jain  *
3*591200efSGagandeep Singh  * Copyright 2017-2021, 2023 NXP
416bbc98aSShreyansh Jain  *
516bbc98aSShreyansh Jain  */
616bbc98aSShreyansh Jain #include <fsl_mc_sys.h>
716bbc98aSShreyansh Jain #include <fsl_mc_cmd.h>
816bbc98aSShreyansh Jain #include <fsl_dpkg.h>
9*591200efSGagandeep Singh #include <string.h>
1016bbc98aSShreyansh Jain 
1116bbc98aSShreyansh Jain /**
1216bbc98aSShreyansh Jain  * dpkg_prepare_key_cfg() - function prepare extract parameters
1316bbc98aSShreyansh Jain  * @cfg: defining a full Key Generation profile (rule)
14*591200efSGagandeep Singh  * @key_cfg_buf: Zeroed memory whose size is sizeo of
15*591200efSGagandeep Singh  *		"struct dpni_ext_set_rx_tc_dist" before mapping it to DMA
1616bbc98aSShreyansh Jain  *
1716bbc98aSShreyansh Jain  * This function has to be called before the following functions:
1816bbc98aSShreyansh Jain  *	- dpni_set_rx_tc_dist()
1916bbc98aSShreyansh Jain  *	- dpni_set_qos_table()
2016bbc98aSShreyansh Jain  *	- dpkg_prepare_key_cfg()
2116bbc98aSShreyansh Jain  */
2216bbc98aSShreyansh Jain int
23*591200efSGagandeep Singh dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
24*591200efSGagandeep Singh 	void *key_cfg_buf)
2516bbc98aSShreyansh Jain {
2616bbc98aSShreyansh Jain 	int i, j;
2716bbc98aSShreyansh Jain 	struct dpni_ext_set_rx_tc_dist *dpni_ext;
2816bbc98aSShreyansh Jain 	struct dpni_dist_extract *extr;
2916bbc98aSShreyansh Jain 
3016bbc98aSShreyansh Jain 	if (cfg->num_extracts > DPKG_MAX_NUM_OF_EXTRACTS)
3116bbc98aSShreyansh Jain 		return -EINVAL;
3216bbc98aSShreyansh Jain 
33*591200efSGagandeep Singh 	dpni_ext = key_cfg_buf;
3416bbc98aSShreyansh Jain 	dpni_ext->num_extracts = cfg->num_extracts;
3516bbc98aSShreyansh Jain 
3616bbc98aSShreyansh Jain 	for (i = 0; i < cfg->num_extracts; i++) {
3716bbc98aSShreyansh Jain 		extr = &dpni_ext->extracts[i];
38*591200efSGagandeep Singh 		memset(extr, 0, sizeof(struct dpni_dist_extract));
3916bbc98aSShreyansh Jain 
4016bbc98aSShreyansh Jain 		switch (cfg->extracts[i].type) {
4116bbc98aSShreyansh Jain 		case DPKG_EXTRACT_FROM_HDR:
4216bbc98aSShreyansh Jain 			extr->prot = cfg->extracts[i].extract.from_hdr.prot;
4316bbc98aSShreyansh Jain 			dpkg_set_field(extr->efh_type, EFH_TYPE,
4416bbc98aSShreyansh Jain 				       cfg->extracts[i].extract.from_hdr.type);
4516bbc98aSShreyansh Jain 			extr->size = cfg->extracts[i].extract.from_hdr.size;
4616bbc98aSShreyansh Jain 			extr->offset = cfg->extracts[i].extract.from_hdr.offset;
4716bbc98aSShreyansh Jain 			extr->field = cpu_to_le32(
4816bbc98aSShreyansh Jain 				cfg->extracts[i].extract.from_hdr.field);
4916bbc98aSShreyansh Jain 			extr->hdr_index =
5016bbc98aSShreyansh Jain 				cfg->extracts[i].extract.from_hdr.hdr_index;
5116bbc98aSShreyansh Jain 			break;
5216bbc98aSShreyansh Jain 		case DPKG_EXTRACT_FROM_DATA:
5316bbc98aSShreyansh Jain 			extr->size = cfg->extracts[i].extract.from_data.size;
5416bbc98aSShreyansh Jain 			extr->offset =
5516bbc98aSShreyansh Jain 				cfg->extracts[i].extract.from_data.offset;
5616bbc98aSShreyansh Jain 			break;
5716bbc98aSShreyansh Jain 		case DPKG_EXTRACT_FROM_PARSE:
5816bbc98aSShreyansh Jain 			extr->size = cfg->extracts[i].extract.from_parse.size;
5916bbc98aSShreyansh Jain 			extr->offset =
6016bbc98aSShreyansh Jain 				cfg->extracts[i].extract.from_parse.offset;
6116bbc98aSShreyansh Jain 			break;
6216bbc98aSShreyansh Jain 		default:
6316bbc98aSShreyansh Jain 			return -EINVAL;
6416bbc98aSShreyansh Jain 		}
6516bbc98aSShreyansh Jain 
6616bbc98aSShreyansh Jain 		extr->num_of_byte_masks = cfg->extracts[i].num_of_byte_masks;
6716bbc98aSShreyansh Jain 		dpkg_set_field(extr->extract_type, EXTRACT_TYPE,
6816bbc98aSShreyansh Jain 			       cfg->extracts[i].type);
6916bbc98aSShreyansh Jain 
70f48cd6c6SNipun Gupta 		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
7116bbc98aSShreyansh Jain 			extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
7216bbc98aSShreyansh Jain 			extr->masks[j].offset =
7316bbc98aSShreyansh Jain 				cfg->extracts[i].masks[j].offset;
7416bbc98aSShreyansh Jain 		}
7516bbc98aSShreyansh Jain 	}
7616bbc98aSShreyansh Jain 
7716bbc98aSShreyansh Jain 	return 0;
7816bbc98aSShreyansh Jain }
79