1 /* 2 * Copyright (C) 2017 Netronome Systems, Inc. 3 * 4 * This software is dual licensed under the GNU General License Version 2, 5 * June 1991 as shown in the file COPYING in the top-level directory of this 6 * source tree or the BSD 2-Clause License provided below. You have the 7 * option to license this software under the complete terms of either license. 8 * 9 * The BSD 2-Clause License: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * 1. Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * 2. Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34 #ifndef NFP_BPF_FW_H 35 #define NFP_BPF_FW_H 1 36 37 #include <linux/bitops.h> 38 #include <linux/types.h> 39 40 enum bpf_cap_tlv_type { 41 NFP_BPF_CAP_TYPE_FUNC = 1, 42 NFP_BPF_CAP_TYPE_ADJUST_HEAD = 2, 43 NFP_BPF_CAP_TYPE_MAPS = 3, 44 NFP_BPF_CAP_TYPE_RANDOM = 4, 45 }; 46 47 struct nfp_bpf_cap_tlv_func { 48 __le32 func_id; 49 __le32 func_addr; 50 }; 51 52 struct nfp_bpf_cap_tlv_adjust_head { 53 __le32 flags; 54 __le32 off_min; 55 __le32 off_max; 56 __le32 guaranteed_sub; 57 __le32 guaranteed_add; 58 }; 59 60 #define NFP_BPF_ADJUST_HEAD_NO_META BIT(0) 61 62 struct nfp_bpf_cap_tlv_maps { 63 __le32 types; 64 __le32 max_maps; 65 __le32 max_elems; 66 __le32 max_key_sz; 67 __le32 max_val_sz; 68 __le32 max_elem_sz; 69 }; 70 71 /* 72 * Types defined for map related control messages 73 */ 74 #define CMSG_MAP_ABI_VERSION 1 75 76 enum nfp_bpf_cmsg_type { 77 CMSG_TYPE_MAP_ALLOC = 1, 78 CMSG_TYPE_MAP_FREE = 2, 79 CMSG_TYPE_MAP_LOOKUP = 3, 80 CMSG_TYPE_MAP_UPDATE = 4, 81 CMSG_TYPE_MAP_DELETE = 5, 82 CMSG_TYPE_MAP_GETNEXT = 6, 83 CMSG_TYPE_MAP_GETFIRST = 7, 84 __CMSG_TYPE_MAP_MAX, 85 }; 86 87 #define CMSG_TYPE_MAP_REPLY_BIT 7 88 #define __CMSG_REPLY(req) (BIT(CMSG_TYPE_MAP_REPLY_BIT) | (req)) 89 90 #define CMSG_MAP_KEY_LW 16 91 #define CMSG_MAP_VALUE_LW 16 92 93 enum nfp_bpf_cmsg_status { 94 CMSG_RC_SUCCESS = 0, 95 CMSG_RC_ERR_MAP_FD = 1, 96 CMSG_RC_ERR_MAP_NOENT = 2, 97 CMSG_RC_ERR_MAP_ERR = 3, 98 CMSG_RC_ERR_MAP_PARSE = 4, 99 CMSG_RC_ERR_MAP_EXIST = 5, 100 CMSG_RC_ERR_MAP_NOMEM = 6, 101 CMSG_RC_ERR_MAP_E2BIG = 7, 102 }; 103 104 struct cmsg_hdr { 105 u8 type; 106 u8 ver; 107 __be16 tag; 108 }; 109 110 struct cmsg_reply_map_simple { 111 struct cmsg_hdr hdr; 112 __be32 rc; 113 }; 114 115 struct cmsg_req_map_alloc_tbl { 116 struct cmsg_hdr hdr; 117 __be32 key_size; /* in bytes */ 118 __be32 value_size; /* in bytes */ 119 __be32 max_entries; 120 __be32 map_type; 121 __be32 map_flags; /* reserved */ 122 }; 123 124 struct cmsg_reply_map_alloc_tbl { 125 struct cmsg_reply_map_simple reply_hdr; 126 __be32 tid; 127 }; 128 129 struct cmsg_req_map_free_tbl { 130 struct cmsg_hdr hdr; 131 __be32 tid; 132 }; 133 134 struct cmsg_reply_map_free_tbl { 135 struct cmsg_reply_map_simple reply_hdr; 136 __be32 count; 137 }; 138 139 struct cmsg_key_value_pair { 140 __be32 key[CMSG_MAP_KEY_LW]; 141 __be32 value[CMSG_MAP_VALUE_LW]; 142 }; 143 144 struct cmsg_req_map_op { 145 struct cmsg_hdr hdr; 146 __be32 tid; 147 __be32 count; 148 __be32 flags; 149 struct cmsg_key_value_pair elem[0]; 150 }; 151 152 struct cmsg_reply_map_op { 153 struct cmsg_reply_map_simple reply_hdr; 154 __be32 count; 155 __be32 resv; 156 struct cmsg_key_value_pair elem[0]; 157 }; 158 #endif 159