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)6static 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)11static 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)25static 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)30static 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)36static 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)48static 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