18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef NFP_BPF_FW_H
58c2ecf20Sopenharmony_ci#define NFP_BPF_FW_H 1
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/bitops.h>
88c2ecf20Sopenharmony_ci#include <linux/types.h>
98c2ecf20Sopenharmony_ci#include "../ccm.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/* Kernel's enum bpf_reg_type is not uABI so people may change it breaking
128c2ecf20Sopenharmony_ci * our FW ABI.  In that case we will do translation in the driver.
138c2ecf20Sopenharmony_ci */
148c2ecf20Sopenharmony_ci#define NFP_BPF_SCALAR_VALUE		1
158c2ecf20Sopenharmony_ci#define NFP_BPF_MAP_VALUE		4
168c2ecf20Sopenharmony_ci#define NFP_BPF_STACK			5
178c2ecf20Sopenharmony_ci#define NFP_BPF_PACKET_DATA		7
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cienum bpf_cap_tlv_type {
208c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_FUNC		= 1,
218c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_ADJUST_HEAD	= 2,
228c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_MAPS		= 3,
238c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_RANDOM		= 4,
248c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_QUEUE_SELECT	= 5,
258c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_ADJUST_TAIL	= 6,
268c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_ABI_VERSION	= 7,
278c2ecf20Sopenharmony_ci	NFP_BPF_CAP_TYPE_CMSG_MULTI_ENT	= 8,
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistruct nfp_bpf_cap_tlv_func {
318c2ecf20Sopenharmony_ci	__le32 func_id;
328c2ecf20Sopenharmony_ci	__le32 func_addr;
338c2ecf20Sopenharmony_ci};
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistruct nfp_bpf_cap_tlv_adjust_head {
368c2ecf20Sopenharmony_ci	__le32 flags;
378c2ecf20Sopenharmony_ci	__le32 off_min;
388c2ecf20Sopenharmony_ci	__le32 off_max;
398c2ecf20Sopenharmony_ci	__le32 guaranteed_sub;
408c2ecf20Sopenharmony_ci	__le32 guaranteed_add;
418c2ecf20Sopenharmony_ci};
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#define NFP_BPF_ADJUST_HEAD_NO_META	BIT(0)
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistruct nfp_bpf_cap_tlv_maps {
468c2ecf20Sopenharmony_ci	__le32 types;
478c2ecf20Sopenharmony_ci	__le32 max_maps;
488c2ecf20Sopenharmony_ci	__le32 max_elems;
498c2ecf20Sopenharmony_ci	__le32 max_key_sz;
508c2ecf20Sopenharmony_ci	__le32 max_val_sz;
518c2ecf20Sopenharmony_ci	__le32 max_elem_sz;
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci/*
558c2ecf20Sopenharmony_ci * Types defined for map related control messages
568c2ecf20Sopenharmony_ci */
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci/* BPF ABIv2 fixed-length control message fields */
598c2ecf20Sopenharmony_ci#define CMSG_MAP_KEY_LW			16
608c2ecf20Sopenharmony_ci#define CMSG_MAP_VALUE_LW		16
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cienum nfp_bpf_cmsg_status {
638c2ecf20Sopenharmony_ci	CMSG_RC_SUCCESS			= 0,
648c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_FD		= 1,
658c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_NOENT		= 2,
668c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_ERR		= 3,
678c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_PARSE		= 4,
688c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_EXIST		= 5,
698c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_NOMEM		= 6,
708c2ecf20Sopenharmony_ci	CMSG_RC_ERR_MAP_E2BIG		= 7,
718c2ecf20Sopenharmony_ci};
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistruct cmsg_reply_map_simple {
748c2ecf20Sopenharmony_ci	struct nfp_ccm_hdr hdr;
758c2ecf20Sopenharmony_ci	__be32 rc;
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cistruct cmsg_req_map_alloc_tbl {
798c2ecf20Sopenharmony_ci	struct nfp_ccm_hdr hdr;
808c2ecf20Sopenharmony_ci	__be32 key_size;		/* in bytes */
818c2ecf20Sopenharmony_ci	__be32 value_size;		/* in bytes */
828c2ecf20Sopenharmony_ci	__be32 max_entries;
838c2ecf20Sopenharmony_ci	__be32 map_type;
848c2ecf20Sopenharmony_ci	__be32 map_flags;		/* reserved */
858c2ecf20Sopenharmony_ci};
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cistruct cmsg_reply_map_alloc_tbl {
888c2ecf20Sopenharmony_ci	struct cmsg_reply_map_simple reply_hdr;
898c2ecf20Sopenharmony_ci	__be32 tid;
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistruct cmsg_req_map_free_tbl {
938c2ecf20Sopenharmony_ci	struct nfp_ccm_hdr hdr;
948c2ecf20Sopenharmony_ci	__be32 tid;
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistruct cmsg_reply_map_free_tbl {
988c2ecf20Sopenharmony_ci	struct cmsg_reply_map_simple reply_hdr;
998c2ecf20Sopenharmony_ci	__be32 count;
1008c2ecf20Sopenharmony_ci};
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cistruct cmsg_req_map_op {
1038c2ecf20Sopenharmony_ci	struct nfp_ccm_hdr hdr;
1048c2ecf20Sopenharmony_ci	__be32 tid;
1058c2ecf20Sopenharmony_ci	__be32 count;
1068c2ecf20Sopenharmony_ci	__be32 flags;
1078c2ecf20Sopenharmony_ci	u8 data[];
1088c2ecf20Sopenharmony_ci};
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistruct cmsg_reply_map_op {
1118c2ecf20Sopenharmony_ci	struct cmsg_reply_map_simple reply_hdr;
1128c2ecf20Sopenharmony_ci	__be32 count;
1138c2ecf20Sopenharmony_ci	__be32 resv;
1148c2ecf20Sopenharmony_ci	u8 data[];
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cistruct cmsg_bpf_event {
1188c2ecf20Sopenharmony_ci	struct nfp_ccm_hdr hdr;
1198c2ecf20Sopenharmony_ci	__be32 cpu_id;
1208c2ecf20Sopenharmony_ci	__be64 map_ptr;
1218c2ecf20Sopenharmony_ci	__be32 data_size;
1228c2ecf20Sopenharmony_ci	__be32 pkt_size;
1238c2ecf20Sopenharmony_ci	u8 data[];
1248c2ecf20Sopenharmony_ci};
1258c2ecf20Sopenharmony_ci#endif
126