xref: /openbmc/linux/drivers/crypto/marvell/octeontx2/otx2_cpt_common.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
15e8ce833SSrujana Challa /* SPDX-License-Identifier: GPL-2.0-only
25e8ce833SSrujana Challa  * Copyright (C) 2020 Marvell.
35e8ce833SSrujana Challa  */
45e8ce833SSrujana Challa 
55e8ce833SSrujana Challa #ifndef __OTX2_CPT_COMMON_H
65e8ce833SSrujana Challa #define __OTX2_CPT_COMMON_H
75e8ce833SSrujana Challa 
85e8ce833SSrujana Challa #include <linux/pci.h>
95e8ce833SSrujana Challa #include <linux/types.h>
105e8ce833SSrujana Challa #include <linux/module.h>
115e8ce833SSrujana Challa #include <linux/delay.h>
125e8ce833SSrujana Challa #include <linux/crypto.h>
13fed8f4d5SSrujana Challa #include <net/devlink.h>
145e8ce833SSrujana Challa #include "otx2_cpt_hw_types.h"
155e8ce833SSrujana Challa #include "rvu.h"
1683ffcf78SSrujana Challa #include "mbox.h"
175e8ce833SSrujana Challa 
18fe16eceaSSrujana Challa #define OTX2_CPT_MAX_VFS_NUM 128
195e8ce833SSrujana Challa #define OTX2_CPT_RVU_FUNC_ADDR_S(blk, slot, offs) \
205e8ce833SSrujana Challa 		(((blk) << 20) | ((slot) << 12) | (offs))
218ec8015aSSrujana Challa #define OTX2_CPT_RVU_PFFUNC(pf, func)	\
228ec8015aSSrujana Challa 		((((pf) & RVU_PFVF_PF_MASK) << RVU_PFVF_PF_SHIFT) | \
238ec8015aSSrujana Challa 		(((func) & RVU_PFVF_FUNC_MASK) << RVU_PFVF_FUNC_SHIFT))
245e8ce833SSrujana Challa 
2543ac0b82SSrujana Challa #define OTX2_CPT_INVALID_CRYPTO_ENG_GRP 0xFF
2643ac0b82SSrujana Challa #define OTX2_CPT_NAME_LENGTH 64
2778506c2aSSrujana Challa #define OTX2_CPT_DMA_MINALIGN 128
2843ac0b82SSrujana Challa 
294cd8c315SSrujana Challa /* HW capability flags */
304cd8c315SSrujana Challa #define CN10K_MBOX  0
31eb33cd91SSrujana Challa #define CN10K_LMTST 1
324cd8c315SSrujana Challa 
3343ac0b82SSrujana Challa #define BAD_OTX2_CPT_ENG_TYPE OTX2_CPT_MAX_ENG_TYPES
3443ac0b82SSrujana Challa 
3543ac0b82SSrujana Challa enum otx2_cpt_eng_type {
3643ac0b82SSrujana Challa 	OTX2_CPT_AE_TYPES = 1,
3743ac0b82SSrujana Challa 	OTX2_CPT_SE_TYPES = 2,
3843ac0b82SSrujana Challa 	OTX2_CPT_IE_TYPES = 3,
3943ac0b82SSrujana Challa 	OTX2_CPT_MAX_ENG_TYPES,
4043ac0b82SSrujana Challa };
4143ac0b82SSrujana Challa 
4243ac0b82SSrujana Challa /* Take mbox id from end of CPT mbox range in AF (range 0xA00 - 0xBFF) */
43*a4855a8cSSrujana Challa #define MBOX_MSG_RX_INLINE_IPSEC_LF_CFG 0xBFE
4443ac0b82SSrujana Challa #define MBOX_MSG_GET_ENG_GRP_NUM        0xBFF
4578506c2aSSrujana Challa #define MBOX_MSG_GET_CAPS               0xBFD
468ec8015aSSrujana Challa #define MBOX_MSG_GET_KVF_LIMITS         0xBFC
4743ac0b82SSrujana Challa 
4843ac0b82SSrujana Challa /*
49*a4855a8cSSrujana Challa  * Message request to config cpt lf for inline inbound ipsec.
50*a4855a8cSSrujana Challa  * This message is only used between CPT PF <-> CPT VF
51*a4855a8cSSrujana Challa  */
52*a4855a8cSSrujana Challa struct otx2_cpt_rx_inline_lf_cfg {
53*a4855a8cSSrujana Challa 	struct mbox_msghdr hdr;
54*a4855a8cSSrujana Challa 	u16 sso_pf_func;
55*a4855a8cSSrujana Challa 	u16 param1;
56*a4855a8cSSrujana Challa 	u16 param2;
57*a4855a8cSSrujana Challa 	u16 opcode;
58*a4855a8cSSrujana Challa 	u32 credit;
59*a4855a8cSSrujana Challa 	u32 reserved;
60*a4855a8cSSrujana Challa };
61*a4855a8cSSrujana Challa 
62*a4855a8cSSrujana Challa /*
6343ac0b82SSrujana Challa  * Message request and response to get engine group number
6443ac0b82SSrujana Challa  * which has attached a given type of engines (SE, AE, IE)
6543ac0b82SSrujana Challa  * This messages are only used between CPT PF <=> CPT VF
6643ac0b82SSrujana Challa  */
6743ac0b82SSrujana Challa struct otx2_cpt_egrp_num_msg {
6843ac0b82SSrujana Challa 	struct mbox_msghdr hdr;
6943ac0b82SSrujana Challa 	u8 eng_type;
7043ac0b82SSrujana Challa };
7143ac0b82SSrujana Challa 
7243ac0b82SSrujana Challa struct otx2_cpt_egrp_num_rsp {
7343ac0b82SSrujana Challa 	struct mbox_msghdr hdr;
7443ac0b82SSrujana Challa 	u8 eng_type;
7543ac0b82SSrujana Challa 	u8 eng_grp_num;
7643ac0b82SSrujana Challa };
7743ac0b82SSrujana Challa 
788ec8015aSSrujana Challa /*
798ec8015aSSrujana Challa  * Message request and response to get kernel crypto limits
808ec8015aSSrujana Challa  * This messages are only used between CPT PF <-> CPT VF
818ec8015aSSrujana Challa  */
828ec8015aSSrujana Challa struct otx2_cpt_kvf_limits_msg {
838ec8015aSSrujana Challa 	struct mbox_msghdr hdr;
848ec8015aSSrujana Challa };
858ec8015aSSrujana Challa 
868ec8015aSSrujana Challa struct otx2_cpt_kvf_limits_rsp {
878ec8015aSSrujana Challa 	struct mbox_msghdr hdr;
888ec8015aSSrujana Challa 	u8 kvf_limits;
898ec8015aSSrujana Challa };
908ec8015aSSrujana Challa 
9178506c2aSSrujana Challa /* CPT HW capabilities */
9278506c2aSSrujana Challa union otx2_cpt_eng_caps {
9378506c2aSSrujana Challa 	u64 u;
9478506c2aSSrujana Challa 	struct {
9578506c2aSSrujana Challa 		u64 reserved_0_4:5;
9678506c2aSSrujana Challa 		u64 mul:1;
9778506c2aSSrujana Challa 		u64 sha1_sha2:1;
9878506c2aSSrujana Challa 		u64 chacha20:1;
9978506c2aSSrujana Challa 		u64 zuc_snow3g:1;
10078506c2aSSrujana Challa 		u64 sha3:1;
10178506c2aSSrujana Challa 		u64 aes:1;
10278506c2aSSrujana Challa 		u64 kasumi:1;
10378506c2aSSrujana Challa 		u64 des:1;
10478506c2aSSrujana Challa 		u64 crc:1;
10578506c2aSSrujana Challa 		u64 reserved_14_63:50;
10678506c2aSSrujana Challa 	};
10778506c2aSSrujana Challa };
10878506c2aSSrujana Challa 
10978506c2aSSrujana Challa /*
11078506c2aSSrujana Challa  * Message request and response to get HW capabilities for each
11178506c2aSSrujana Challa  * engine type (SE, IE, AE).
11278506c2aSSrujana Challa  * This messages are only used between CPT PF <=> CPT VF
11378506c2aSSrujana Challa  */
11478506c2aSSrujana Challa struct otx2_cpt_caps_msg {
11578506c2aSSrujana Challa 	struct mbox_msghdr hdr;
11678506c2aSSrujana Challa };
11778506c2aSSrujana Challa 
11878506c2aSSrujana Challa struct otx2_cpt_caps_rsp {
11978506c2aSSrujana Challa 	struct mbox_msghdr hdr;
12078506c2aSSrujana Challa 	u16 cpt_pf_drv_version;
12178506c2aSSrujana Challa 	u8 cpt_revision;
12278506c2aSSrujana Challa 	union otx2_cpt_eng_caps eng_caps[OTX2_CPT_MAX_ENG_TYPES];
12378506c2aSSrujana Challa };
12478506c2aSSrujana Challa 
otx2_cpt_write64(void __iomem * reg_base,u64 blk,u64 slot,u64 offs,u64 val)1255e8ce833SSrujana Challa static inline void otx2_cpt_write64(void __iomem *reg_base, u64 blk, u64 slot,
1265e8ce833SSrujana Challa 				    u64 offs, u64 val)
1275e8ce833SSrujana Challa {
1285e8ce833SSrujana Challa 	writeq_relaxed(val, reg_base +
1295e8ce833SSrujana Challa 		       OTX2_CPT_RVU_FUNC_ADDR_S(blk, slot, offs));
1305e8ce833SSrujana Challa }
1315e8ce833SSrujana Challa 
otx2_cpt_read64(void __iomem * reg_base,u64 blk,u64 slot,u64 offs)1325e8ce833SSrujana Challa static inline u64 otx2_cpt_read64(void __iomem *reg_base, u64 blk, u64 slot,
1335e8ce833SSrujana Challa 				  u64 offs)
1345e8ce833SSrujana Challa {
1355e8ce833SSrujana Challa 	return readq_relaxed(reg_base +
1365e8ce833SSrujana Challa 			     OTX2_CPT_RVU_FUNC_ADDR_S(blk, slot, offs));
1375e8ce833SSrujana Challa }
13883ffcf78SSrujana Challa 
is_dev_otx2(struct pci_dev * pdev)1394cd8c315SSrujana Challa static inline bool is_dev_otx2(struct pci_dev *pdev)
1404cd8c315SSrujana Challa {
1414cd8c315SSrujana Challa 	if (pdev->device == OTX2_CPT_PCI_PF_DEVICE_ID ||
1424cd8c315SSrujana Challa 	    pdev->device == OTX2_CPT_PCI_VF_DEVICE_ID)
1434cd8c315SSrujana Challa 		return true;
1444cd8c315SSrujana Challa 
1454cd8c315SSrujana Challa 	return false;
1464cd8c315SSrujana Challa }
1474cd8c315SSrujana Challa 
otx2_cpt_set_hw_caps(struct pci_dev * pdev,unsigned long * cap_flag)1484cd8c315SSrujana Challa static inline void otx2_cpt_set_hw_caps(struct pci_dev *pdev,
1494cd8c315SSrujana Challa 					unsigned long *cap_flag)
1504cd8c315SSrujana Challa {
151eb33cd91SSrujana Challa 	if (!is_dev_otx2(pdev)) {
1524cd8c315SSrujana Challa 		__set_bit(CN10K_MBOX, cap_flag);
153eb33cd91SSrujana Challa 		__set_bit(CN10K_LMTST, cap_flag);
154eb33cd91SSrujana Challa 	}
1554cd8c315SSrujana Challa }
1564cd8c315SSrujana Challa 
1574cd8c315SSrujana Challa 
15883ffcf78SSrujana Challa int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev);
15983ffcf78SSrujana Challa int otx2_cpt_send_mbox_msg(struct otx2_mbox *mbox, struct pci_dev *pdev);
16043ac0b82SSrujana Challa 
16143ac0b82SSrujana Challa int otx2_cpt_send_af_reg_requests(struct otx2_mbox *mbox,
16243ac0b82SSrujana Challa 				  struct pci_dev *pdev);
16343ac0b82SSrujana Challa int otx2_cpt_add_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
164b2d17df3SSrujana Challa 			      u64 reg, u64 val, int blkaddr);
16543ac0b82SSrujana Challa int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
166b2d17df3SSrujana Challa 			 u64 reg, u64 *val, int blkaddr);
16743ac0b82SSrujana Challa int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
168b2d17df3SSrujana Challa 			  u64 reg, u64 val, int blkaddr);
16964506017SSrujana Challa struct otx2_cptlfs_info;
17064506017SSrujana Challa int otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info *lfs);
17164506017SSrujana Challa int otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info *lfs);
17219d8e8c7SSrujana Challa int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs);
1734363f3d3SHarman Kalra int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox);
17464506017SSrujana Challa 
1755e8ce833SSrujana Challa #endif /* __OTX2_CPT_COMMON_H */
176