// SPDX-License-Identifier: GPL-2.0 /* Copyright (C) 2021, Intel Corporation. */ #include "ice_virtchnl_allowlist.h" /* Purpose of this file is to share functionality to allowlist or denylist * opcodes used in PF <-> VF communication. Group of opcodes: * - default -> should be always allowed after creating VF, * default_allowlist_opcodes * - opcodes needed by VF to work correctly, but not associated with caps -> * should be allowed after successful VF resources allocation, * working_allowlist_opcodes * - opcodes needed by VF when caps are activated * * Caps that don't use new opcodes (no opcodes should be allowed): * - VIRTCHNL_VF_OFFLOAD_WB_ON_ITR * - VIRTCHNL_VF_OFFLOAD_CRC * - VIRTCHNL_VF_OFFLOAD_RX_POLLING * - VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 * - VIRTCHNL_VF_OFFLOAD_ENCAP * - VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM * - VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM * - VIRTCHNL_VF_OFFLOAD_USO */ /* default opcodes to communicate with VF */ static const u32 default_allowlist_opcodes[] = …; /* opcodes supported after successful VIRTCHNL_OP_GET_VF_RESOURCES */ static const u32 working_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_L2 */ static const u32 l2_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_REQ_QUEUES */ static const u32 req_queues_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_VLAN */ static const u32 vlan_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_VLAN_V2 */ static const u32 vlan_v2_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_RSS_PF */ static const u32 rss_pf_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC */ static const u32 rx_flex_desc_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF */ static const u32 adv_rss_pf_allowlist_opcodes[] = …; /* VIRTCHNL_VF_OFFLOAD_FDIR_PF */ static const u32 fdir_pf_allowlist_opcodes[] = …; struct allowlist_opcode_info { … }; #define BIT_INDEX(caps) … #define ALLOW_ITEM(caps, list) … static const struct allowlist_opcode_info allowlist_opcodes[] = …; /** * ice_vc_is_opcode_allowed - check if this opcode is allowed on this VF * @vf: pointer to VF structure * @opcode: virtchnl opcode * * Return true if message is allowed on this VF */ bool ice_vc_is_opcode_allowed(struct ice_vf *vf, u32 opcode) { … } /** * ice_vc_allowlist_opcodes - allowlist selected opcodes * @vf: pointer to VF structure * @opcodes: array of opocodes to allowlist * @size: size of opcodes array * * Function should be called to allowlist opcodes on VF. */ static void ice_vc_allowlist_opcodes(struct ice_vf *vf, const u32 *opcodes, size_t size) { … } /** * ice_vc_clear_allowlist - clear all allowlist opcodes * @vf: pointer to VF structure */ static void ice_vc_clear_allowlist(struct ice_vf *vf) { … } /** * ice_vc_set_default_allowlist - allowlist default opcodes for VF * @vf: pointer to VF structure */ void ice_vc_set_default_allowlist(struct ice_vf *vf) { … } /** * ice_vc_set_working_allowlist - allowlist opcodes needed to by VF to work * @vf: pointer to VF structure * * allowlist opcodes that aren't associated with specific caps, but * are needed by VF to work. */ void ice_vc_set_working_allowlist(struct ice_vf *vf) { … } /** * ice_vc_set_caps_allowlist - allowlist VF opcodes according caps * @vf: pointer to VF structure */ void ice_vc_set_caps_allowlist(struct ice_vf *vf) { … }