xref: /linux/net/core/netmem_priv.h (revision 334fbe734e687404f346eba7d5d96ed2b44d35ab)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 #ifndef __NETMEM_PRIV_H
4 #define __NETMEM_PRIV_H
5 
netmem_get_pp_magic(netmem_ref netmem)6 static inline unsigned long netmem_get_pp_magic(netmem_ref netmem)
7 {
8 	return netmem_to_nmdesc(netmem)->pp_magic & ~PP_DMA_INDEX_MASK;
9 }
10 
netmem_is_pp(netmem_ref netmem)11 static inline bool netmem_is_pp(netmem_ref netmem)
12 {
13 	struct page *page;
14 
15 	/* XXX: Now that the offset of page_type is shared between
16 	 * struct page and net_iov, just cast the netmem to struct page
17 	 * unconditionally by clearing NET_IOV if any, no matter whether
18 	 * it comes from struct net_iov or struct page.  This should be
19 	 * adjusted once the offset is no longer shared.
20 	 */
21 	page = (struct page *)((__force unsigned long)netmem & ~NET_IOV);
22 	return PageNetpp(page);
23 }
24 
netmem_set_pp(netmem_ref netmem,struct page_pool * pool)25 static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool)
26 {
27 	netmem_to_nmdesc(netmem)->pp = pool;
28 }
29 
netmem_set_dma_addr(netmem_ref netmem,unsigned long dma_addr)30 static inline void netmem_set_dma_addr(netmem_ref netmem,
31 				       unsigned long dma_addr)
32 {
33 	netmem_to_nmdesc(netmem)->dma_addr = dma_addr;
34 }
35 
netmem_get_dma_index(netmem_ref netmem)36 static inline unsigned long netmem_get_dma_index(netmem_ref netmem)
37 {
38 	unsigned long magic;
39 
40 	if (WARN_ON_ONCE(netmem_is_net_iov(netmem)))
41 		return 0;
42 
43 	magic = netmem_to_nmdesc(netmem)->pp_magic;
44 
45 	return (magic & PP_DMA_INDEX_MASK) >> PP_DMA_INDEX_SHIFT;
46 }
47 
netmem_set_dma_index(netmem_ref netmem,unsigned long id)48 static inline void netmem_set_dma_index(netmem_ref netmem,
49 					unsigned long id)
50 {
51 	unsigned long magic;
52 
53 	if (WARN_ON_ONCE(netmem_is_net_iov(netmem)))
54 		return;
55 
56 	magic = netmem_get_pp_magic(netmem) | (id << PP_DMA_INDEX_SHIFT);
57 	netmem_to_nmdesc(netmem)->pp_magic = magic;
58 }
59 #endif
60