fsl_dpaa_fd.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (C) 2014 Freescale Semiconductor
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #ifndef __FSL_DPAA_FD_H
  7. #define __FSL_DPAA_FD_H
  8. /* Place-holder for FDs, we represent it via the simplest form that we need for
  9. * now. Different overlays may be needed to support different options, etc. (It
  10. * is impractical to define One True Struct, because the resulting encoding
  11. * routines (lots of read-modify-writes) would be worst-case performance whether
  12. * or not circumstances required them.) */
  13. struct dpaa_fd {
  14. union {
  15. u32 words[8];
  16. struct dpaa_fd_simple {
  17. u32 addr_lo;
  18. u32 addr_hi;
  19. u32 len;
  20. /* offset in the MS 16 bits, BPID in the LS 16 bits */
  21. u32 bpid_offset;
  22. u32 frc; /* frame context */
  23. /* "err", "va", "cbmt", "asal", [...] */
  24. u32 ctrl;
  25. /* flow context */
  26. u32 flc_lo;
  27. u32 flc_hi;
  28. } simple;
  29. };
  30. };
  31. enum dpaa_fd_format {
  32. dpaa_fd_single = 0,
  33. dpaa_fd_list,
  34. dpaa_fd_sg
  35. };
  36. static inline u64 ldpaa_fd_get_addr(const struct dpaa_fd *fd)
  37. {
  38. return (u64)((((uint64_t)fd->simple.addr_hi) << 32)
  39. + fd->simple.addr_lo);
  40. }
  41. static inline void ldpaa_fd_set_addr(struct dpaa_fd *fd, u64 addr)
  42. {
  43. fd->simple.addr_hi = upper_32_bits(addr);
  44. fd->simple.addr_lo = lower_32_bits(addr);
  45. }
  46. static inline u32 ldpaa_fd_get_len(const struct dpaa_fd *fd)
  47. {
  48. return fd->simple.len;
  49. }
  50. static inline void ldpaa_fd_set_len(struct dpaa_fd *fd, u32 len)
  51. {
  52. fd->simple.len = len;
  53. }
  54. static inline uint16_t ldpaa_fd_get_offset(const struct dpaa_fd *fd)
  55. {
  56. return (uint16_t)(fd->simple.bpid_offset >> 16) & 0x0FFF;
  57. }
  58. static inline void ldpaa_fd_set_offset(struct dpaa_fd *fd, uint16_t offset)
  59. {
  60. fd->simple.bpid_offset &= 0xF000FFFF;
  61. fd->simple.bpid_offset |= (u32)offset << 16;
  62. }
  63. static inline uint16_t ldpaa_fd_get_bpid(const struct dpaa_fd *fd)
  64. {
  65. return (uint16_t)(fd->simple.bpid_offset & 0xFFFF);
  66. }
  67. static inline void ldpaa_fd_set_bpid(struct dpaa_fd *fd, uint16_t bpid)
  68. {
  69. fd->simple.bpid_offset &= 0xFFFF0000;
  70. fd->simple.bpid_offset |= (u32)bpid;
  71. }
  72. /* When frames are dequeued, the FDs show up inside "dequeue" result structures
  73. * (if at all, not all dequeue results contain valid FDs). This structure type
  74. * is intentionally defined without internal detail, and the only reason it
  75. * isn't declared opaquely (without size) is to allow the user to provide
  76. * suitably-sized (and aligned) memory for these entries. */
  77. struct ldpaa_dq {
  78. uint32_t dont_manipulate_directly[16];
  79. };
  80. /* Parsing frame dequeue results */
  81. #define LDPAA_DQ_STAT_FQEMPTY 0x80
  82. #define LDPAA_DQ_STAT_HELDACTIVE 0x40
  83. #define LDPAA_DQ_STAT_FORCEELIGIBLE 0x20
  84. #define LDPAA_DQ_STAT_VALIDFRAME 0x10
  85. #define LDPAA_DQ_STAT_ODPVALID 0x04
  86. #define LDPAA_DQ_STAT_VOLATILE 0x02
  87. #define LDPAA_DQ_STAT_EXPIRED 0x01
  88. uint32_t ldpaa_dq_flags(const struct ldpaa_dq *);
  89. static inline int ldpaa_dq_is_pull(const struct ldpaa_dq *dq)
  90. {
  91. return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_VOLATILE);
  92. }
  93. static inline int ldpaa_dq_is_pull_complete(
  94. const struct ldpaa_dq *dq)
  95. {
  96. return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_EXPIRED);
  97. }
  98. /* seqnum/odpid are valid only if VALIDFRAME and ODPVALID flags are TRUE */
  99. uint16_t ldpaa_dq_seqnum(const struct ldpaa_dq *);
  100. uint16_t ldpaa_dq_odpid(const struct ldpaa_dq *);
  101. uint32_t ldpaa_dq_fqid(const struct ldpaa_dq *);
  102. uint32_t ldpaa_dq_byte_count(const struct ldpaa_dq *);
  103. uint32_t ldpaa_dq_frame_count(const struct ldpaa_dq *);
  104. uint32_t ldpaa_dq_fqd_ctx_hi(const struct ldpaa_dq *);
  105. uint32_t ldpaa_dq_fqd_ctx_lo(const struct ldpaa_dq *);
  106. /* get the Frame Descriptor */
  107. const struct dpaa_fd *ldpaa_dq_fd(const struct ldpaa_dq *);
  108. #endif /* __FSL_DPAA_FD_H */