dpdk/drivers/crypto/nitrox/nitrox_qp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(C) 2019 Marvell International Ltd.
   3 */
   4
   5#ifndef _NITROX_QP_H_
   6#define _NITROX_QP_H_
   7
   8#include <stdbool.h>
   9
  10#include <rte_io.h>
  11
  12struct nitrox_softreq;
  13
  14struct command_queue {
  15        const struct rte_memzone *mz;
  16        uint8_t *dbell_csr_addr;
  17        uint8_t *ring;
  18        uint8_t instr_size;
  19};
  20
  21struct rid {
  22        struct nitrox_softreq *sr;
  23};
  24
  25struct nitrox_qp {
  26        struct command_queue cmdq;
  27        struct rid *ridq;
  28        uint32_t count;
  29        uint32_t head;
  30        uint32_t tail;
  31        struct rte_mempool *sr_mp;
  32        struct rte_cryptodev_stats stats;
  33        uint16_t qno;
  34        rte_atomic16_t pending_count;
  35};
  36
  37static inline uint16_t
  38nitrox_qp_free_count(struct nitrox_qp *qp)
  39{
  40        uint16_t pending_count = rte_atomic16_read(&qp->pending_count);
  41
  42        RTE_ASSERT(qp->count >= pending_count);
  43        return (qp->count - pending_count);
  44}
  45
  46static inline bool
  47nitrox_qp_is_empty(struct nitrox_qp *qp)
  48{
  49        return (rte_atomic16_read(&qp->pending_count) == 0);
  50}
  51
  52static inline uint16_t
  53nitrox_qp_used_count(struct nitrox_qp *qp)
  54{
  55        return rte_atomic16_read(&qp->pending_count);
  56}
  57
  58static inline struct nitrox_softreq *
  59nitrox_qp_get_softreq(struct nitrox_qp *qp)
  60{
  61        uint32_t tail = qp->tail % qp->count;
  62
  63        rte_smp_rmb();
  64        return qp->ridq[tail].sr;
  65}
  66
  67static inline void
  68nitrox_ring_dbell(struct nitrox_qp *qp, uint16_t cnt)
  69{
  70        struct command_queue *cmdq = &qp->cmdq;
  71
  72        if (!cnt)
  73                return;
  74
  75        rte_io_wmb();
  76        rte_write64(cnt, cmdq->dbell_csr_addr);
  77}
  78
  79static inline void
  80nitrox_qp_enqueue(struct nitrox_qp *qp, void *instr, struct nitrox_softreq *sr)
  81{
  82        uint32_t head = qp->head % qp->count;
  83
  84        qp->head++;
  85        memcpy(&qp->cmdq.ring[head * qp->cmdq.instr_size],
  86               instr, qp->cmdq.instr_size);
  87        qp->ridq[head].sr = sr;
  88        rte_smp_wmb();
  89        rte_atomic16_inc(&qp->pending_count);
  90}
  91
  92static inline void
  93nitrox_qp_dequeue(struct nitrox_qp *qp)
  94{
  95        qp->tail++;
  96        rte_atomic16_dec(&qp->pending_count);
  97}
  98
  99int nitrox_qp_setup(struct nitrox_qp *qp, uint8_t *bar_addr,
 100                    const char *dev_name, uint32_t nb_descriptors,
 101                    uint8_t inst_size, int socket_id);
 102int nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr);
 103
 104#endif /* _NITROX_QP_H_ */
 105