xref: /linux/net/core/devmem.h (revision 170aafe35cb98e0f3fbacb446ea86389fbce22ea)
1*170aafe3SMina Almasry /* SPDX-License-Identifier: GPL-2.0-or-later */
2*170aafe3SMina Almasry /*
3*170aafe3SMina Almasry  * Device memory TCP support
4*170aafe3SMina Almasry  *
5*170aafe3SMina Almasry  * Authors:	Mina Almasry <almasrymina@google.com>
6*170aafe3SMina Almasry  *		Willem de Bruijn <willemb@google.com>
7*170aafe3SMina Almasry  *		Kaiyuan Zhang <kaiyuanz@google.com>
8*170aafe3SMina Almasry  *
9*170aafe3SMina Almasry  */
10*170aafe3SMina Almasry #ifndef _NET_DEVMEM_H
11*170aafe3SMina Almasry #define _NET_DEVMEM_H
12*170aafe3SMina Almasry 
13*170aafe3SMina Almasry struct netlink_ext_ack;
14*170aafe3SMina Almasry 
15*170aafe3SMina Almasry struct net_devmem_dmabuf_binding {
16*170aafe3SMina Almasry 	struct dma_buf *dmabuf;
17*170aafe3SMina Almasry 	struct dma_buf_attachment *attachment;
18*170aafe3SMina Almasry 	struct sg_table *sgt;
19*170aafe3SMina Almasry 	struct net_device *dev;
20*170aafe3SMina Almasry 	struct gen_pool *chunk_pool;
21*170aafe3SMina Almasry 
22*170aafe3SMina Almasry 	/* The user holds a ref (via the netlink API) for as long as they want
23*170aafe3SMina Almasry 	 * the binding to remain alive. Each page pool using this binding holds
24*170aafe3SMina Almasry 	 * a ref to keep the binding alive. Each allocated net_iov holds a
25*170aafe3SMina Almasry 	 * ref.
26*170aafe3SMina Almasry 	 *
27*170aafe3SMina Almasry 	 * The binding undos itself and unmaps the underlying dmabuf once all
28*170aafe3SMina Almasry 	 * those refs are dropped and the binding is no longer desired or in
29*170aafe3SMina Almasry 	 * use.
30*170aafe3SMina Almasry 	 */
31*170aafe3SMina Almasry 	refcount_t ref;
32*170aafe3SMina Almasry 
33*170aafe3SMina Almasry 	/* The list of bindings currently active. Used for netlink to notify us
34*170aafe3SMina Almasry 	 * of the user dropping the bind.
35*170aafe3SMina Almasry 	 */
36*170aafe3SMina Almasry 	struct list_head list;
37*170aafe3SMina Almasry 
38*170aafe3SMina Almasry 	/* rxq's this binding is active on. */
39*170aafe3SMina Almasry 	struct xarray bound_rxqs;
40*170aafe3SMina Almasry 
41*170aafe3SMina Almasry 	/* ID of this binding. Globally unique to all bindings currently
42*170aafe3SMina Almasry 	 * active.
43*170aafe3SMina Almasry 	 */
44*170aafe3SMina Almasry 	u32 id;
45*170aafe3SMina Almasry };
46*170aafe3SMina Almasry 
47*170aafe3SMina Almasry #if defined(CONFIG_NET_DEVMEM)
48*170aafe3SMina Almasry /* Owner of the dma-buf chunks inserted into the gen pool. Each scatterlist
49*170aafe3SMina Almasry  * entry from the dmabuf is inserted into the genpool as a chunk, and needs
50*170aafe3SMina Almasry  * this owner struct to keep track of some metadata necessary to create
51*170aafe3SMina Almasry  * allocations from this chunk.
52*170aafe3SMina Almasry  */
53*170aafe3SMina Almasry struct dmabuf_genpool_chunk_owner {
54*170aafe3SMina Almasry 	/* Offset into the dma-buf where this chunk starts.  */
55*170aafe3SMina Almasry 	unsigned long base_virtual;
56*170aafe3SMina Almasry 
57*170aafe3SMina Almasry 	/* dma_addr of the start of the chunk.  */
58*170aafe3SMina Almasry 	dma_addr_t base_dma_addr;
59*170aafe3SMina Almasry 
60*170aafe3SMina Almasry 	/* Array of net_iovs for this chunk. */
61*170aafe3SMina Almasry 	struct net_iov *niovs;
62*170aafe3SMina Almasry 	size_t num_niovs;
63*170aafe3SMina Almasry 
64*170aafe3SMina Almasry 	struct net_devmem_dmabuf_binding *binding;
65*170aafe3SMina Almasry };
66*170aafe3SMina Almasry 
67*170aafe3SMina Almasry void __net_devmem_dmabuf_binding_free(struct net_devmem_dmabuf_binding *binding);
68*170aafe3SMina Almasry struct net_devmem_dmabuf_binding *
69*170aafe3SMina Almasry net_devmem_bind_dmabuf(struct net_device *dev, unsigned int dmabuf_fd,
70*170aafe3SMina Almasry 		       struct netlink_ext_ack *extack);
71*170aafe3SMina Almasry void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding);
72*170aafe3SMina Almasry int net_devmem_bind_dmabuf_to_queue(struct net_device *dev, u32 rxq_idx,
73*170aafe3SMina Almasry 				    struct net_devmem_dmabuf_binding *binding,
74*170aafe3SMina Almasry 				    struct netlink_ext_ack *extack);
75*170aafe3SMina Almasry void dev_dmabuf_uninstall(struct net_device *dev);
76*170aafe3SMina Almasry 
77*170aafe3SMina Almasry static inline void
78*170aafe3SMina Almasry net_devmem_dmabuf_binding_get(struct net_devmem_dmabuf_binding *binding)
79*170aafe3SMina Almasry {
80*170aafe3SMina Almasry 	refcount_inc(&binding->ref);
81*170aafe3SMina Almasry }
82*170aafe3SMina Almasry 
83*170aafe3SMina Almasry static inline void
84*170aafe3SMina Almasry net_devmem_dmabuf_binding_put(struct net_devmem_dmabuf_binding *binding)
85*170aafe3SMina Almasry {
86*170aafe3SMina Almasry 	if (!refcount_dec_and_test(&binding->ref))
87*170aafe3SMina Almasry 		return;
88*170aafe3SMina Almasry 
89*170aafe3SMina Almasry 	__net_devmem_dmabuf_binding_free(binding);
90*170aafe3SMina Almasry }
91*170aafe3SMina Almasry 
92*170aafe3SMina Almasry #else
93*170aafe3SMina Almasry static inline void
94*170aafe3SMina Almasry __net_devmem_dmabuf_binding_free(struct net_devmem_dmabuf_binding *binding)
95*170aafe3SMina Almasry {
96*170aafe3SMina Almasry }
97*170aafe3SMina Almasry 
98*170aafe3SMina Almasry static inline struct net_devmem_dmabuf_binding *
99*170aafe3SMina Almasry net_devmem_bind_dmabuf(struct net_device *dev, unsigned int dmabuf_fd,
100*170aafe3SMina Almasry 		       struct netlink_ext_ack *extack)
101*170aafe3SMina Almasry {
102*170aafe3SMina Almasry 	return ERR_PTR(-EOPNOTSUPP);
103*170aafe3SMina Almasry }
104*170aafe3SMina Almasry 
105*170aafe3SMina Almasry static inline void
106*170aafe3SMina Almasry net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding)
107*170aafe3SMina Almasry {
108*170aafe3SMina Almasry }
109*170aafe3SMina Almasry 
110*170aafe3SMina Almasry static inline int
111*170aafe3SMina Almasry net_devmem_bind_dmabuf_to_queue(struct net_device *dev, u32 rxq_idx,
112*170aafe3SMina Almasry 				struct net_devmem_dmabuf_binding *binding,
113*170aafe3SMina Almasry 				struct netlink_ext_ack *extack)
114*170aafe3SMina Almasry 
115*170aafe3SMina Almasry {
116*170aafe3SMina Almasry 	return -EOPNOTSUPP;
117*170aafe3SMina Almasry }
118*170aafe3SMina Almasry 
119*170aafe3SMina Almasry static inline void dev_dmabuf_uninstall(struct net_device *dev)
120*170aafe3SMina Almasry {
121*170aafe3SMina Almasry }
122*170aafe3SMina Almasry #endif
123*170aafe3SMina Almasry 
124*170aafe3SMina Almasry #endif /* _NET_DEVMEM_H */
125