Path: blob/main/sys/contrib/ncsw/inc/flib/fsl_fman_kg.h
48375 views
/*1* Copyright 2008-2012 Freescale Semiconductor Inc.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions are met:5* * Redistributions of source code must retain the above copyright6* notice, this list of conditions and the following disclaimer.7* * Redistributions in binary form must reproduce the above copyright8* notice, this list of conditions and the following disclaimer in the9* documentation and/or other materials provided with the distribution.10* * Neither the name of Freescale Semiconductor nor the11* names of its contributors may be used to endorse or promote products12* derived from this software without specific prior written permission.13*14*15* ALTERNATIVELY, this software may be distributed under the terms of the16* GNU General Public License ("GPL") as published by the Free Software17* Foundation, either version 2 of that License or (at your option) any18* later version.19*20* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED22* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE23* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY24* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES25* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;26* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND27* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/3132#ifndef __FSL_FMAN_KG_H33#define __FSL_FMAN_KG_H3435#include "common/general.h"3637#define FM_KG_NUM_OF_GENERIC_REGS 8 /**< Num of generic KeyGen regs */38#define FMAN_MAX_NUM_OF_HW_PORTS 6439/**< Total num of masks allowed on KG extractions */40#define FM_KG_EXTRACT_MASKS_NUM 441#define FM_KG_NUM_CLS_PLAN_ENTR 8 /**< Num of class. plan regs */42#define FM_KG_CLS_PLAN_GRPS_NUM 32 /**< Max num of class. groups */4344struct fman_kg_regs {45uint32_t fmkg_gcr;46uint32_t res004;47uint32_t res008;48uint32_t fmkg_eer;49uint32_t fmkg_eeer;50uint32_t res014;51uint32_t res018;52uint32_t fmkg_seer;53uint32_t fmkg_seeer;54uint32_t fmkg_gsr;55uint32_t fmkg_tpc;56uint32_t fmkg_serc;57uint32_t res030[4];58uint32_t fmkg_fdor;59uint32_t fmkg_gdv0r;60uint32_t fmkg_gdv1r;61uint32_t res04c[6];62uint32_t fmkg_feer;63uint32_t res068[38];64uint32_t fmkg_indirect[63];65uint32_t fmkg_ar;66};6768struct fman_kg_scheme_regs {69uint32_t kgse_mode; /**< MODE */70uint32_t kgse_ekfc; /**< Extract Known Fields Command */71uint32_t kgse_ekdv; /**< Extract Known Default Value */72uint32_t kgse_bmch; /**< Bit Mask Command High */73uint32_t kgse_bmcl; /**< Bit Mask Command Low */74uint32_t kgse_fqb; /**< Frame Queue Base */75uint32_t kgse_hc; /**< Hash Command */76uint32_t kgse_ppc; /**< Policer Profile Command */77uint32_t kgse_gec[FM_KG_NUM_OF_GENERIC_REGS];78/**< Generic Extract Command */79uint32_t kgse_spc; /**< KeyGen Scheme Entry Statistic Packet Counter */80uint32_t kgse_dv0; /**< KeyGen Scheme Entry Default Value 0 */81uint32_t kgse_dv1; /**< KeyGen Scheme Entry Default Value 1 */82uint32_t kgse_ccbs; /**< KeyGen Scheme Entry Coarse Classification Bit*/83uint32_t kgse_mv; /**< KeyGen Scheme Entry Match vector */84uint32_t kgse_om; /**< KeyGen Scheme Entry Operation Mode bits */85uint32_t kgse_vsp; /**< KeyGen Scheme Entry Virtual Storage Profile */86};8788struct fman_kg_pe_regs{89uint32_t fmkg_pe_sp;90uint32_t fmkg_pe_cpp;91};9293struct fman_kg_cp_regs {94uint32_t kgcpe[FM_KG_NUM_CLS_PLAN_ENTR];95};969798#define FM_KG_KGAR_GO 0x8000000099#define FM_KG_KGAR_READ 0x40000000100#define FM_KG_KGAR_WRITE 0x00000000101#define FM_KG_KGAR_SEL_SCHEME_ENTRY 0x00000000102#define FM_KG_KGAR_SCM_WSEL_UPDATE_CNT 0x00008000103104#define KG_SCH_PP_SHIFT_HIGH 0x80000000105#define KG_SCH_PP_NO_GEN 0x10000000106#define KG_SCH_PP_SHIFT_LOW 0x0000F000107#define KG_SCH_MODE_NIA_PLCR 0x40000000108#define KG_SCH_GEN_EXTRACT_TYPE 0x00008000109#define KG_SCH_BITMASK_MASK 0x000000FF110#define KG_SCH_GEN_VALID 0x80000000111#define KG_SCH_GEN_MASK 0x00FF0000112#define FM_PCD_KG_KGAR_ERR 0x20000000113#define FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY 0x01000000114#define FM_PCD_KG_KGAR_SEL_PORT_ENTRY 0x02000000115#define FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP 0x00008000116#define FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP 0x00004000117#define FM_PCD_KG_KGAR_WSEL_MASK 0x0000FF00118#define KG_SCH_HASH_CONFIG_NO_FQID 0x80000000119#define KG_SCH_HASH_CONFIG_SYM 0x40000000120121#define FM_EX_KG_DOUBLE_ECC 0x80000000122#define FM_EX_KG_KEYSIZE_OVERFLOW 0x40000000123124/* ECC capture register */125#define KG_FMKG_SERC_CAP 0x80000000126#define KG_FMKG_SERC_CET 0x40000000127#define KG_FMKG_SERC_CNT_MSK 0x00FF0000128#define KG_FMKG_SERC_CNT_SHIFT 16129#define KG_FMKG_SERC_ADDR_MSK 0x000003FF130131/* Masks */132#define FM_KG_KGGCR_EN 0x80000000133#define KG_SCH_GEN_VALID 0x80000000134#define KG_SCH_GEN_EXTRACT_TYPE 0x00008000135#define KG_ERR_TYPE_DOUBLE 0x40000000136#define KG_ERR_ADDR_MASK 0x00000FFF137#define KG_SCH_MODE_EN 0x80000000138139/* shifts */140#define FM_KG_KGAR_NUM_SHIFT 16141#define FM_KG_PE_CPP_MASK_SHIFT 16142#define FM_KG_KGAR_WSEL_SHIFT 8143144#define FM_KG_SCH_GEN_HT_INVALID 0145146#define FM_KG_MASK_SEL_GEN_BASE 0x20147148#define KG_GET_MASK_SEL_SHIFT(shift, i) \149switch (i) \150{ \151case 0: (shift) = 26; break; \152case 1: (shift) = 20; break; \153case 2: (shift) = 10; break; \154case 3: (shift) = 4; break; \155default: (shift) = 0; \156}157158#define KG_GET_MASK_OFFSET_SHIFT(shift, i) \159switch (i) \160{ \161case 0: (shift) = 16; break; \162case 1: (shift) = 0; break; \163case 2: (shift) = 28; break; \164case 3: (shift) = 24; break; \165default: (shift) = 0; \166}167168#define KG_GET_MASK_SHIFT(shift, i) \169switch (i) \170{ \171case 0: shift = 24; break; \172case 1: shift = 16; break; \173case 2: shift = 8; break; \174case 3: shift = 0; break; \175default: shift = 0; \176}177178/* Port entry CPP register */179#define FMAN_KG_PE_CPP_MASK_SHIFT 16180181/* Scheme registers */182#define FMAN_KG_SCH_MODE_EN 0x80000000183#define FMAN_KG_SCH_MODE_NIA_PLCR 0x40000000184#define FMAN_KG_SCH_MODE_CCOBASE_SHIFT 24185186#define FMAN_KG_SCH_DEF_MAC_ADDR_SHIFT 30187#define FMAN_KG_SCH_DEF_VLAN_TCI_SHIFT 28188#define FMAN_KG_SCH_DEF_ETYPE_SHIFT 26189#define FMAN_KG_SCH_DEF_PPP_SID_SHIFT 24190#define FMAN_KG_SCH_DEF_PPP_PID_SHIFT 22191#define FMAN_KG_SCH_DEF_MPLS_SHIFT 20192#define FMAN_KG_SCH_DEF_IP_ADDR_SHIFT 18193#define FMAN_KG_SCH_DEF_PTYPE_SHIFT 16194#define FMAN_KG_SCH_DEF_IP_TOS_TC_SHIFT 14195#define FMAN_KG_SCH_DEF_IPv6_FL_SHIFT 12196#define FMAN_KG_SCH_DEF_IPSEC_SPI_SHIFT 10197#define FMAN_KG_SCH_DEF_L4_PORT_SHIFT 8198#define FMAN_KG_SCH_DEF_TCP_FLG_SHIFT 6199200#define FMAN_KG_SCH_GEN_VALID 0x80000000201#define FMAN_KG_SCH_GEN_SIZE_MAX 16202#define FMAN_KG_SCH_GEN_OR 0x00008000203204#define FMAN_KG_SCH_GEN_DEF_SHIFT 29205#define FMAN_KG_SCH_GEN_SIZE_SHIFT 24206#define FMAN_KG_SCH_GEN_MASK_SHIFT 16207#define FMAN_KG_SCH_GEN_HT_SHIFT 8208209#define FMAN_KG_SCH_HASH_HSHIFT_SHIFT 24210#define FMAN_KG_SCH_HASH_HSHIFT_MAX 0x28211#define FMAN_KG_SCH_HASH_SYM 0x40000000212#define FMAN_KG_SCH_HASH_NO_FQID_GEN 0x80000000213214#define FMAN_KG_SCH_PP_SH_SHIFT 27215#define FMAN_KG_SCH_PP_SL_SHIFT 12216#define FMAN_KG_SCH_PP_SH_MASK 0x80000000217#define FMAN_KG_SCH_PP_SL_MASK 0x0000F000218#define FMAN_KG_SCH_PP_SHIFT_MAX 0x17219#define FMAN_KG_SCH_PP_MASK_SHIFT 16220#define FMAN_KG_SCH_PP_NO_GEN 0x10000000221222enum fman_kg_gen_extract_src {223E_FMAN_KG_GEN_EXTRACT_ETH,224E_FMAN_KG_GEN_EXTRACT_ETYPE,225E_FMAN_KG_GEN_EXTRACT_SNAP,226E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_1,227E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_N,228E_FMAN_KG_GEN_EXTRACT_PPPoE,229E_FMAN_KG_GEN_EXTRACT_MPLS_1,230E_FMAN_KG_GEN_EXTRACT_MPLS_2,231E_FMAN_KG_GEN_EXTRACT_MPLS_3,232E_FMAN_KG_GEN_EXTRACT_MPLS_N,233E_FMAN_KG_GEN_EXTRACT_IPv4_1,234E_FMAN_KG_GEN_EXTRACT_IPv6_1,235E_FMAN_KG_GEN_EXTRACT_IPv4_2,236E_FMAN_KG_GEN_EXTRACT_IPv6_2,237E_FMAN_KG_GEN_EXTRACT_MINENCAP,238E_FMAN_KG_GEN_EXTRACT_IP_PID,239E_FMAN_KG_GEN_EXTRACT_GRE,240E_FMAN_KG_GEN_EXTRACT_TCP,241E_FMAN_KG_GEN_EXTRACT_UDP,242E_FMAN_KG_GEN_EXTRACT_SCTP,243E_FMAN_KG_GEN_EXTRACT_DCCP,244E_FMAN_KG_GEN_EXTRACT_IPSEC_AH,245E_FMAN_KG_GEN_EXTRACT_IPSEC_ESP,246E_FMAN_KG_GEN_EXTRACT_SHIM_1,247E_FMAN_KG_GEN_EXTRACT_SHIM_2,248E_FMAN_KG_GEN_EXTRACT_FROM_DFLT,249E_FMAN_KG_GEN_EXTRACT_FROM_FRAME_START,250E_FMAN_KG_GEN_EXTRACT_FROM_PARSE_RESULT,251E_FMAN_KG_GEN_EXTRACT_FROM_END_OF_PARSE,252E_FMAN_KG_GEN_EXTRACT_FROM_FQID253};254255struct fman_kg_ex_ecc_attr256{257bool valid;258bool double_ecc;259uint16_t addr;260uint8_t single_ecc_count;261};262263enum fman_kg_def_select264{265E_FMAN_KG_DEF_GLOBAL_0,266E_FMAN_KG_DEF_GLOBAL_1,267E_FMAN_KG_DEF_SCHEME_0,268E_FMAN_KG_DEF_SCHEME_1269};270271struct fman_kg_extract_def272{273enum fman_kg_def_select mac_addr;274enum fman_kg_def_select vlan_tci;275enum fman_kg_def_select etype;276enum fman_kg_def_select ppp_sid;277enum fman_kg_def_select ppp_pid;278enum fman_kg_def_select mpls;279enum fman_kg_def_select ip_addr;280enum fman_kg_def_select ptype;281enum fman_kg_def_select ip_tos_tc;282enum fman_kg_def_select ipv6_fl;283enum fman_kg_def_select ipsec_spi;284enum fman_kg_def_select l4_port;285enum fman_kg_def_select tcp_flg;286};287288enum fman_kg_gen_extract_type289{290E_FMAN_KG_HASH_EXTRACT,291E_FMAN_KG_OR_EXTRACT292};293294struct fman_kg_gen_extract_params295{296/* Hash or Or-ed extract */297enum fman_kg_gen_extract_type type;298enum fman_kg_gen_extract_src src;299bool no_validation;300/* Extraction offset from the header location specified above */301uint8_t offset;302/* Size of extraction for FMAN_KG_HASH_EXTRACT,303* hash result shift for FMAN_KG_OR_EXTRACT */304uint8_t extract;305uint8_t mask;306/* Default value to use when header specified307* by fman_kg_gen_extract_src doesn't present */308enum fman_kg_def_select def_val;309};310311struct fman_kg_extract_mask312{313/**< Indication if mask is on known field extraction or314* on general extraction; TRUE for known field */315bool is_known;316/**< One of FMAN_KG_EXTRACT_xxx defines for known fields mask and317* generic register index for generic extracts mask */318uint32_t field_or_gen_idx;319/**< Byte offset from start of the extracted data specified320* by field_or_gen_idx */321uint8_t offset;322/**< Byte mask (selected bits will be used) */323uint8_t mask;324};325326struct fman_kg_extract_params327{328/* Or-ed mask of FMAN_KG_EXTRACT_xxx defines */329uint32_t known_fields;330struct fman_kg_extract_def known_fields_def;331/* Number of entries in gen_extract */332uint8_t gen_extract_num;333struct fman_kg_gen_extract_params gen_extract[FM_KG_NUM_OF_GENERIC_REGS];334/* Number of entries in masks */335uint8_t masks_num;336struct fman_kg_extract_mask masks[FM_KG_EXTRACT_MASKS_NUM];337uint32_t def_scheme_0;338uint32_t def_scheme_1;339};340341struct fman_kg_hash_params342{343bool use_hash;344uint8_t shift_r;345uint32_t mask; /**< 24-bit mask */346bool sym; /**< Symmetric hash for src and dest pairs */347};348349struct fman_kg_pp_params350{351uint8_t base;352uint8_t shift;353uint8_t mask;354bool bypass_pp_gen;355};356357struct fman_kg_cc_params358{359uint8_t base_offset;360uint32_t qlcv_bits_sel;361};362363enum fman_pcd_engine364{365E_FMAN_PCD_INVALID = 0, /**< Invalid PCD engine indicated*/366E_FMAN_PCD_DONE, /**< No PCD Engine indicated */367E_FMAN_PCD_KG, /**< Keygen indicated */368E_FMAN_PCD_CC, /**< Coarse classification indicated */369E_FMAN_PCD_PLCR, /**< Policer indicated */370E_FMAN_PCD_PRS /**< Parser indicated */371};372373struct fman_kg_cls_plan_params374{375uint8_t entries_mask;376uint32_t mask_vector[FM_KG_NUM_CLS_PLAN_ENTR];377};378379struct fman_kg_scheme_params380{381uint32_t match_vector;382struct fman_kg_extract_params extract_params;383struct fman_kg_hash_params hash_params;384uint32_t base_fqid;385/* What we do w/features supported per FM version ?? */386bool bypass_fqid_gen;387struct fman_kg_pp_params policer_params;388struct fman_kg_cc_params cc_params;389bool update_counter;390/**< counter_value: Set scheme counter to the specified value;391* relevant only when update_counter = TRUE. */392uint32_t counter_value;393enum fman_pcd_engine next_engine;394/**< Next engine action code */395uint32_t next_engine_action;396};397398399400int fman_kg_write_ar_wait(struct fman_kg_regs *regs, uint32_t fmkg_ar);401void fman_kg_write_sp(struct fman_kg_regs *regs, uint32_t sp, bool add);402void fman_kg_write_cpp(struct fman_kg_regs *regs, uint32_t cpp);403void fman_kg_get_event(struct fman_kg_regs *regs,404uint32_t *event,405uint32_t *scheme_idx);406void fman_kg_init(struct fman_kg_regs *regs,407uint32_t exceptions,408uint32_t dflt_nia);409void fman_kg_enable_scheme_interrupts(struct fman_kg_regs *regs);410void fman_kg_enable(struct fman_kg_regs *regs);411void fman_kg_disable(struct fman_kg_regs *regs);412int fman_kg_write_bind_cls_plans(struct fman_kg_regs *regs,413uint8_t hwport_id,414uint32_t bind_cls_plans);415int fman_kg_build_bind_cls_plans(uint8_t grp_base,416uint8_t grp_mask,417uint32_t *bind_cls_plans);418int fman_kg_write_bind_schemes(struct fman_kg_regs *regs,419uint8_t hwport_id,420uint32_t schemes);421int fman_kg_write_cls_plan(struct fman_kg_regs *regs,422uint8_t grp_id,423uint8_t entries_mask,424uint8_t hwport_id,425struct fman_kg_cp_regs *cls_plan_regs);426int fman_kg_build_cls_plan(struct fman_kg_cls_plan_params *params,427struct fman_kg_cp_regs *cls_plan_regs);428uint32_t fman_kg_get_schemes_total_counter(struct fman_kg_regs *regs);429int fman_kg_set_scheme_counter(struct fman_kg_regs *regs,430uint8_t scheme_id,431uint8_t hwport_id,432uint32_t counter);433int fman_kg_get_scheme_counter(struct fman_kg_regs *regs,434uint8_t scheme_id,435uint8_t hwport_id,436uint32_t *counter);437int fman_kg_delete_scheme(struct fman_kg_regs *regs,438uint8_t scheme_id,439uint8_t hwport_id);440int fman_kg_write_scheme(struct fman_kg_regs *regs,441uint8_t scheme_id,442uint8_t hwport_id,443struct fman_kg_scheme_regs *scheme_regs,444bool update_counter);445int fman_kg_build_scheme(struct fman_kg_scheme_params *params,446struct fman_kg_scheme_regs *scheme_regs);447void fman_kg_get_capture(struct fman_kg_regs *regs,448struct fman_kg_ex_ecc_attr *ecc_attr,449bool clear);450void fman_kg_get_exception(struct fman_kg_regs *regs,451uint32_t *events,452uint32_t *scheme_ids,453bool clear);454void fman_kg_set_exception(struct fman_kg_regs *regs,455uint32_t exception,456bool enable);457void fman_kg_set_dflt_val(struct fman_kg_regs *regs,458uint8_t def_id,459uint32_t val);460void fman_kg_set_data_after_prs(struct fman_kg_regs *regs, uint8_t offset);461462463464/**************************************************************************//**465@Description NIA Description466*//***************************************************************************/467#define KG_NIA_ORDER_RESTOR 0x00800000468#define KG_NIA_ENG_FM_CTL 0x00000000469#define KG_NIA_ENG_PRS 0x00440000470#define KG_NIA_ENG_KG 0x00480000471#define KG_NIA_ENG_PLCR 0x004C0000472#define KG_NIA_ENG_BMI 0x00500000473#define KG_NIA_ENG_QMI_ENQ 0x00540000474#define KG_NIA_ENG_QMI_DEQ 0x00580000475#define KG_NIA_ENG_MASK 0x007C0000476477#define KG_NIA_AC_MASK 0x0003FFFF478479#define KG_NIA_INVALID 0xFFFFFFFF480481static __inline__ uint32_t fm_kg_build_nia(enum fman_pcd_engine next_engine,482uint32_t next_engine_action)483{484uint32_t nia;485486if (next_engine_action & ~KG_NIA_AC_MASK)487return KG_NIA_INVALID;488489switch (next_engine) {490case E_FMAN_PCD_DONE:491nia = KG_NIA_ENG_BMI | next_engine_action;492break;493494case E_FMAN_PCD_KG:495nia = KG_NIA_ENG_KG | next_engine_action;496break;497498case E_FMAN_PCD_CC:499nia = KG_NIA_ENG_FM_CTL | next_engine_action;500break;501502case E_FMAN_PCD_PLCR:503nia = KG_NIA_ENG_PLCR | next_engine_action;504break;505506default:507nia = KG_NIA_INVALID;508}509510return nia;511}512513#endif /* __FSL_FMAN_KG_H */514515516