Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2001-2023 Intel Corporation 3 : : */ 4 : : 5 : : #include <base/idpf_controlq.h> 6 : : #include <stdint.h> 7 : : #include "cpfl_rules.h" 8 : : 9 : : /** 10 : : * cpfl_prep_rule_desc_common_ctx - get bit common context for descriptor 11 : : */ 12 : : static inline uint64_t 13 : 0 : cpfl_prep_rule_desc_common_ctx(struct cpfl_rule_cfg_data_common *cmn_cfg) 14 : : { 15 : : uint64_t context = 0; 16 : : 17 [ # # # ]: 0 : switch (cmn_cfg->opc) { 18 : 0 : case cpfl_ctlq_mod_query_rule: 19 : : case cpfl_ctlq_mod_add_update_rule: 20 : : /* fallthrough */ 21 : : case cpfl_ctlq_lem_del_rule: 22 : : case cpfl_ctlq_lem_query_rule: 23 : : case cpfl_ctlq_lem_add_update_rule: 24 : : case cpfl_ctlq_lem_query_rule_hash_addr: 25 : : case cpfl_ctlq_lem_query_del_rule_hash_addr: 26 : 0 : context |= SHIFT_VAL64(cmn_cfg->vsi_id, 27 : : MEV_RULE_VSI_ID); 28 : : /* fallthrough */ 29 : 0 : case cpfl_ctlq_sem_query_rule_hash_addr: 30 : : case cpfl_ctlq_sem_query_del_rule_hash_addr: 31 : : case cpfl_ctlq_sem_add_rule: 32 : : case cpfl_ctlq_sem_del_rule: 33 : : case cpfl_ctlq_sem_query_rule: 34 : : case cpfl_ctlq_sem_update_rule: 35 : 0 : context |= SHIFT_VAL64(cmn_cfg->time_sel, 36 : : MEV_RULE_TIME_SEL); 37 : 0 : context |= SHIFT_VAL64(cmn_cfg->time_sel_val, 38 : : MEV_RULE_TIME_SEL_VAL); 39 : 0 : context |= SHIFT_VAL64(cmn_cfg->host_id, 40 : : MEV_RULE_HOST_ID); 41 : 0 : context |= SHIFT_VAL64(cmn_cfg->port_num, 42 : : MEV_RULE_PORT_NUM); 43 : 0 : context |= SHIFT_VAL64(cmn_cfg->resp_req, 44 : : MEV_RULE_RESP_REQ); 45 : 0 : context |= SHIFT_VAL64(cmn_cfg->cache_wr_thru, 46 : : MEV_RULE_CACHE_WR_THRU); 47 : 0 : break; 48 : : default: 49 : : break; 50 : : } 51 : : 52 : 0 : return context; 53 : : } 54 : : 55 : : /** 56 : : * cpfl_prep_rule_desc_ctx - get bit context for descriptor 57 : : */ 58 : : static inline uint64_t 59 : 0 : cpfl_prep_rule_desc_ctx(struct cpfl_rule_cfg_data *cfg_data) 60 : : { 61 : : uint64_t context = 0; 62 : : 63 : 0 : context |= cpfl_prep_rule_desc_common_ctx(&cfg_data->common); 64 : : 65 [ # # # ]: 0 : switch (cfg_data->common.opc) { 66 : 0 : case cpfl_ctlq_mod_query_rule: 67 : : case cpfl_ctlq_mod_add_update_rule: 68 : 0 : context |= SHIFT_VAL64(cfg_data->ext.mod_content.obj_size, 69 : : MEV_RULE_MOD_OBJ_SIZE); 70 : 0 : context |= SHIFT_VAL64(cfg_data->ext.mod_content.pin_content, 71 : : MEV_RULE_PIN_MOD_CONTENT); 72 : 0 : context |= SHIFT_VAL64(cfg_data->ext.mod_content.index, 73 : : MEV_RULE_MOD_INDEX); 74 : 0 : break; 75 : 0 : case cpfl_ctlq_sem_query_rule_hash_addr: 76 : : case cpfl_ctlq_sem_query_del_rule_hash_addr: 77 : : case cpfl_ctlq_lem_query_rule_hash_addr: 78 : : case cpfl_ctlq_lem_query_del_rule_hash_addr: 79 : 0 : context |= SHIFT_VAL64(cfg_data->ext.query_del_addr.obj_id, 80 : : MEV_RULE_OBJ_ID); 81 : 0 : context |= SHIFT_VAL64(cfg_data->ext.query_del_addr.obj_addr, 82 : : MEV_RULE_OBJ_ADDR); 83 : 0 : break; 84 : : default: 85 : : break; 86 : : } 87 : : 88 : 0 : return context; 89 : : } 90 : : 91 : : /** 92 : : * cpfl_prep_rule_desc - build descriptor data from rule config data 93 : : * 94 : : * note: call this function before sending rule to HW via fast path 95 : : */ 96 : : void 97 : 0 : cpfl_prep_rule_desc(struct cpfl_rule_cfg_data *cfg_data, 98 : : struct idpf_ctlq_msg *ctlq_msg) 99 : : { 100 : : uint64_t context; 101 : : uint64_t *ctlq_ctx = (uint64_t *)&ctlq_msg->ctx.indirect.context[0]; 102 : : 103 : 0 : context = cpfl_prep_rule_desc_ctx(cfg_data); 104 : 0 : *ctlq_ctx = CPU_TO_LE64(context); 105 : 0 : memcpy(&ctlq_msg->cookie, &cfg_data->common.cookie, sizeof(uint64_t)); 106 : 0 : ctlq_msg->opcode = (uint16_t)cfg_data->common.opc; 107 : 0 : ctlq_msg->data_len = cfg_data->common.buf_len; 108 : 0 : ctlq_msg->status = 0; 109 : 0 : ctlq_msg->ctx.indirect.payload = cfg_data->common.payload; 110 : 0 : } 111 : : 112 : : /** 113 : : * cpfl_prep_sem_rule_blob - build SEM rule blob data from rule entry info 114 : : * note: call this function before sending rule to HW via fast path 115 : : */ 116 : : void 117 : 0 : cpfl_prep_sem_rule_blob(const uint8_t *key, 118 : : uint8_t key_byte_len, 119 : : const uint8_t *act_bytes, 120 : : uint8_t act_byte_len, 121 : : uint16_t cfg_ctrl, 122 : : union cpfl_rule_cfg_pkt_record *rule_blob) 123 : : { 124 : 0 : uint32_t *act_dst = (uint32_t *)&rule_blob->sem_rule.actions; 125 : : const uint32_t *act_src = (const uint32_t *)act_bytes; 126 : : uint32_t i; 127 : : 128 : : idpf_memset(rule_blob, 0, sizeof(*rule_blob), IDPF_DMA_MEM); 129 : 0 : memcpy(rule_blob->sem_rule.key, key, key_byte_len); 130 : : 131 [ # # ]: 0 : for (i = 0; i < act_byte_len / sizeof(uint32_t); i++) 132 : 0 : *act_dst++ = CPU_TO_LE32(*act_src++); 133 : : 134 : 0 : rule_blob->sem_rule.cfg_ctrl[0] = cfg_ctrl & 0xFF; 135 : 0 : rule_blob->sem_rule.cfg_ctrl[1] = (cfg_ctrl >> 8) & 0xFF; 136 : 0 : } 137 : : 138 : : /** 139 : : * cpfl_prep_lem_rule_blob - build LEM rule blob data from rule entry info 140 : : * note: call this function before sending rule to HW via fast path 141 : : */ 142 : : void 143 : 0 : cpfl_prep_lem_rule_blob(uint8_t *key, 144 : : uint8_t key_byte_len, 145 : : uint8_t *act_bytes, 146 : : uint8_t act_byte_len, 147 : : uint16_t cfg_ctrl, 148 : : union cpfl_rule_cfg_pkt_record *rule_blob) 149 : : { 150 : 0 : uint32_t *act_dst = (uint32_t *)&rule_blob->lem_rule.actions; 151 : : uint32_t *act_src = (uint32_t *)act_bytes; 152 : : uint32_t i; 153 : : 154 : : idpf_memset(rule_blob, 0, sizeof(*rule_blob), IDPF_DMA_MEM); 155 : 0 : memcpy(rule_blob->lem_rule.key, key, key_byte_len); 156 : : 157 [ # # ]: 0 : for (i = 0; i < act_byte_len / sizeof(uint32_t); i++) 158 : 0 : *act_dst++ = CPU_TO_LE32(*act_src++); 159 : : 160 : 0 : rule_blob->lem_rule.cfg_ctrl[0] = cfg_ctrl & 0xFF; 161 : 0 : rule_blob->lem_rule.cfg_ctrl[1] = (cfg_ctrl >> 8) & 0xFF; 162 : 0 : }