1*5de6c855SPrzemek Kitszel // SPDX-License-Identifier: GPL-2.0 2*5de6c855SPrzemek Kitszel /* Copyright (C) 2021, Intel Corporation. */ 3*5de6c855SPrzemek Kitszel 4*5de6c855SPrzemek Kitszel #include "allowlist.h" 5*5de6c855SPrzemek Kitszel 6*5de6c855SPrzemek Kitszel /* Purpose of this file is to share functionality to allowlist or denylist 7*5de6c855SPrzemek Kitszel * opcodes used in PF <-> VF communication. Group of opcodes: 8*5de6c855SPrzemek Kitszel * - default -> should be always allowed after creating VF, 9*5de6c855SPrzemek Kitszel * default_allowlist_opcodes 10*5de6c855SPrzemek Kitszel * - opcodes needed by VF to work correctly, but not associated with caps -> 11*5de6c855SPrzemek Kitszel * should be allowed after successful VF resources allocation, 12*5de6c855SPrzemek Kitszel * working_allowlist_opcodes 13*5de6c855SPrzemek Kitszel * - opcodes needed by VF when caps are activated 14*5de6c855SPrzemek Kitszel * 15*5de6c855SPrzemek Kitszel * Caps that don't use new opcodes (no opcodes should be allowed): 16*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_WB_ON_ITR 17*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_CRC 18*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_RX_POLLING 19*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 20*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_ENCAP 21*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM 22*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM 23*5de6c855SPrzemek Kitszel * - VIRTCHNL_VF_OFFLOAD_USO 24*5de6c855SPrzemek Kitszel */ 25*5de6c855SPrzemek Kitszel 26*5de6c855SPrzemek Kitszel /* default opcodes to communicate with VF */ 27*5de6c855SPrzemek Kitszel static const u32 default_allowlist_opcodes[] = { 28*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_VF_RESOURCES, VIRTCHNL_OP_VERSION, VIRTCHNL_OP_RESET_VF, 29*5de6c855SPrzemek Kitszel }; 30*5de6c855SPrzemek Kitszel 31*5de6c855SPrzemek Kitszel /* opcodes supported after successful VIRTCHNL_OP_GET_VF_RESOURCES */ 32*5de6c855SPrzemek Kitszel static const u32 working_allowlist_opcodes[] = { 33*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_TX_QUEUE, VIRTCHNL_OP_CONFIG_RX_QUEUE, 34*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_VSI_QUEUES, VIRTCHNL_OP_CONFIG_IRQ_MAP, 35*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ENABLE_QUEUES, VIRTCHNL_OP_DISABLE_QUEUES, 36*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_STATS, VIRTCHNL_OP_EVENT, 37*5de6c855SPrzemek Kitszel }; 38*5de6c855SPrzemek Kitszel 39*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_L2 */ 40*5de6c855SPrzemek Kitszel static const u32 l2_allowlist_opcodes[] = { 41*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ADD_ETH_ADDR, VIRTCHNL_OP_DEL_ETH_ADDR, 42*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, 43*5de6c855SPrzemek Kitszel }; 44*5de6c855SPrzemek Kitszel 45*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_REQ_QUEUES */ 46*5de6c855SPrzemek Kitszel static const u32 req_queues_allowlist_opcodes[] = { 47*5de6c855SPrzemek Kitszel VIRTCHNL_OP_REQUEST_QUEUES, 48*5de6c855SPrzemek Kitszel }; 49*5de6c855SPrzemek Kitszel 50*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_VLAN */ 51*5de6c855SPrzemek Kitszel static const u32 vlan_allowlist_opcodes[] = { 52*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ADD_VLAN, VIRTCHNL_OP_DEL_VLAN, 53*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ENABLE_VLAN_STRIPPING, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, 54*5de6c855SPrzemek Kitszel }; 55*5de6c855SPrzemek Kitszel 56*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_VLAN_V2 */ 57*5de6c855SPrzemek Kitszel static const u32 vlan_v2_allowlist_opcodes[] = { 58*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS, VIRTCHNL_OP_ADD_VLAN_V2, 59*5de6c855SPrzemek Kitszel VIRTCHNL_OP_DEL_VLAN_V2, VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2, 60*5de6c855SPrzemek Kitszel VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2, 61*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2, 62*5de6c855SPrzemek Kitszel VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2, 63*5de6c855SPrzemek Kitszel }; 64*5de6c855SPrzemek Kitszel 65*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_RSS_PF */ 66*5de6c855SPrzemek Kitszel static const u32 rss_pf_allowlist_opcodes[] = { 67*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_RSS_KEY, VIRTCHNL_OP_CONFIG_RSS_LUT, 68*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_RSS_HASHCFG_CAPS, VIRTCHNL_OP_SET_RSS_HASHCFG, 69*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_RSS_HFUNC, 70*5de6c855SPrzemek Kitszel }; 71*5de6c855SPrzemek Kitszel 72*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC */ 73*5de6c855SPrzemek Kitszel static const u32 rx_flex_desc_allowlist_opcodes[] = { 74*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_SUPPORTED_RXDIDS, 75*5de6c855SPrzemek Kitszel }; 76*5de6c855SPrzemek Kitszel 77*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF */ 78*5de6c855SPrzemek Kitszel static const u32 adv_rss_pf_allowlist_opcodes[] = { 79*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ADD_RSS_CFG, VIRTCHNL_OP_DEL_RSS_CFG, 80*5de6c855SPrzemek Kitszel }; 81*5de6c855SPrzemek Kitszel 82*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_OFFLOAD_FDIR_PF */ 83*5de6c855SPrzemek Kitszel static const u32 fdir_pf_allowlist_opcodes[] = { 84*5de6c855SPrzemek Kitszel VIRTCHNL_OP_ADD_FDIR_FILTER, VIRTCHNL_OP_DEL_FDIR_FILTER, 85*5de6c855SPrzemek Kitszel }; 86*5de6c855SPrzemek Kitszel 87*5de6c855SPrzemek Kitszel /* VIRTCHNL_VF_CAP_PTP */ 88*5de6c855SPrzemek Kitszel static const u32 ptp_allowlist_opcodes[] = { 89*5de6c855SPrzemek Kitszel VIRTCHNL_OP_1588_PTP_GET_CAPS, 90*5de6c855SPrzemek Kitszel VIRTCHNL_OP_1588_PTP_GET_TIME, 91*5de6c855SPrzemek Kitszel }; 92*5de6c855SPrzemek Kitszel 93*5de6c855SPrzemek Kitszel static const u32 tc_allowlist_opcodes[] = { 94*5de6c855SPrzemek Kitszel VIRTCHNL_OP_GET_QOS_CAPS, VIRTCHNL_OP_CONFIG_QUEUE_BW, 95*5de6c855SPrzemek Kitszel VIRTCHNL_OP_CONFIG_QUANTA, 96*5de6c855SPrzemek Kitszel }; 97*5de6c855SPrzemek Kitszel 98*5de6c855SPrzemek Kitszel struct allowlist_opcode_info { 99*5de6c855SPrzemek Kitszel const u32 *opcodes; 100*5de6c855SPrzemek Kitszel size_t size; 101*5de6c855SPrzemek Kitszel }; 102*5de6c855SPrzemek Kitszel 103*5de6c855SPrzemek Kitszel #define BIT_INDEX(caps) (HWEIGHT((caps) - 1)) 104*5de6c855SPrzemek Kitszel #define ALLOW_ITEM(caps, list) \ 105*5de6c855SPrzemek Kitszel [BIT_INDEX(caps)] = { \ 106*5de6c855SPrzemek Kitszel .opcodes = list, \ 107*5de6c855SPrzemek Kitszel .size = ARRAY_SIZE(list) \ 108*5de6c855SPrzemek Kitszel } 109*5de6c855SPrzemek Kitszel static const struct allowlist_opcode_info allowlist_opcodes[] = { 110*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_L2, l2_allowlist_opcodes), 111*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_REQ_QUEUES, req_queues_allowlist_opcodes), 112*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_VLAN, vlan_allowlist_opcodes), 113*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_RSS_PF, rss_pf_allowlist_opcodes), 114*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC, rx_flex_desc_allowlist_opcodes), 115*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF, adv_rss_pf_allowlist_opcodes), 116*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_FDIR_PF, fdir_pf_allowlist_opcodes), 117*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_VLAN_V2, vlan_v2_allowlist_opcodes), 118*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_OFFLOAD_QOS, tc_allowlist_opcodes), 119*5de6c855SPrzemek Kitszel ALLOW_ITEM(VIRTCHNL_VF_CAP_PTP, ptp_allowlist_opcodes), 120*5de6c855SPrzemek Kitszel }; 121*5de6c855SPrzemek Kitszel 122*5de6c855SPrzemek Kitszel /** 123*5de6c855SPrzemek Kitszel * ice_vc_is_opcode_allowed - check if this opcode is allowed on this VF 124*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 125*5de6c855SPrzemek Kitszel * @opcode: virtchnl opcode 126*5de6c855SPrzemek Kitszel * 127*5de6c855SPrzemek Kitszel * Return true if message is allowed on this VF 128*5de6c855SPrzemek Kitszel */ 129*5de6c855SPrzemek Kitszel bool ice_vc_is_opcode_allowed(struct ice_vf *vf, u32 opcode) 130*5de6c855SPrzemek Kitszel { 131*5de6c855SPrzemek Kitszel if (opcode >= VIRTCHNL_OP_MAX) 132*5de6c855SPrzemek Kitszel return false; 133*5de6c855SPrzemek Kitszel 134*5de6c855SPrzemek Kitszel return test_bit(opcode, vf->opcodes_allowlist); 135*5de6c855SPrzemek Kitszel } 136*5de6c855SPrzemek Kitszel 137*5de6c855SPrzemek Kitszel /** 138*5de6c855SPrzemek Kitszel * ice_vc_allowlist_opcodes - allowlist selected opcodes 139*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 140*5de6c855SPrzemek Kitszel * @opcodes: array of opocodes to allowlist 141*5de6c855SPrzemek Kitszel * @size: size of opcodes array 142*5de6c855SPrzemek Kitszel * 143*5de6c855SPrzemek Kitszel * Function should be called to allowlist opcodes on VF. 144*5de6c855SPrzemek Kitszel */ 145*5de6c855SPrzemek Kitszel static void 146*5de6c855SPrzemek Kitszel ice_vc_allowlist_opcodes(struct ice_vf *vf, const u32 *opcodes, size_t size) 147*5de6c855SPrzemek Kitszel { 148*5de6c855SPrzemek Kitszel unsigned int i; 149*5de6c855SPrzemek Kitszel 150*5de6c855SPrzemek Kitszel for (i = 0; i < size; i++) 151*5de6c855SPrzemek Kitszel set_bit(opcodes[i], vf->opcodes_allowlist); 152*5de6c855SPrzemek Kitszel } 153*5de6c855SPrzemek Kitszel 154*5de6c855SPrzemek Kitszel /** 155*5de6c855SPrzemek Kitszel * ice_vc_clear_allowlist - clear all allowlist opcodes 156*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 157*5de6c855SPrzemek Kitszel */ 158*5de6c855SPrzemek Kitszel static void ice_vc_clear_allowlist(struct ice_vf *vf) 159*5de6c855SPrzemek Kitszel { 160*5de6c855SPrzemek Kitszel bitmap_zero(vf->opcodes_allowlist, VIRTCHNL_OP_MAX); 161*5de6c855SPrzemek Kitszel } 162*5de6c855SPrzemek Kitszel 163*5de6c855SPrzemek Kitszel /** 164*5de6c855SPrzemek Kitszel * ice_vc_set_default_allowlist - allowlist default opcodes for VF 165*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 166*5de6c855SPrzemek Kitszel */ 167*5de6c855SPrzemek Kitszel void ice_vc_set_default_allowlist(struct ice_vf *vf) 168*5de6c855SPrzemek Kitszel { 169*5de6c855SPrzemek Kitszel ice_vc_clear_allowlist(vf); 170*5de6c855SPrzemek Kitszel ice_vc_allowlist_opcodes(vf, default_allowlist_opcodes, 171*5de6c855SPrzemek Kitszel ARRAY_SIZE(default_allowlist_opcodes)); 172*5de6c855SPrzemek Kitszel } 173*5de6c855SPrzemek Kitszel 174*5de6c855SPrzemek Kitszel /** 175*5de6c855SPrzemek Kitszel * ice_vc_set_working_allowlist - allowlist opcodes needed to by VF to work 176*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 177*5de6c855SPrzemek Kitszel * 178*5de6c855SPrzemek Kitszel * allowlist opcodes that aren't associated with specific caps, but 179*5de6c855SPrzemek Kitszel * are needed by VF to work. 180*5de6c855SPrzemek Kitszel */ 181*5de6c855SPrzemek Kitszel void ice_vc_set_working_allowlist(struct ice_vf *vf) 182*5de6c855SPrzemek Kitszel { 183*5de6c855SPrzemek Kitszel ice_vc_allowlist_opcodes(vf, working_allowlist_opcodes, 184*5de6c855SPrzemek Kitszel ARRAY_SIZE(working_allowlist_opcodes)); 185*5de6c855SPrzemek Kitszel } 186*5de6c855SPrzemek Kitszel 187*5de6c855SPrzemek Kitszel /** 188*5de6c855SPrzemek Kitszel * ice_vc_set_caps_allowlist - allowlist VF opcodes according caps 189*5de6c855SPrzemek Kitszel * @vf: pointer to VF structure 190*5de6c855SPrzemek Kitszel */ 191*5de6c855SPrzemek Kitszel void ice_vc_set_caps_allowlist(struct ice_vf *vf) 192*5de6c855SPrzemek Kitszel { 193*5de6c855SPrzemek Kitszel unsigned long caps = vf->driver_caps; 194*5de6c855SPrzemek Kitszel unsigned int i; 195*5de6c855SPrzemek Kitszel 196*5de6c855SPrzemek Kitszel for_each_set_bit(i, &caps, ARRAY_SIZE(allowlist_opcodes)) 197*5de6c855SPrzemek Kitszel ice_vc_allowlist_opcodes(vf, allowlist_opcodes[i].opcodes, 198*5de6c855SPrzemek Kitszel allowlist_opcodes[i].size); 199*5de6c855SPrzemek Kitszel } 200