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