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