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