xref: /linux/drivers/net/ethernet/intel/ice/virt/allowlist.c (revision 07fdad3a93756b872da7b53647715c48d0f4a2d0)
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