mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 05:55:02 +08:00
fd2a6b71e3
These changes introduce code for creating advanced recipes for the switch in hardware. There are a couple of recipes already defined in the HW. They apply to matching on basic protocol headers, like MAC, VLAN, MACVLAN, ethertype or direction (promiscuous), etc.. If the user wants to match on other protocol headers (eg. ip address, src/dst port etc.) or different variation of already supported protocols, there is a need to create new, more complex recipe. That new recipe is referred as 'advanced recipe', and the filtering rule created on top of that recipe is called 'advanced rule'. One recipe can have up to 5 words, but the first word is always reserved for match on switch id, so the driver can define up to 4 words for one recipe. To support recipes with more words up to 5 recipes can be chained, so 20 words can be programmed for look up. Input for adding recipe function is a list of protocols to support. Based on this list correct profile is being chosen. Correct profile means that it contains all protocol types from a list. Each profile have up to 48 field vector words and each of this word have protocol id and offset. These two fields need to match with input data for adding recipe function. If the correct profile can't be found the function returns an error. The next step after finding the correct profile is grouping words into groups. One group can have up to 4 words. This is done to simplify sending recipes to HW (because recipe also can have up to 4 words). In case of chaining (so when look up consists of more than 4 words) last recipe will always have results from the previous recipes used as words. A recipe to profile map is used to store information about which profile is associate with this recipe. This map is an array of 64 elements (max number of recipes) and each element is a 256 bits bitmap (max number of profiles) Profile to recipe map is used to store information about which recipe is associate with this profile. This map is an array of 256 elements (max number of profiles) and each element is a 64 bits bitmap (max number of recipes) Signed-off-by: Dan Nowlin <dan.nowlin@intel.com> Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
61 lines
2.1 KiB
C
61 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (c) 2019, Intel Corporation. */
|
|
|
|
#ifndef _ICE_FLEX_PIPE_H_
|
|
#define _ICE_FLEX_PIPE_H_
|
|
|
|
#include "ice_type.h"
|
|
|
|
/* Package minimal version supported */
|
|
#define ICE_PKG_SUPP_VER_MAJ 1
|
|
#define ICE_PKG_SUPP_VER_MNR 3
|
|
|
|
/* Package format version */
|
|
#define ICE_PKG_FMT_VER_MAJ 1
|
|
#define ICE_PKG_FMT_VER_MNR 0
|
|
#define ICE_PKG_FMT_VER_UPD 0
|
|
#define ICE_PKG_FMT_VER_DFT 0
|
|
|
|
#define ICE_PKG_CNT 4
|
|
|
|
enum ice_status
|
|
ice_acquire_change_lock(struct ice_hw *hw, enum ice_aq_res_access_type access);
|
|
void ice_release_change_lock(struct ice_hw *hw);
|
|
enum ice_status
|
|
ice_find_prot_off(struct ice_hw *hw, enum ice_block blk, u8 prof, u16 fv_idx,
|
|
u8 *prot, u16 *off);
|
|
void
|
|
ice_get_sw_fv_bitmap(struct ice_hw *hw, enum ice_prof_type type,
|
|
unsigned long *bm);
|
|
void
|
|
ice_init_prof_result_bm(struct ice_hw *hw);
|
|
enum ice_status
|
|
ice_get_sw_fv_list(struct ice_hw *hw, u8 *prot_ids, u16 ids_cnt,
|
|
unsigned long *bm, struct list_head *fv_list);
|
|
bool
|
|
ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port);
|
|
int ice_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
|
|
unsigned int idx, struct udp_tunnel_info *ti);
|
|
int ice_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
|
|
unsigned int idx, struct udp_tunnel_info *ti);
|
|
|
|
enum ice_status
|
|
ice_add_prof(struct ice_hw *hw, enum ice_block blk, u64 id, u8 ptypes[],
|
|
const struct ice_ptype_attributes *attr, u16 attr_cnt,
|
|
struct ice_fv_word *es, u16 *masks);
|
|
enum ice_status
|
|
ice_add_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl);
|
|
enum ice_status
|
|
ice_rem_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl);
|
|
enum ice_status ice_init_pkg(struct ice_hw *hw, u8 *buff, u32 len);
|
|
enum ice_status
|
|
ice_copy_and_init_pkg(struct ice_hw *hw, const u8 *buf, u32 len);
|
|
enum ice_status ice_init_hw_tbls(struct ice_hw *hw);
|
|
void ice_free_seg(struct ice_hw *hw);
|
|
void ice_fill_blk_tbls(struct ice_hw *hw);
|
|
void ice_clear_hw_tbls(struct ice_hw *hw);
|
|
void ice_free_hw_tbls(struct ice_hw *hw);
|
|
enum ice_status
|
|
ice_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 id);
|
|
#endif /* _ICE_FLEX_PIPE_H_ */
|