netmem_priv.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __NETMEM_PRIV_H
  3. #define __NETMEM_PRIV_H
  4. static inline unsigned long netmem_get_pp_magic(netmem_ref netmem)
  5. {
  6. return __netmem_clear_lsb(netmem)->pp_magic & ~PP_DMA_INDEX_MASK;
  7. }
  8. static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic)
  9. {
  10. __netmem_clear_lsb(netmem)->pp_magic |= pp_magic;
  11. }
  12. static inline void netmem_clear_pp_magic(netmem_ref netmem)
  13. {
  14. WARN_ON_ONCE(__netmem_clear_lsb(netmem)->pp_magic & PP_DMA_INDEX_MASK);
  15. __netmem_clear_lsb(netmem)->pp_magic = 0;
  16. }
  17. static inline bool netmem_is_pp(netmem_ref netmem)
  18. {
  19. return (netmem_get_pp_magic(netmem) & PP_MAGIC_MASK) == PP_SIGNATURE;
  20. }
  21. static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool)
  22. {
  23. __netmem_clear_lsb(netmem)->pp = pool;
  24. }
  25. static inline void netmem_set_dma_addr(netmem_ref netmem,
  26. unsigned long dma_addr)
  27. {
  28. __netmem_clear_lsb(netmem)->dma_addr = dma_addr;
  29. }
  30. static inline unsigned long netmem_get_dma_index(netmem_ref netmem)
  31. {
  32. unsigned long magic;
  33. if (WARN_ON_ONCE(netmem_is_net_iov(netmem)))
  34. return 0;
  35. magic = __netmem_clear_lsb(netmem)->pp_magic;
  36. return (magic & PP_DMA_INDEX_MASK) >> PP_DMA_INDEX_SHIFT;
  37. }
  38. static inline void netmem_set_dma_index(netmem_ref netmem,
  39. unsigned long id)
  40. {
  41. unsigned long magic;
  42. if (WARN_ON_ONCE(netmem_is_net_iov(netmem)))
  43. return;
  44. magic = netmem_get_pp_magic(netmem) | (id << PP_DMA_INDEX_SHIFT);
  45. __netmem_clear_lsb(netmem)->pp_magic = magic;
  46. }
  47. #endif