xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/netronome/nfp/bpf/fw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2*4882a593Smuzhiyun /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef NFP_BPF_FW_H
5*4882a593Smuzhiyun #define NFP_BPF_FW_H 1
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/bitops.h>
8*4882a593Smuzhiyun #include <linux/types.h>
9*4882a593Smuzhiyun #include "../ccm.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /* Kernel's enum bpf_reg_type is not uABI so people may change it breaking
12*4882a593Smuzhiyun  * our FW ABI.  In that case we will do translation in the driver.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun #define NFP_BPF_SCALAR_VALUE		1
15*4882a593Smuzhiyun #define NFP_BPF_MAP_VALUE		4
16*4882a593Smuzhiyun #define NFP_BPF_STACK			6
17*4882a593Smuzhiyun #define NFP_BPF_PACKET_DATA		8
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun enum bpf_cap_tlv_type {
20*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_FUNC		= 1,
21*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_ADJUST_HEAD	= 2,
22*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_MAPS		= 3,
23*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_RANDOM		= 4,
24*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_QUEUE_SELECT	= 5,
25*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_ADJUST_TAIL	= 6,
26*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_ABI_VERSION	= 7,
27*4882a593Smuzhiyun 	NFP_BPF_CAP_TYPE_CMSG_MULTI_ENT	= 8,
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun struct nfp_bpf_cap_tlv_func {
31*4882a593Smuzhiyun 	__le32 func_id;
32*4882a593Smuzhiyun 	__le32 func_addr;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun struct nfp_bpf_cap_tlv_adjust_head {
36*4882a593Smuzhiyun 	__le32 flags;
37*4882a593Smuzhiyun 	__le32 off_min;
38*4882a593Smuzhiyun 	__le32 off_max;
39*4882a593Smuzhiyun 	__le32 guaranteed_sub;
40*4882a593Smuzhiyun 	__le32 guaranteed_add;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define NFP_BPF_ADJUST_HEAD_NO_META	BIT(0)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun struct nfp_bpf_cap_tlv_maps {
46*4882a593Smuzhiyun 	__le32 types;
47*4882a593Smuzhiyun 	__le32 max_maps;
48*4882a593Smuzhiyun 	__le32 max_elems;
49*4882a593Smuzhiyun 	__le32 max_key_sz;
50*4882a593Smuzhiyun 	__le32 max_val_sz;
51*4882a593Smuzhiyun 	__le32 max_elem_sz;
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /*
55*4882a593Smuzhiyun  * Types defined for map related control messages
56*4882a593Smuzhiyun  */
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* BPF ABIv2 fixed-length control message fields */
59*4882a593Smuzhiyun #define CMSG_MAP_KEY_LW			16
60*4882a593Smuzhiyun #define CMSG_MAP_VALUE_LW		16
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun enum nfp_bpf_cmsg_status {
63*4882a593Smuzhiyun 	CMSG_RC_SUCCESS			= 0,
64*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_FD		= 1,
65*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_NOENT		= 2,
66*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_ERR		= 3,
67*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_PARSE		= 4,
68*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_EXIST		= 5,
69*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_NOMEM		= 6,
70*4882a593Smuzhiyun 	CMSG_RC_ERR_MAP_E2BIG		= 7,
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun struct cmsg_reply_map_simple {
74*4882a593Smuzhiyun 	struct nfp_ccm_hdr hdr;
75*4882a593Smuzhiyun 	__be32 rc;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun struct cmsg_req_map_alloc_tbl {
79*4882a593Smuzhiyun 	struct nfp_ccm_hdr hdr;
80*4882a593Smuzhiyun 	__be32 key_size;		/* in bytes */
81*4882a593Smuzhiyun 	__be32 value_size;		/* in bytes */
82*4882a593Smuzhiyun 	__be32 max_entries;
83*4882a593Smuzhiyun 	__be32 map_type;
84*4882a593Smuzhiyun 	__be32 map_flags;		/* reserved */
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct cmsg_reply_map_alloc_tbl {
88*4882a593Smuzhiyun 	struct cmsg_reply_map_simple reply_hdr;
89*4882a593Smuzhiyun 	__be32 tid;
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct cmsg_req_map_free_tbl {
93*4882a593Smuzhiyun 	struct nfp_ccm_hdr hdr;
94*4882a593Smuzhiyun 	__be32 tid;
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct cmsg_reply_map_free_tbl {
98*4882a593Smuzhiyun 	struct cmsg_reply_map_simple reply_hdr;
99*4882a593Smuzhiyun 	__be32 count;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct cmsg_req_map_op {
103*4882a593Smuzhiyun 	struct nfp_ccm_hdr hdr;
104*4882a593Smuzhiyun 	__be32 tid;
105*4882a593Smuzhiyun 	__be32 count;
106*4882a593Smuzhiyun 	__be32 flags;
107*4882a593Smuzhiyun 	u8 data[];
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun struct cmsg_reply_map_op {
111*4882a593Smuzhiyun 	struct cmsg_reply_map_simple reply_hdr;
112*4882a593Smuzhiyun 	__be32 count;
113*4882a593Smuzhiyun 	__be32 resv;
114*4882a593Smuzhiyun 	u8 data[];
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct cmsg_bpf_event {
118*4882a593Smuzhiyun 	struct nfp_ccm_hdr hdr;
119*4882a593Smuzhiyun 	__be32 cpu_id;
120*4882a593Smuzhiyun 	__be64 map_ptr;
121*4882a593Smuzhiyun 	__be32 data_size;
122*4882a593Smuzhiyun 	__be32 pkt_size;
123*4882a593Smuzhiyun 	u8 data[];
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun #endif
126