blob: 6d0ffa82659454ab55417a255a67ab1ea15a6637 [file] [log] [blame]
Prabhakar Kushwahaa2a55e52015-03-19 09:20:45 -07001/*
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.) */
14struct 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
33enum dpaa_fd_format {
34 dpaa_fd_single = 0,
35 dpaa_fd_list,
36 dpaa_fd_sg
37};
38
39static 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
45static 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
51static inline u32 ldpaa_fd_get_len(const struct dpaa_fd *fd)
52{
53 return fd->simple.len;
54}
55
56static inline void ldpaa_fd_set_len(struct dpaa_fd *fd, u32 len)
57{
58 fd->simple.len = len;
59}
60
61static 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
66static 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
72static inline uint16_t ldpaa_fd_get_bpid(const struct dpaa_fd *fd)
73{
74 return (uint16_t)(fd->simple.bpid_offset & 0xFFFF);
75}
76
77static 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. */
88struct 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
100uint32_t ldpaa_dq_flags(const struct ldpaa_dq *);
101static inline int ldpaa_dq_is_pull(const struct ldpaa_dq *dq)
102{
103 return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_VOLATILE);
104}
105static 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 */
111uint16_t ldpaa_dq_seqnum(const struct ldpaa_dq *);
112uint16_t ldpaa_dq_odpid(const struct ldpaa_dq *);
113uint32_t ldpaa_dq_fqid(const struct ldpaa_dq *);
114uint32_t ldpaa_dq_byte_count(const struct ldpaa_dq *);
115uint32_t ldpaa_dq_frame_count(const struct ldpaa_dq *);
116uint32_t ldpaa_dq_fqd_ctx_hi(const struct ldpaa_dq *);
117uint32_t ldpaa_dq_fqd_ctx_lo(const struct ldpaa_dq *);
118/* get the Frame Descriptor */
119const struct dpaa_fd *ldpaa_dq_fd(const struct ldpaa_dq *);
120
121#endif /* __FSL_DPAA_FD_H */