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