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