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 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 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 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 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 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 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 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 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 *); 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 } 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