1 | /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ |
2 | /* Copyright (C) 2016-2019 Netronome Systems, Inc. */ |
3 | |
4 | #ifndef NFP_CCM_H |
5 | #define NFP_CCM_H 1 |
6 | |
7 | #include <linux/bitmap.h> |
8 | #include <linux/skbuff.h> |
9 | #include <linux/wait.h> |
10 | |
11 | struct nfp_app; |
12 | struct nfp_net; |
13 | |
14 | /* Firmware ABI */ |
15 | |
16 | enum nfp_ccm_type { |
17 | NFP_CCM_TYPE_BPF_MAP_ALLOC = 1, |
18 | NFP_CCM_TYPE_BPF_MAP_FREE = 2, |
19 | NFP_CCM_TYPE_BPF_MAP_LOOKUP = 3, |
20 | NFP_CCM_TYPE_BPF_MAP_UPDATE = 4, |
21 | NFP_CCM_TYPE_BPF_MAP_DELETE = 5, |
22 | NFP_CCM_TYPE_BPF_MAP_GETNEXT = 6, |
23 | NFP_CCM_TYPE_BPF_MAP_GETFIRST = 7, |
24 | NFP_CCM_TYPE_BPF_BPF_EVENT = 8, |
25 | NFP_CCM_TYPE_CRYPTO_RESET = 9, |
26 | NFP_CCM_TYPE_CRYPTO_ADD = 10, |
27 | NFP_CCM_TYPE_CRYPTO_DEL = 11, |
28 | NFP_CCM_TYPE_CRYPTO_UPDATE = 12, |
29 | NFP_CCM_TYPE_CRYPTO_RESYNC = 13, |
30 | __NFP_CCM_TYPE_MAX, |
31 | }; |
32 | |
33 | #define NFP_CCM_ABI_VERSION 1 |
34 | |
35 | #define NFP_CCM_TYPE_REPLY_BIT 7 |
36 | #define __NFP_CCM_REPLY(req) (BIT(NFP_CCM_TYPE_REPLY_BIT) | (req)) |
37 | |
38 | struct nfp_ccm_hdr { |
39 | union { |
40 | struct { |
41 | u8 type; |
42 | u8 ver; |
43 | __be16 tag; |
44 | }; |
45 | __be32 raw; |
46 | }; |
47 | }; |
48 | |
49 | static inline u8 nfp_ccm_get_type(struct sk_buff *skb) |
50 | { |
51 | struct nfp_ccm_hdr *hdr; |
52 | |
53 | hdr = (struct nfp_ccm_hdr *)skb->data; |
54 | |
55 | return hdr->type; |
56 | } |
57 | |
58 | static inline __be16 __nfp_ccm_get_tag(struct sk_buff *skb) |
59 | { |
60 | struct nfp_ccm_hdr *hdr; |
61 | |
62 | hdr = (struct nfp_ccm_hdr *)skb->data; |
63 | |
64 | return hdr->tag; |
65 | } |
66 | |
67 | static inline unsigned int nfp_ccm_get_tag(struct sk_buff *skb) |
68 | { |
69 | return be16_to_cpu(__nfp_ccm_get_tag(skb)); |
70 | } |
71 | |
72 | #define NFP_NET_MBOX_TLV_TYPE GENMASK(31, 16) |
73 | #define NFP_NET_MBOX_TLV_LEN GENMASK(15, 0) |
74 | |
75 | enum nfp_ccm_mbox_tlv_type { |
76 | NFP_NET_MBOX_TLV_TYPE_UNKNOWN = 0, |
77 | NFP_NET_MBOX_TLV_TYPE_END = 1, |
78 | NFP_NET_MBOX_TLV_TYPE_MSG = 2, |
79 | NFP_NET_MBOX_TLV_TYPE_MSG_NOSUP = 3, |
80 | NFP_NET_MBOX_TLV_TYPE_RESV = 4, |
81 | }; |
82 | |
83 | /* Implementation */ |
84 | |
85 | /** |
86 | * struct nfp_ccm - common control message handling |
87 | * @app: APP handle |
88 | * |
89 | * @tag_allocator: bitmap of control message tags in use |
90 | * @tag_alloc_next: next tag bit to allocate |
91 | * @tag_alloc_last: next tag bit to be freed |
92 | * |
93 | * @replies: received cmsg replies waiting to be consumed |
94 | * @wq: work queue for waiting for cmsg replies |
95 | */ |
96 | struct nfp_ccm { |
97 | struct nfp_app *app; |
98 | |
99 | DECLARE_BITMAP(tag_allocator, U16_MAX + 1); |
100 | u16 tag_alloc_next; |
101 | u16 tag_alloc_last; |
102 | |
103 | struct sk_buff_head replies; |
104 | wait_queue_head_t wq; |
105 | }; |
106 | |
107 | int nfp_ccm_init(struct nfp_ccm *ccm, struct nfp_app *app); |
108 | void nfp_ccm_clean(struct nfp_ccm *ccm); |
109 | void nfp_ccm_rx(struct nfp_ccm *ccm, struct sk_buff *skb); |
110 | struct sk_buff * |
111 | nfp_ccm_communicate(struct nfp_ccm *ccm, struct sk_buff *skb, |
112 | enum nfp_ccm_type type, unsigned int reply_size); |
113 | |
114 | int nfp_ccm_mbox_alloc(struct nfp_net *nn); |
115 | void nfp_ccm_mbox_free(struct nfp_net *nn); |
116 | int nfp_ccm_mbox_init(struct nfp_net *nn); |
117 | void nfp_ccm_mbox_clean(struct nfp_net *nn); |
118 | bool nfp_ccm_mbox_fits(struct nfp_net *nn, unsigned int size); |
119 | struct sk_buff * |
120 | nfp_ccm_mbox_msg_alloc(struct nfp_net *nn, unsigned int req_size, |
121 | unsigned int reply_size, gfp_t flags); |
122 | int __nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb, |
123 | enum nfp_ccm_type type, |
124 | unsigned int reply_size, |
125 | unsigned int max_reply_size, bool critical); |
126 | int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb, |
127 | enum nfp_ccm_type type, |
128 | unsigned int reply_size, |
129 | unsigned int max_reply_size); |
130 | int nfp_ccm_mbox_post(struct nfp_net *nn, struct sk_buff *skb, |
131 | enum nfp_ccm_type type, unsigned int max_reply_size); |
132 | #endif |
133 | |