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> 174610ac93SAndrew Boyer 184610ac93SAndrew Boyer #include "ionic_common.h" 19*25c896eaSAndrew Boyer #include "ionic_crypto_if.h" 204610ac93SAndrew Boyer #include "ionic_regs.h" 214610ac93SAndrew Boyer 224610ac93SAndrew Boyer /* Devargs */ 234610ac93SAndrew Boyer /* NONE */ 244610ac93SAndrew Boyer 254610ac93SAndrew Boyer extern int iocpt_logtype; 264610ac93SAndrew Boyer #define RTE_LOGTYPE_IOCPT iocpt_logtype 274610ac93SAndrew Boyer 284610ac93SAndrew Boyer #define IOCPT_PRINT(level, ...) \ 294610ac93SAndrew Boyer RTE_LOG_LINE_PREFIX(level, IOCPT, "%s(): ", __func__, __VA_ARGS__) 304610ac93SAndrew Boyer 314610ac93SAndrew Boyer #define IOCPT_PRINT_CALL() IOCPT_PRINT(DEBUG, " >>") 324610ac93SAndrew Boyer 33*25c896eaSAndrew Boyer static inline void iocpt_struct_size_checks(void) 34*25c896eaSAndrew Boyer { 35*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_doorbell) != 8); 36*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_intr) != 32); 37*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct ionic_intr_status) != 8); 38*25c896eaSAndrew Boyer 39*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_regs) != 4096); 40*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_info_regs) != 2048); 41*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(union iocpt_dev_cmd_regs) != 2048); 42*25c896eaSAndrew Boyer 43*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_admin_cmd) != 64); 44*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_admin_comp) != 16); 45*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_nop_cmd) != 64); 46*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_nop_comp) != 16); 47*25c896eaSAndrew Boyer 48*25c896eaSAndrew Boyer /* Device commands */ 49*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_identify_cmd) != 64); 50*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_identify_comp) != 16); 51*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_reset_cmd) != 64); 52*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_dev_reset_comp) != 16); 53*25c896eaSAndrew Boyer 54*25c896eaSAndrew Boyer /* LIF commands */ 55*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_identify_cmd) != 64); 56*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_identify_comp) != 16); 57*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_init_cmd) != 64); 58*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_init_comp) != 16); 59*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_reset_cmd) != 64); 60*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_getattr_cmd) != 64); 61*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_getattr_comp) != 16); 62*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_setattr_cmd) != 64); 63*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_lif_setattr_comp) != 16); 64*25c896eaSAndrew Boyer 65*25c896eaSAndrew Boyer /* Queue commands */ 66*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_identify_cmd) != 64); 67*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_identify_comp) != 16); 68*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_init_cmd) != 64); 69*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_init_comp) != 16); 70*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_q_control_cmd) != 64); 71*25c896eaSAndrew Boyer 72*25c896eaSAndrew Boyer /* Crypto */ 73*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_desc) != 32); 74*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_sg_desc) != 256); 75*25c896eaSAndrew Boyer RTE_BUILD_BUG_ON(sizeof(struct iocpt_crypto_comp) != 16); 76*25c896eaSAndrew Boyer } 77*25c896eaSAndrew Boyer 784610ac93SAndrew Boyer struct iocpt_dev_bars { 794610ac93SAndrew Boyer struct ionic_dev_bar bar[IONIC_BARS_MAX]; 804610ac93SAndrew Boyer uint32_t num_bars; 814610ac93SAndrew Boyer }; 824610ac93SAndrew Boyer 834610ac93SAndrew Boyer #define IOCPT_DEV_F_INITED BIT(0) 844610ac93SAndrew Boyer #define IOCPT_DEV_F_UP BIT(1) 854610ac93SAndrew Boyer #define IOCPT_DEV_F_FW_RESET BIT(2) 864610ac93SAndrew Boyer 874610ac93SAndrew Boyer /* Combined dev / LIF object */ 884610ac93SAndrew Boyer struct iocpt_dev { 894610ac93SAndrew Boyer const char *name; 90*25c896eaSAndrew Boyer char fw_version[IOCPT_FWVERS_BUFLEN]; 914610ac93SAndrew Boyer struct iocpt_dev_bars bars; 924610ac93SAndrew Boyer 934610ac93SAndrew Boyer const struct iocpt_dev_intf *intf; 944610ac93SAndrew Boyer void *bus_dev; 954610ac93SAndrew Boyer struct rte_cryptodev *crypto_dev; 964610ac93SAndrew Boyer 97*25c896eaSAndrew Boyer union iocpt_dev_info_regs __iomem *dev_info; 98*25c896eaSAndrew Boyer union iocpt_dev_cmd_regs __iomem *dev_cmd; 99*25c896eaSAndrew Boyer 100*25c896eaSAndrew Boyer struct ionic_doorbell __iomem *db_pages; 101*25c896eaSAndrew Boyer struct ionic_intr __iomem *intr_ctrl; 102*25c896eaSAndrew Boyer 1034610ac93SAndrew Boyer uint32_t max_qps; 1044610ac93SAndrew Boyer uint32_t max_sessions; 1054610ac93SAndrew Boyer uint16_t state; 1064610ac93SAndrew Boyer uint8_t driver_id; 1074610ac93SAndrew Boyer uint8_t socket_id; 1084610ac93SAndrew Boyer 1094610ac93SAndrew Boyer uint64_t features; 1104610ac93SAndrew Boyer uint32_t hw_features; 1114610ac93SAndrew Boyer }; 1124610ac93SAndrew Boyer 1134610ac93SAndrew Boyer struct iocpt_dev_intf { 1144610ac93SAndrew Boyer int (*setup_bars)(struct iocpt_dev *dev); 1154610ac93SAndrew Boyer void (*unmap_bars)(struct iocpt_dev *dev); 1164610ac93SAndrew Boyer }; 1174610ac93SAndrew Boyer 1184610ac93SAndrew Boyer static inline int 1194610ac93SAndrew Boyer iocpt_setup_bars(struct iocpt_dev *dev) 1204610ac93SAndrew Boyer { 1214610ac93SAndrew Boyer if (dev->intf->setup_bars == NULL) 1224610ac93SAndrew Boyer return -EINVAL; 1234610ac93SAndrew Boyer 1244610ac93SAndrew Boyer return (*dev->intf->setup_bars)(dev); 1254610ac93SAndrew Boyer } 1264610ac93SAndrew Boyer 1274610ac93SAndrew Boyer int iocpt_probe(void *bus_dev, struct rte_device *rte_dev, 1284610ac93SAndrew Boyer struct iocpt_dev_bars *bars, const struct iocpt_dev_intf *intf, 1294610ac93SAndrew Boyer uint8_t driver_id, uint8_t socket_id); 1304610ac93SAndrew Boyer int iocpt_remove(struct rte_device *rte_dev); 1314610ac93SAndrew Boyer 1324610ac93SAndrew Boyer void iocpt_configure(struct iocpt_dev *dev); 1334610ac93SAndrew Boyer void iocpt_deinit(struct iocpt_dev *dev); 1344610ac93SAndrew Boyer 1354610ac93SAndrew Boyer static inline bool 1364610ac93SAndrew Boyer iocpt_is_embedded(void) 1374610ac93SAndrew Boyer { 1384610ac93SAndrew Boyer #if defined(RTE_LIBRTE_IONIC_PMD_EMBEDDED) 1394610ac93SAndrew Boyer return true; 1404610ac93SAndrew Boyer #else 1414610ac93SAndrew Boyer return false; 1424610ac93SAndrew Boyer #endif 1434610ac93SAndrew Boyer } 1444610ac93SAndrew Boyer 1454610ac93SAndrew Boyer #endif /* _IONIC_CRYPTO_H_ */ 146