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