14610ac93SAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause
24610ac93SAndrew Boyer * Copyright 2021-2024 Advanced Micro Devices, Inc.
34610ac93SAndrew Boyer */
44610ac93SAndrew Boyer
54610ac93SAndrew Boyer #ifndef _IONIC_CRYPTO_H_
64610ac93SAndrew Boyer #define _IONIC_CRYPTO_H_
74610ac93SAndrew Boyer
84610ac93SAndrew Boyer #include <stdint.h>
94610ac93SAndrew Boyer #include <stdbool.h>
104610ac93SAndrew Boyer #include <inttypes.h>
114610ac93SAndrew Boyer
124610ac93SAndrew Boyer #include <rte_common.h>
134610ac93SAndrew Boyer #include <rte_dev.h>
144610ac93SAndrew Boyer #include <rte_cryptodev.h>
154610ac93SAndrew Boyer #include <cryptodev_pmd.h>
164610ac93SAndrew Boyer #include <rte_log.h>
176bc7f2cfSAndrew Boyer #include <rte_bitmap.h>
184610ac93SAndrew Boyer
194610ac93SAndrew Boyer #include "ionic_common.h"
2025c896eaSAndrew Boyer #include "ionic_crypto_if.h"
214610ac93SAndrew Boyer #include "ionic_regs.h"
224610ac93SAndrew Boyer
234610ac93SAndrew Boyer /* Devargs */
244610ac93SAndrew Boyer /* NONE */
254610ac93SAndrew Boyer
262c1662bbSAndrew Boyer #define IOCPT_MAX_RING_DESC 32768
272c1662bbSAndrew Boyer #define IOCPT_MIN_RING_DESC 16
282c1662bbSAndrew Boyer #define IOCPT_ADMINQ_LENGTH 16 /* must be a power of two */
292c1662bbSAndrew Boyer
3080518852SAndrew Boyer #define IOCPT_CRYPTOQ_WAIT 10 /* 1s */
3180518852SAndrew Boyer
324610ac93SAndrew Boyer extern int iocpt_logtype;
334610ac93SAndrew Boyer #define RTE_LOGTYPE_IOCPT iocpt_logtype
344610ac93SAndrew Boyer
354610ac93SAndrew Boyer #define IOCPT_PRINT(level, ...) \
364610ac93SAndrew Boyer RTE_LOG_LINE_PREFIX(level, IOCPT, "%s(): ", __func__, __VA_ARGS__)
374610ac93SAndrew Boyer
384610ac93SAndrew Boyer #define IOCPT_PRINT_CALL() IOCPT_PRINT(DEBUG, " >>")
394610ac93SAndrew Boyer
40dddfb0d9SAndrew Boyer const struct rte_cryptodev_capabilities *iocpt_get_caps(uint64_t flags);
41dddfb0d9SAndrew Boyer
iocpt_struct_size_checks(void)4225c896eaSAndrew Boyer static inline void iocpt_struct_size_checks(void)
4325c896eaSAndrew Boyer {
4425c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_doorbell) != 8);
4525c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_intr) != 32);
4625c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_intr_status) != 8);
4725c896eaSAndrew Boyer
4825c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_regs) != 4096);
4925c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_info_regs) != 2048);
5025c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_cmd_regs) != 2048);
5125c896eaSAndrew Boyer
5225c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_admin_cmd) != 64);
5325c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_admin_comp) != 16);
5425c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_nop_cmd) != 64);
5525c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_nop_comp) != 16);
5625c896eaSAndrew Boyer
5725c896eaSAndrew Boyer /* Device commands */
5825c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_identify_cmd) != 64);
5925c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_identify_comp) != 16);
6025c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_reset_cmd) != 64);
6125c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_reset_comp) != 16);
6225c896eaSAndrew Boyer
6325c896eaSAndrew Boyer /* LIF commands */
6425c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_identify_cmd) != 64);
6525c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_identify_comp) != 16);
6625c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_init_cmd) != 64);
6725c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_init_comp) != 16);
6825c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_reset_cmd) != 64);
6925c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_getattr_cmd) != 64);
7025c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_getattr_comp) != 16);
7125c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_setattr_cmd) != 64);
7225c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_setattr_comp) != 16);
7325c896eaSAndrew Boyer
7425c896eaSAndrew Boyer /* Queue commands */
7525c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_identify_cmd) != 64);
7625c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_identify_comp) != 16);
7725c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_init_cmd) != 64);
7825c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_init_comp) != 16);
7925c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_control_cmd) != 64);
8025c896eaSAndrew Boyer
8125c896eaSAndrew Boyer /* Crypto */
8225c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_desc) != 32);
8325c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_sg_desc) != 256);
8425c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_comp) != 16);
8525c896eaSAndrew Boyer }
8625c896eaSAndrew Boyer
874610ac93SAndrew Boyer struct iocpt_dev_bars {
884610ac93SAndrew Boyer struct ionic_dev_bar bar[IONIC_BARS_MAX];
894610ac93SAndrew Boyer uint32_t num_bars;
904610ac93SAndrew Boyer };
914610ac93SAndrew Boyer
9254d56abaSAndrew Boyer /* Queue watchdog */
9354d56abaSAndrew Boyer #define IOCPT_Q_WDOG_SESS_IDX 0
9454d56abaSAndrew Boyer #define IOCPT_Q_WDOG_KEY_LEN 16
9554d56abaSAndrew Boyer #define IOCPT_Q_WDOG_IV_LEN 12
9654d56abaSAndrew Boyer #define IOCPT_Q_WDOG_PLD_LEN 4
9754d56abaSAndrew Boyer #define IOCPT_Q_WDOG_TAG_LEN 16
9854d56abaSAndrew Boyer #define IOCPT_Q_WDOG_OP_TYPE RTE_CRYPTO_OP_TYPE_UNDEFINED
9954d56abaSAndrew Boyer
100a677112dSAndrew Boyer struct iocpt_qtype_info {
101a677112dSAndrew Boyer uint8_t version;
102a677112dSAndrew Boyer uint8_t supported;
103a677112dSAndrew Boyer uint64_t features;
104a677112dSAndrew Boyer uint16_t desc_sz;
105a677112dSAndrew Boyer uint16_t comp_sz;
106a677112dSAndrew Boyer uint16_t sg_desc_sz;
107a677112dSAndrew Boyer uint16_t max_sg_elems;
108a677112dSAndrew Boyer uint16_t sg_desc_stride;
109a677112dSAndrew Boyer };
110a677112dSAndrew Boyer
1112c1662bbSAndrew Boyer #define IOCPT_Q_F_INITED BIT(0)
1122c1662bbSAndrew Boyer #define IOCPT_Q_F_DEFERRED BIT(1)
1132c1662bbSAndrew Boyer #define IOCPT_Q_F_SG BIT(2)
1142c1662bbSAndrew Boyer
1152c1662bbSAndrew Boyer #define Q_NEXT_TO_POST(_q, _n) (((_q)->head_idx + (_n)) & ((_q)->size_mask))
1162c1662bbSAndrew Boyer #define Q_NEXT_TO_SRVC(_q, _n) (((_q)->tail_idx + (_n)) & ((_q)->size_mask))
1172c1662bbSAndrew Boyer
1182c1662bbSAndrew Boyer #define IOCPT_INFO_SZ(_q) ((_q)->num_segs * sizeof(void *))
1192c1662bbSAndrew Boyer #define IOCPT_INFO_IDX(_q, _i) ((_i) * (_q)->num_segs)
1202c1662bbSAndrew Boyer #define IOCPT_INFO_PTR(_q, _i) (&(_q)->info[IOCPT_INFO_IDX((_q), _i)])
1212c1662bbSAndrew Boyer
1222c1662bbSAndrew Boyer struct iocpt_queue {
1232c1662bbSAndrew Boyer uint16_t num_descs;
1242c1662bbSAndrew Boyer uint16_t num_segs;
1252c1662bbSAndrew Boyer uint16_t head_idx;
1262c1662bbSAndrew Boyer uint16_t tail_idx;
1272c1662bbSAndrew Boyer uint16_t size_mask;
1282c1662bbSAndrew Boyer uint8_t type;
1292c1662bbSAndrew Boyer uint8_t hw_type;
1302c1662bbSAndrew Boyer void *base;
1312c1662bbSAndrew Boyer void *sg_base;
1322c1662bbSAndrew Boyer struct ionic_doorbell __iomem *db;
1332c1662bbSAndrew Boyer void **info;
1342c1662bbSAndrew Boyer
1352c1662bbSAndrew Boyer uint32_t index;
1362c1662bbSAndrew Boyer uint32_t hw_index;
1372c1662bbSAndrew Boyer rte_iova_t base_pa;
1382c1662bbSAndrew Boyer rte_iova_t sg_base_pa;
1392c1662bbSAndrew Boyer };
1402c1662bbSAndrew Boyer
1412c1662bbSAndrew Boyer struct iocpt_cq {
1422c1662bbSAndrew Boyer uint16_t tail_idx;
1432c1662bbSAndrew Boyer uint16_t num_descs;
1442c1662bbSAndrew Boyer uint16_t size_mask;
1452c1662bbSAndrew Boyer bool done_color;
1462c1662bbSAndrew Boyer void *base;
1472c1662bbSAndrew Boyer rte_iova_t base_pa;
1482c1662bbSAndrew Boyer };
1492c1662bbSAndrew Boyer
1502c1662bbSAndrew Boyer #define IOCPT_COMMON_FIELDS \
1512c1662bbSAndrew Boyer struct iocpt_queue q; \
1522c1662bbSAndrew Boyer struct iocpt_cq cq; \
1532c1662bbSAndrew Boyer struct iocpt_dev *dev; \
1542c1662bbSAndrew Boyer const struct rte_memzone *base_z; \
1552c1662bbSAndrew Boyer void *base; \
1562c1662bbSAndrew Boyer rte_iova_t base_pa
1572c1662bbSAndrew Boyer
1582c1662bbSAndrew Boyer struct iocpt_common_q {
1592c1662bbSAndrew Boyer IOCPT_COMMON_FIELDS;
1602c1662bbSAndrew Boyer };
1612c1662bbSAndrew Boyer
1622c1662bbSAndrew Boyer struct iocpt_admin_q {
1632c1662bbSAndrew Boyer IOCPT_COMMON_FIELDS;
1642c1662bbSAndrew Boyer
1652c1662bbSAndrew Boyer uint16_t flags;
1662c1662bbSAndrew Boyer };
1672c1662bbSAndrew Boyer
16880518852SAndrew Boyer struct iocpt_crypto_q {
16980518852SAndrew Boyer /* cacheline0, cacheline1 */
17080518852SAndrew Boyer IOCPT_COMMON_FIELDS;
17180518852SAndrew Boyer
17280518852SAndrew Boyer /* cacheline2 */
17354d56abaSAndrew Boyer uint64_t last_wdog_cycles;
17480518852SAndrew Boyer uint16_t flags;
17554d56abaSAndrew Boyer
17654d56abaSAndrew Boyer /* cacheline3 */
177*aacc5f13SAndrew Boyer struct rte_cryptodev_stats stats;
178*aacc5f13SAndrew Boyer
17954d56abaSAndrew Boyer uint64_t enqueued_wdogs;
18054d56abaSAndrew Boyer uint64_t dequeued_wdogs;
18154d56abaSAndrew Boyer uint8_t wdog_iv[IOCPT_Q_WDOG_IV_LEN];
18254d56abaSAndrew Boyer uint8_t wdog_pld[IOCPT_Q_WDOG_PLD_LEN];
18354d56abaSAndrew Boyer uint8_t wdog_tag[IOCPT_Q_WDOG_TAG_LEN];
18480518852SAndrew Boyer };
18580518852SAndrew Boyer
1866bc7f2cfSAndrew Boyer #define IOCPT_S_F_INITED BIT(0)
1876bc7f2cfSAndrew Boyer
1886bc7f2cfSAndrew Boyer struct iocpt_session_priv {
1896bc7f2cfSAndrew Boyer struct iocpt_dev *dev;
1906bc7f2cfSAndrew Boyer
1916bc7f2cfSAndrew Boyer uint32_t index;
1926bc7f2cfSAndrew Boyer
1936bc7f2cfSAndrew Boyer uint16_t iv_offset;
1946bc7f2cfSAndrew Boyer uint16_t iv_length;
1956bc7f2cfSAndrew Boyer uint16_t digest_length;
1966bc7f2cfSAndrew Boyer uint16_t aad_length;
1976bc7f2cfSAndrew Boyer
1986bc7f2cfSAndrew Boyer uint8_t flags;
1996bc7f2cfSAndrew Boyer uint8_t op;
2006bc7f2cfSAndrew Boyer uint8_t type;
2016bc7f2cfSAndrew Boyer
2026bc7f2cfSAndrew Boyer uint16_t key_len;
2036bc7f2cfSAndrew Boyer uint8_t key[IOCPT_SESS_KEY_LEN_MAX_SYMM];
2046bc7f2cfSAndrew Boyer };
2056bc7f2cfSAndrew Boyer
2066bc7f2cfSAndrew Boyer static inline uint32_t
iocpt_session_size(void)2076bc7f2cfSAndrew Boyer iocpt_session_size(void)
2086bc7f2cfSAndrew Boyer {
2096bc7f2cfSAndrew Boyer return sizeof(struct iocpt_session_priv);
2106bc7f2cfSAndrew Boyer }
2116bc7f2cfSAndrew Boyer
2124610ac93SAndrew Boyer #define IOCPT_DEV_F_INITED BIT(0)
2134610ac93SAndrew Boyer #define IOCPT_DEV_F_UP BIT(1)
2144610ac93SAndrew Boyer #define IOCPT_DEV_F_FW_RESET BIT(2)
2154610ac93SAndrew Boyer
2164610ac93SAndrew Boyer /* Combined dev / LIF object */
2174610ac93SAndrew Boyer struct iocpt_dev {
2184610ac93SAndrew Boyer const char *name;
21925c896eaSAndrew Boyer char fw_version[IOCPT_FWVERS_BUFLEN];
2204610ac93SAndrew Boyer struct iocpt_dev_bars bars;
221a677112dSAndrew Boyer struct iocpt_identity ident;
2224610ac93SAndrew Boyer
2234610ac93SAndrew Boyer const struct iocpt_dev_intf *intf;
2244610ac93SAndrew Boyer void *bus_dev;
2254610ac93SAndrew Boyer struct rte_cryptodev *crypto_dev;
2264610ac93SAndrew Boyer
22725c896eaSAndrew Boyer union iocpt_dev_info_regs __iomem *dev_info;
22825c896eaSAndrew Boyer union iocpt_dev_cmd_regs __iomem *dev_cmd;
22925c896eaSAndrew Boyer
23025c896eaSAndrew Boyer struct ionic_doorbell __iomem *db_pages;
23125c896eaSAndrew Boyer struct ionic_intr __iomem *intr_ctrl;
23225c896eaSAndrew Boyer
2334610ac93SAndrew Boyer uint32_t max_qps;
2344610ac93SAndrew Boyer uint32_t max_sessions;
2354610ac93SAndrew Boyer uint16_t state;
2364610ac93SAndrew Boyer uint8_t driver_id;
2374610ac93SAndrew Boyer uint8_t socket_id;
2384610ac93SAndrew Boyer
2392c1662bbSAndrew Boyer rte_spinlock_t adminq_lock;
2402c1662bbSAndrew Boyer rte_spinlock_t adminq_service_lock;
2412c1662bbSAndrew Boyer
2422c1662bbSAndrew Boyer struct iocpt_admin_q *adminq;
24380518852SAndrew Boyer struct iocpt_crypto_q **cryptoqs;
2442c1662bbSAndrew Boyer
2456bc7f2cfSAndrew Boyer struct rte_bitmap *sess_bm; /* SET bit indicates index is free */
2466bc7f2cfSAndrew Boyer
2474610ac93SAndrew Boyer uint64_t features;
2484610ac93SAndrew Boyer uint32_t hw_features;
249a677112dSAndrew Boyer
250a677112dSAndrew Boyer uint32_t info_sz;
251a677112dSAndrew Boyer struct iocpt_lif_info *info;
252a677112dSAndrew Boyer rte_iova_t info_pa;
253a677112dSAndrew Boyer const struct rte_memzone *info_z;
254a677112dSAndrew Boyer
255a677112dSAndrew Boyer struct iocpt_qtype_info qtype_info[IOCPT_QTYPE_MAX];
256a677112dSAndrew Boyer uint8_t qtype_ver[IOCPT_QTYPE_MAX];
257*aacc5f13SAndrew Boyer
258*aacc5f13SAndrew Boyer struct rte_cryptodev_stats stats_base;
2594610ac93SAndrew Boyer };
2604610ac93SAndrew Boyer
2614610ac93SAndrew Boyer struct iocpt_dev_intf {
2624610ac93SAndrew Boyer int (*setup_bars)(struct iocpt_dev *dev);
2634610ac93SAndrew Boyer void (*unmap_bars)(struct iocpt_dev *dev);
2644610ac93SAndrew Boyer };
2654610ac93SAndrew Boyer
2664610ac93SAndrew Boyer static inline int
iocpt_setup_bars(struct iocpt_dev * dev)2674610ac93SAndrew Boyer iocpt_setup_bars(struct iocpt_dev *dev)
2684610ac93SAndrew Boyer {
2694610ac93SAndrew Boyer if (dev->intf->setup_bars == NULL)
2704610ac93SAndrew Boyer return -EINVAL;
2714610ac93SAndrew Boyer
2724610ac93SAndrew Boyer return (*dev->intf->setup_bars)(dev);
2734610ac93SAndrew Boyer }
2744610ac93SAndrew Boyer
2752c1662bbSAndrew Boyer /** iocpt_admin_ctx - Admin command context.
2762c1662bbSAndrew Boyer * @pending_work: Flag that indicates a completion.
2772c1662bbSAndrew Boyer * @cmd: Admin command (64B) to be copied to the queue.
2782c1662bbSAndrew Boyer * @comp: Admin completion (16B) copied from the queue.
2792c1662bbSAndrew Boyer */
2802c1662bbSAndrew Boyer struct iocpt_admin_ctx {
2812c1662bbSAndrew Boyer bool pending_work;
2822c1662bbSAndrew Boyer union iocpt_adminq_cmd cmd;
2832c1662bbSAndrew Boyer union iocpt_adminq_comp comp;
2842c1662bbSAndrew Boyer };
2852c1662bbSAndrew Boyer
2864610ac93SAndrew Boyer int iocpt_probe(void *bus_dev, struct rte_device *rte_dev,
2874610ac93SAndrew Boyer struct iocpt_dev_bars *bars, const struct iocpt_dev_intf *intf,
2884610ac93SAndrew Boyer uint8_t driver_id, uint8_t socket_id);
2894610ac93SAndrew Boyer int iocpt_remove(struct rte_device *rte_dev);
2904610ac93SAndrew Boyer
2914610ac93SAndrew Boyer void iocpt_configure(struct iocpt_dev *dev);
292dddfb0d9SAndrew Boyer int iocpt_assign_ops(struct rte_cryptodev *cdev);
29380518852SAndrew Boyer int iocpt_start(struct iocpt_dev *dev);
29480518852SAndrew Boyer void iocpt_stop(struct iocpt_dev *dev);
2954610ac93SAndrew Boyer void iocpt_deinit(struct iocpt_dev *dev);
2964610ac93SAndrew Boyer
297a677112dSAndrew Boyer int iocpt_dev_identify(struct iocpt_dev *dev);
298a677112dSAndrew Boyer int iocpt_dev_init(struct iocpt_dev *dev, rte_iova_t info_pa);
2992c1662bbSAndrew Boyer int iocpt_dev_adminq_init(struct iocpt_dev *dev);
300a677112dSAndrew Boyer void iocpt_dev_reset(struct iocpt_dev *dev);
301a677112dSAndrew Boyer
3022c1662bbSAndrew Boyer int iocpt_adminq_post_wait(struct iocpt_dev *dev, struct iocpt_admin_ctx *ctx);
3032c1662bbSAndrew Boyer
30480518852SAndrew Boyer int iocpt_cryptoq_alloc(struct iocpt_dev *dev, uint32_t socket_id,
30580518852SAndrew Boyer uint32_t index, uint16_t ndescs);
30680518852SAndrew Boyer void iocpt_cryptoq_free(struct iocpt_crypto_q *cptq);
30780518852SAndrew Boyer
3086bc7f2cfSAndrew Boyer int iocpt_session_init(struct iocpt_session_priv *priv);
3096bc7f2cfSAndrew Boyer int iocpt_session_update(struct iocpt_session_priv *priv);
3106bc7f2cfSAndrew Boyer void iocpt_session_deinit(struct iocpt_session_priv *priv);
3116bc7f2cfSAndrew Boyer
3122c1662bbSAndrew Boyer struct ionic_doorbell __iomem *iocpt_db_map(struct iocpt_dev *dev,
3132c1662bbSAndrew Boyer struct iocpt_queue *q);
3142c1662bbSAndrew Boyer
3152c1662bbSAndrew Boyer typedef bool (*iocpt_cq_cb)(struct iocpt_cq *cq, uint16_t cq_desc_index,
3162c1662bbSAndrew Boyer void *cb_arg);
3172c1662bbSAndrew Boyer uint32_t iocpt_cq_service(struct iocpt_cq *cq, uint32_t work_to_do,
3182c1662bbSAndrew Boyer iocpt_cq_cb cb, void *cb_arg);
3192c1662bbSAndrew Boyer
320*aacc5f13SAndrew Boyer void iocpt_get_stats(const struct iocpt_dev *dev,
321*aacc5f13SAndrew Boyer struct rte_cryptodev_stats *stats);
322*aacc5f13SAndrew Boyer void iocpt_reset_stats(struct iocpt_dev *dev);
323*aacc5f13SAndrew Boyer
3242c1662bbSAndrew Boyer static inline uint16_t
iocpt_q_space_avail(struct iocpt_queue * q)3252c1662bbSAndrew Boyer iocpt_q_space_avail(struct iocpt_queue *q)
3262c1662bbSAndrew Boyer {
3272c1662bbSAndrew Boyer uint16_t avail = q->tail_idx;
3282c1662bbSAndrew Boyer
3292c1662bbSAndrew Boyer if (q->head_idx >= avail)
3302c1662bbSAndrew Boyer avail += q->num_descs - q->head_idx - 1;
3312c1662bbSAndrew Boyer else
3322c1662bbSAndrew Boyer avail -= q->head_idx + 1;
3332c1662bbSAndrew Boyer
3342c1662bbSAndrew Boyer return avail;
3352c1662bbSAndrew Boyer }
3362c1662bbSAndrew Boyer
3372c1662bbSAndrew Boyer static inline void
iocpt_q_flush(struct iocpt_queue * q)3382c1662bbSAndrew Boyer iocpt_q_flush(struct iocpt_queue *q)
3392c1662bbSAndrew Boyer {
3402c1662bbSAndrew Boyer uint64_t val = IONIC_DBELL_QID(q->hw_index) | q->head_idx;
3412c1662bbSAndrew Boyer
3422c1662bbSAndrew Boyer #if defined(RTE_LIBRTE_IONIC_PMD_BARRIER_ERRATA)
3432c1662bbSAndrew Boyer /* On some devices the standard 'dmb' barrier is insufficient */
3442c1662bbSAndrew Boyer asm volatile("dsb st" : : : "memory");
3452c1662bbSAndrew Boyer rte_write64_relaxed(rte_cpu_to_le_64(val), q->db);
3462c1662bbSAndrew Boyer #else
3472c1662bbSAndrew Boyer rte_write64(rte_cpu_to_le_64(val), q->db);
3482c1662bbSAndrew Boyer #endif
3492c1662bbSAndrew Boyer }
3502c1662bbSAndrew Boyer
3514610ac93SAndrew Boyer static inline bool
iocpt_is_embedded(void)3524610ac93SAndrew Boyer iocpt_is_embedded(void)
3534610ac93SAndrew Boyer {
3544610ac93SAndrew Boyer #if defined(RTE_LIBRTE_IONIC_PMD_EMBEDDED)
3554610ac93SAndrew Boyer return true;
3564610ac93SAndrew Boyer #else
3574610ac93SAndrew Boyer return false;
3584610ac93SAndrew Boyer #endif
3594610ac93SAndrew Boyer }
3604610ac93SAndrew Boyer
3614610ac93SAndrew Boyer #endif /* _IONIC_CRYPTO_H_ */
362