xref: /dpdk/drivers/crypto/ionic/ionic_crypto.h (revision 25c896ea6c406f9b4c5c2fec111a34103dbbec5d)
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