]>
git.ipfire.org Git - people/ms/u-boot.git/blob - include/fsl-mc/fsl_dpaa_fd.h
2 * Copyright (C) 2014 Freescale Semiconductor
4 * SPDX-License-Identifier: GPL-2.0+
6 #ifndef __FSL_DPAA_FD_H
7 #define __FSL_DPAA_FD_H
9 /* Place-holder for FDs, we represent it via the simplest form that we need for
10 * now. Different overlays may be needed to support different options, etc. (It
11 * is impractical to define One True Struct, because the resulting encoding
12 * routines (lots of read-modify-writes) would be worst-case performance whether
13 * or not circumstances required them.) */
17 struct dpaa_fd_simple
{
21 /* offset in the MS 16 bits, BPID in the LS 16 bits */
23 u32 frc
; /* frame context */
24 /* "err", "va", "cbmt", "asal", [...] */
39 static inline u64
ldpaa_fd_get_addr(const struct dpaa_fd
*fd
)
41 return (u64
)((((uint64_t)fd
->simple
.addr_hi
) << 32)
42 + fd
->simple
.addr_lo
);
45 static inline void ldpaa_fd_set_addr(struct dpaa_fd
*fd
, u64 addr
)
47 fd
->simple
.addr_hi
= upper_32_bits(addr
);
48 fd
->simple
.addr_lo
= lower_32_bits(addr
);
51 static inline u32
ldpaa_fd_get_len(const struct dpaa_fd
*fd
)
53 return fd
->simple
.len
;
56 static inline void ldpaa_fd_set_len(struct dpaa_fd
*fd
, u32 len
)
61 static inline uint16_t ldpaa_fd_get_offset(const struct dpaa_fd
*fd
)
63 return (uint16_t)(fd
->simple
.bpid_offset
>> 16) & 0x0FFF;
66 static inline void ldpaa_fd_set_offset(struct dpaa_fd
*fd
, uint16_t offset
)
68 fd
->simple
.bpid_offset
&= 0xF000FFFF;
69 fd
->simple
.bpid_offset
|= (u32
)offset
<< 16;
72 static inline uint16_t ldpaa_fd_get_bpid(const struct dpaa_fd
*fd
)
74 return (uint16_t)(fd
->simple
.bpid_offset
& 0xFFFF);
77 static inline void ldpaa_fd_set_bpid(struct dpaa_fd
*fd
, uint16_t bpid
)
79 fd
->simple
.bpid_offset
&= 0xFFFF0000;
80 fd
->simple
.bpid_offset
|= (u32
)bpid
;
83 /* When frames are dequeued, the FDs show up inside "dequeue" result structures
84 * (if at all, not all dequeue results contain valid FDs). This structure type
85 * is intentionally defined without internal detail, and the only reason it
86 * isn't declared opaquely (without size) is to allow the user to provide
87 * suitably-sized (and aligned) memory for these entries. */
89 uint32_t dont_manipulate_directly
[16];
92 /* Parsing frame dequeue results */
93 #define LDPAA_DQ_STAT_FQEMPTY 0x80
94 #define LDPAA_DQ_STAT_HELDACTIVE 0x40
95 #define LDPAA_DQ_STAT_FORCEELIGIBLE 0x20
96 #define LDPAA_DQ_STAT_VALIDFRAME 0x10
97 #define LDPAA_DQ_STAT_ODPVALID 0x04
98 #define LDPAA_DQ_STAT_VOLATILE 0x02
99 #define LDPAA_DQ_STAT_EXPIRED 0x01
100 uint32_t ldpaa_dq_flags(const struct ldpaa_dq
*);
101 static inline int ldpaa_dq_is_pull(const struct ldpaa_dq
*dq
)
103 return (int)(ldpaa_dq_flags(dq
) & LDPAA_DQ_STAT_VOLATILE
);
105 static inline int ldpaa_dq_is_pull_complete(
106 const struct ldpaa_dq
*dq
)
108 return (int)(ldpaa_dq_flags(dq
) & LDPAA_DQ_STAT_EXPIRED
);
110 /* seqnum/odpid are valid only if VALIDFRAME and ODPVALID flags are TRUE */
111 uint16_t ldpaa_dq_seqnum(const struct ldpaa_dq
*);
112 uint16_t ldpaa_dq_odpid(const struct ldpaa_dq
*);
113 uint32_t ldpaa_dq_fqid(const struct ldpaa_dq
*);
114 uint32_t ldpaa_dq_byte_count(const struct ldpaa_dq
*);
115 uint32_t ldpaa_dq_frame_count(const struct ldpaa_dq
*);
116 uint32_t ldpaa_dq_fqd_ctx_hi(const struct ldpaa_dq
*);
117 uint32_t ldpaa_dq_fqd_ctx_lo(const struct ldpaa_dq
*);
118 /* get the Frame Descriptor */
119 const struct dpaa_fd
*ldpaa_dq_fd(const struct ldpaa_dq
*);
121 #endif /* __FSL_DPAA_FD_H */