xref: /openbmc/u-boot/include/fsl-mc/fsl_dpaa_fd.h (revision a65b25d1)
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 
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.) */
14 struct dpaa_fd {
15 	union {
16 		u32 words[8];
17 		struct dpaa_fd_simple {
18 			u32 addr_lo;
19 			u32 addr_hi;
20 			u32 len;
21 			/* offset in the MS 16 bits, BPID in the LS 16 bits */
22 			u32 bpid_offset;
23 			u32 frc; /* frame context */
24 			/* "err", "va", "cbmt", "asal", [...] */
25 			u32 ctrl;
26 			/* flow context */
27 			u32 flc_lo;
28 			u32 flc_hi;
29 		} simple;
30 	};
31 };
32 
33 enum dpaa_fd_format {
34 	dpaa_fd_single = 0,
35 	dpaa_fd_list,
36 	dpaa_fd_sg
37 };
38 
39 static inline u64 ldpaa_fd_get_addr(const struct dpaa_fd *fd)
40 {
41 	return (u64)((((uint64_t)fd->simple.addr_hi) << 32)
42 				+ fd->simple.addr_lo);
43 }
44 
45 static inline void ldpaa_fd_set_addr(struct dpaa_fd *fd, u64 addr)
46 {
47 	fd->simple.addr_hi = upper_32_bits(addr);
48 	fd->simple.addr_lo = lower_32_bits(addr);
49 }
50 
51 static inline u32 ldpaa_fd_get_len(const struct dpaa_fd *fd)
52 {
53 	return fd->simple.len;
54 }
55 
56 static inline void ldpaa_fd_set_len(struct dpaa_fd *fd, u32 len)
57 {
58 	fd->simple.len = len;
59 }
60 
61 static inline uint16_t ldpaa_fd_get_offset(const struct dpaa_fd *fd)
62 {
63 	return (uint16_t)(fd->simple.bpid_offset >> 16) & 0x0FFF;
64 }
65 
66 static inline void ldpaa_fd_set_offset(struct dpaa_fd *fd, uint16_t offset)
67 {
68 	fd->simple.bpid_offset &= 0xF000FFFF;
69 	fd->simple.bpid_offset |= (u32)offset << 16;
70 }
71 
72 static inline uint16_t ldpaa_fd_get_bpid(const struct dpaa_fd *fd)
73 {
74 	return (uint16_t)(fd->simple.bpid_offset & 0xFFFF);
75 }
76 
77 static inline void ldpaa_fd_set_bpid(struct dpaa_fd *fd, uint16_t bpid)
78 {
79 	fd->simple.bpid_offset &= 0xFFFF0000;
80 	fd->simple.bpid_offset |= (u32)bpid;
81 }
82 
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. */
88 struct ldpaa_dq {
89 	uint32_t dont_manipulate_directly[16];
90 };
91 
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)
102 {
103 	return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_VOLATILE);
104 }
105 static inline int ldpaa_dq_is_pull_complete(
106 					const struct ldpaa_dq *dq)
107 {
108 	return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_EXPIRED);
109 }
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 *);
120 
121 #endif /* __FSL_DPAA_FD_H */
122