mirror of https://github.com/F-Stack/f-stack.git
318 lines
9.5 KiB
C
318 lines
9.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2001-2023 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _CPFL_RULES_API_H_
|
|
#define _CPFL_RULES_API_H_
|
|
|
|
#include <base/idpf_controlq_api.h>
|
|
#include "cpfl_actions.h"
|
|
#include "cpfl_controlq.h"
|
|
|
|
/* Common Bit Mask Macros */
|
|
#define CPFL_BIT(b) (1 << (b))
|
|
|
|
#define MAKE_MASK(type, mask, shift) ((u##type) (mask) << (shift))
|
|
#define SHIFT_VAL_LT(type, val, field) \
|
|
(((u##type)(val) << field##_S) & field##_M)
|
|
#define SHIFT_VAL_RT(type, val, field) \
|
|
(((u##type)(val) & field##_M) >> field##_S)
|
|
|
|
#define MAKE_MASK_VAL(type, bit_len) (((u##type)0x01 << (bit_len)) - 1)
|
|
#define MAKE_MASK_VAL16(bit_len) MAKE_MASK_VAL(16, bit_len)
|
|
#define MAKE_MASK_VAL64(bit_len) MAKE_MASK_VAL(64, bit_len)
|
|
|
|
#define MAKE_MASK64(mask, shift) MAKE_MASK(64, mask, shift)
|
|
#define MAKE_MASK16(mask, shift) MAKE_MASK(16, mask, shift)
|
|
#define MAKE_MASK32(mask, shift) MAKE_MASK(32, mask, shift)
|
|
|
|
/* Make masks with bit length and left-shifting count */
|
|
#define MAKE_SMASK(type, bits, shift) \
|
|
((((u##type)1 << (bits)) - 1) << (shift))
|
|
#define MAKE_SMASK64(bits, shift) MAKE_SMASK(64, bits, shift)
|
|
#define MAKE_SMASK32(bits, shift) MAKE_SMASK(32, bits, shift)
|
|
#define MAKE_SMASK16(bits, shift) MAKE_SMASK(16, bits, shift)
|
|
|
|
#define SHIFT_VAL64(val, field) SHIFT_VAL_LT(64, val, field)
|
|
#define SHIFT_VAL32(val, field) SHIFT_VAL_LT(32, val, field)
|
|
#define SHIFT_VAL16(val, field) SHIFT_VAL_LT(16, val, field)
|
|
|
|
/* Rule Config queue opcodes */
|
|
enum cpfl_ctlq_rule_cfg_opc {
|
|
cpfl_ctlq_sem_add_rule = 0x1303,
|
|
cpfl_ctlq_sem_update_rule = 0x1304,
|
|
cpfl_ctlq_sem_del_rule = 0x1305,
|
|
cpfl_ctlq_sem_query_rule = 0x1306,
|
|
cpfl_ctlq_sem_query_rule_hash_addr = 0x1307,
|
|
cpfl_ctlq_sem_query_del_rule_hash_addr = 0x1308,
|
|
|
|
cpfl_ctlq_mod_add_update_rule = 0x1360,
|
|
cpfl_ctlq_mod_query_rule = 0x1361,
|
|
};
|
|
|
|
enum cpfl_cfg_pkt_error_code {
|
|
CPFL_CFG_PKT_ERR_OK = 0,
|
|
CPFL_CFG_PKT_ERR_ESRCH = 1, /* Bad opcode */
|
|
CPFL_CFG_PKT_ERR_EEXIST = 2, /* Entry Already exists */
|
|
CPFL_CFG_PKT_ERR_ENOSPC = 4, /* No space left in the table*/
|
|
CPFL_CFG_PKT_ERR_ERANGE = 5, /* Parameter out of range */
|
|
CPFL_CFG_PKT_ERR_ESBCOMP = 6, /* Completion Error */
|
|
CPFL_CFG_PKT_ERR_ENOPIN = 7, /* Entry cannot be pinned in cache */
|
|
CPFL_CFG_PKT_ERR_ENOTFND = 8, /* Entry Not exists */
|
|
CPFL_CFG_PKT_ERR_EMAXCOL = 9 /* Max Hash Collision */
|
|
};
|
|
|
|
static const char * const cpfl_cfg_pkt_errormsg[] = {
|
|
[CPFL_CFG_PKT_ERR_ESRCH] = "Bad opcode",
|
|
[CPFL_CFG_PKT_ERR_EEXIST] = "The rule conflicts with already existed one",
|
|
[CPFL_CFG_PKT_ERR_ENOSPC] = "No space left in the table",
|
|
[CPFL_CFG_PKT_ERR_ERANGE] = "Parameter out of range",
|
|
[CPFL_CFG_PKT_ERR_ESBCOMP] = "Completion error",
|
|
[CPFL_CFG_PKT_ERR_ENOPIN] = "Entry cannot be pinned in cache",
|
|
[CPFL_CFG_PKT_ERR_ENOTFND] = "Entry does not exist",
|
|
[CPFL_CFG_PKT_ERR_EMAXCOL] = "Maximum Hash Collisions reached",
|
|
};
|
|
|
|
/* macros for creating context for rule descriptor */
|
|
#define MEV_RULE_VSI_ID_S 0
|
|
#define MEV_RULE_VSI_ID_M \
|
|
MAKE_MASK64(0x7FF, MEV_RULE_VSI_ID_S)
|
|
|
|
#define MEV_RULE_TIME_SEL_S 13
|
|
#define MEV_RULE_TIME_SEL_M \
|
|
MAKE_MASK64(0x3, MEV_RULE_TIME_SEL_S)
|
|
|
|
#define MEV_RULE_TIME_SEL_VAL_S 15
|
|
#define MEV_RULE_TIME_SEL_VAL_M \
|
|
MAKE_MASK64(0x1, MEV_RULE_TIME_SEL_VAL_S)
|
|
|
|
#define MEV_RULE_PORT_NUM_S 16
|
|
#define MEV_RULE_HOST_ID_S 18
|
|
#define MEV_RULE_PORT_NUM_M \
|
|
MAKE_MASK64(0x3, MEV_RULE_PORT_NUM_S)
|
|
#define MEV_RULE_HOST_ID_M \
|
|
MAKE_MASK64(0x7, MEV_RULE_HOST_ID_S)
|
|
|
|
#define MEV_RULE_CACHE_WR_THRU_S 21
|
|
#define MEV_RULE_CACHE_WR_THRU_M \
|
|
MAKE_MASK64(0x1, MEV_RULE_CACHE_WR_THRU_S)
|
|
|
|
#define MEV_RULE_RESP_REQ_S 22
|
|
#define MEV_RULE_RESP_REQ_M \
|
|
MAKE_MASK64(0x3, MEV_RULE_RESP_REQ_S)
|
|
#define MEV_RULE_OBJ_ADDR_S 24
|
|
#define MEV_RULE_OBJ_ADDR_M \
|
|
MAKE_MASK64(0x7FFFFFF, MEV_RULE_OBJ_ADDR_S)
|
|
#define MEV_RULE_OBJ_ID_S 59
|
|
#define MEV_RULE_OBJ_ID_M \
|
|
MAKE_MASK64((uint64_t)0x3, MEV_RULE_OBJ_ID_S)
|
|
|
|
/* macros for creating CFG_CTRL for sem/lem rule blob */
|
|
#define MEV_RULE_CFG_CTRL_PROF_ID_S 0
|
|
#define MEV_RULE_CFG_CTRL_PROF_ID_M \
|
|
MAKE_MASK16(0x7FF, MEV_RULE_CFG_CTRL_PROF_ID_S)
|
|
|
|
#define MEV_RULE_CFG_CTRL_SUB_PROF_ID_S 11
|
|
#define MEV_RULE_CFG_CTRL_SUB_PROF_ID_M \
|
|
MAKE_MASK16(0x3, MEV_RULE_CFG_CTRL_SUB_PROF_ID_S)
|
|
#define MEV_RULE_CFG_CTRL_PIN_CACHE_S 13
|
|
#define MEV_RULE_CFG_CTRL_PIN_CACHE_M \
|
|
MAKE_MASK16(0x1, MEV_RULE_CFG_CTRL_PIN_CACHE_S)
|
|
#define MEV_RULE_CFG_CTRL_CLEAR_MIRROR_S 14
|
|
#define MEV_RULE_CFG_CTRL_CLEAR_MIRROR_M \
|
|
MAKE_MASK16(0x1, MEV_RULE_CFG_CTRL_CLEAR_MIRROR_S)
|
|
#define MEV_RULE_CFG_CTRL_FIXED_FETCH_S 15
|
|
#define MEV_RULE_CFG_CTRL_FIXED_FETCH_M \
|
|
MAKE_MASK16(0x1, MEV_RULE_CFG_CTRL_FIXED_FETCH_S)
|
|
|
|
/**
|
|
* macro to build the CFG_CTRL for rule packet data, which is one of
|
|
* cpfl_prep_sem_rule_blob()'s input parameter.
|
|
*/
|
|
/* build SEM CFG_CTRL*/
|
|
#define CPFL_GET_MEV_SEM_RULE_CFG_CTRL(prof_id, sub_prof_id, \
|
|
pin_to_cache, fixed_fetch) \
|
|
(SHIFT_VAL16((prof_id), MEV_RULE_CFG_CTRL_PROF_ID) | \
|
|
SHIFT_VAL16((sub_prof_id), MEV_RULE_CFG_CTRL_SUB_PROF_ID) | \
|
|
SHIFT_VAL16((pin_to_cache), MEV_RULE_CFG_CTRL_PIN_CACHE) | \
|
|
SHIFT_VAL16((fixed_fetch), MEV_RULE_CFG_CTRL_FIXED_FETCH))
|
|
|
|
/* build LEM CFG_CTRL*/
|
|
#define CPFL_GET_MEV_LEM_RULE_CFG_CTRL(prof_id, pin_to_cache, clear_mirror) \
|
|
(SHIFT_VAL16(prof_id, MEV_RULE_CFG_CTRL_PROF_ID) | \
|
|
SHIFT_VAL16(pin_to_cache, MEV_RULE_CFG_CTRL_PIN_CACHE) | \
|
|
SHIFT_VAL16(clear_mirror, MEV_RULE_CFG_CTRL_CLEAR_MIRROR))
|
|
|
|
/* macros for creating mod content config packets */
|
|
#define MEV_RULE_MOD_INDEX_S 24
|
|
#define MEV_RULE_MOD_INDEX_M \
|
|
MAKE_MASK64(0xFFFFFFFF, MEV_RULE_MOD_INDEX_S)
|
|
|
|
#define MEV_RULE_PIN_MOD_CONTENT_S 62
|
|
#define MEV_RULE_PIN_MOD_CONTENT_M \
|
|
MAKE_MASK64((uint64_t)0x1, MEV_RULE_PIN_MOD_CONTENT_S)
|
|
#define MEV_RULE_MOD_OBJ_SIZE_S 63
|
|
#define MEV_RULE_MOD_OBJ_SIZE_M \
|
|
MAKE_MASK64((uint64_t)0x1, MEV_RULE_MOD_OBJ_SIZE_S)
|
|
|
|
/**
|
|
* struct cpfl_sem_rule_cfg_pkt - Describes rule information for SEM
|
|
* note: The key may be in mixed big/little endian format, the rest of members
|
|
* are in little endian
|
|
*/
|
|
struct cpfl_sem_rule_cfg_pkt {
|
|
#define MEV_SEM_RULE_KEY_SIZE 128
|
|
uint8_t key[MEV_SEM_RULE_KEY_SIZE];
|
|
|
|
#define MEV_SEM_RULE_ACT_SIZE 72
|
|
uint8_t actions[MEV_SEM_RULE_ACT_SIZE];
|
|
|
|
/* Bit(s):
|
|
* 10:0 : PROFILE_ID
|
|
* 12:11: SUB_PROF_ID (used for SEM only)
|
|
* 13 : pin the SEM key content into the cache
|
|
* 14 : Reserved
|
|
* 15 : Fixed_fetch
|
|
*/
|
|
uint8_t cfg_ctrl[2];
|
|
|
|
/* Bit(s):
|
|
* 0: valid
|
|
* 15:1: Hints
|
|
* 26:16: PROFILE_ID, the profile associated with the entry
|
|
* 31:27: PF
|
|
* 55:32: FLOW ID (assigned by HW)
|
|
* 63:56: EPOCH
|
|
*/
|
|
uint8_t ctrl_word[8];
|
|
uint8_t padding[46];
|
|
};
|
|
|
|
/**
|
|
* union cpfl_rule_cfg_pkt_record - Describes rule data blob
|
|
*/
|
|
union cpfl_rule_cfg_pkt_record {
|
|
struct cpfl_sem_rule_cfg_pkt sem_rule;
|
|
uint8_t pkt_data[256];
|
|
uint8_t mod_blob[256];
|
|
};
|
|
|
|
/**
|
|
* cpfl_rule_query_addr - LEM/SEM Rule Query Address structure
|
|
*/
|
|
struct cpfl_rule_query_addr {
|
|
uint8_t obj_id;
|
|
uint32_t obj_addr;
|
|
};
|
|
|
|
/**
|
|
* cpfl_rule_query_del_addr - Rule Query and Delete Address
|
|
*/
|
|
struct cpfl_rule_query_del_addr {
|
|
uint8_t obj_id;
|
|
uint32_t obj_addr;
|
|
};
|
|
|
|
/**
|
|
* cpfl_rule_mod_content - MOD Rule Content
|
|
*/
|
|
struct cpfl_rule_mod_content {
|
|
uint8_t obj_size;
|
|
uint8_t pin_content;
|
|
uint32_t index;
|
|
};
|
|
|
|
/**
|
|
* cpfl_rule_cfg_data_common - data struct for all rule opcodes
|
|
*note: some rules may only require part of structure
|
|
*/
|
|
struct cpfl_rule_cfg_data_common {
|
|
enum cpfl_ctlq_rule_cfg_opc opc;
|
|
uint64_t cookie;
|
|
uint16_t vsi_id;
|
|
uint8_t port_num;
|
|
uint8_t host_id;
|
|
uint8_t time_sel;
|
|
uint8_t time_sel_val;
|
|
uint8_t cache_wr_thru;
|
|
uint8_t resp_req;
|
|
uint32_t ret_val;
|
|
uint16_t buf_len;
|
|
struct idpf_dma_mem *payload;
|
|
};
|
|
|
|
/**
|
|
* cpfl_rule_cfg_data - rule config data
|
|
* note: Before sending rule to HW, caller needs to fill
|
|
* in this struct then call cpfl_prep_rule_desc().
|
|
*/
|
|
struct cpfl_rule_cfg_data {
|
|
struct cpfl_rule_cfg_data_common common;
|
|
union {
|
|
struct cpfl_rule_query_addr query_addr;
|
|
struct cpfl_rule_query_del_addr query_del_addr;
|
|
struct cpfl_rule_mod_content mod_content;
|
|
} ext;
|
|
};
|
|
|
|
/**
|
|
* cpfl_fill_rule_mod_content - fill info for mod content
|
|
*/
|
|
static inline void
|
|
cpfl_fill_rule_mod_content(uint8_t mod_obj_size,
|
|
uint8_t pin_mod_content,
|
|
uint32_t mod_index,
|
|
struct cpfl_rule_mod_content *mod_content)
|
|
{
|
|
mod_content->obj_size = mod_obj_size;
|
|
mod_content->pin_content = pin_mod_content;
|
|
mod_content->index = mod_index;
|
|
}
|
|
|
|
/**
|
|
* cpfl_fill_rule_cfg_data_common - fill in rule config data for all opcodes
|
|
* note: call this function before calls cpfl_prep_rule_desc()
|
|
*/
|
|
static inline void
|
|
cpfl_fill_rule_cfg_data_common(enum cpfl_ctlq_rule_cfg_opc opc,
|
|
uint64_t cookie,
|
|
uint16_t vsi_id,
|
|
uint8_t port_num,
|
|
uint8_t host_id,
|
|
uint8_t time_sel,
|
|
uint8_t time_sel_val,
|
|
uint8_t cache_wr_thru,
|
|
uint8_t resp_req,
|
|
uint16_t payload_len,
|
|
struct idpf_dma_mem *payload,
|
|
struct cpfl_rule_cfg_data_common *cfg_cmn)
|
|
{
|
|
cfg_cmn->opc = opc;
|
|
cfg_cmn->cookie = cookie;
|
|
cfg_cmn->vsi_id = vsi_id;
|
|
cfg_cmn->port_num = port_num;
|
|
cfg_cmn->resp_req = resp_req;
|
|
cfg_cmn->ret_val = 0;
|
|
cfg_cmn->host_id = host_id;
|
|
cfg_cmn->time_sel = time_sel;
|
|
cfg_cmn->time_sel_val = time_sel_val;
|
|
cfg_cmn->cache_wr_thru = cache_wr_thru;
|
|
|
|
cfg_cmn->buf_len = payload_len;
|
|
cfg_cmn->payload = payload;
|
|
}
|
|
|
|
void
|
|
cpfl_prep_rule_desc(struct cpfl_rule_cfg_data *cfg_data,
|
|
struct idpf_ctlq_msg *ctlq_msg);
|
|
|
|
void
|
|
cpfl_prep_sem_rule_blob(const uint8_t *key,
|
|
uint8_t key_byte_len,
|
|
const uint8_t *act_bytes,
|
|
uint8_t act_byte_len,
|
|
uint16_t cfg_ctrl,
|
|
union cpfl_rule_cfg_pkt_record *rule_blob);
|
|
|
|
#endif /* _CPFL_RULES_API_H_ */
|