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