xref: /openbmc/linux/drivers/crypto/marvell/octeontx2/cn10k_cpt.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1eb33cd91SSrujana Challa // SPDX-License-Identifier: GPL-2.0-only
2eb33cd91SSrujana Challa /* Copyright (C) 2021 Marvell. */
3eb33cd91SSrujana Challa 
440a645f7SSrujana Challa #include <linux/soc/marvell/octeontx2/asm.h>
5eb33cd91SSrujana Challa #include "otx2_cptpf.h"
6eb33cd91SSrujana Challa #include "otx2_cptvf.h"
7eb33cd91SSrujana Challa #include "otx2_cptlf.h"
8eb33cd91SSrujana Challa #include "cn10k_cpt.h"
9eb33cd91SSrujana Challa 
10*72bc4e71SAlexander Lobakin static void cn10k_cpt_send_cmd(union otx2_cpt_inst_s *cptinst, u32 insts_num,
11*72bc4e71SAlexander Lobakin 			       struct otx2_cptlf_info *lf);
12*72bc4e71SAlexander Lobakin 
1340a645f7SSrujana Challa static struct cpt_hw_ops otx2_hw_ops = {
1440a645f7SSrujana Challa 	.send_cmd = otx2_cpt_send_cmd,
1540a645f7SSrujana Challa 	.cpt_get_compcode = otx2_cpt_get_compcode,
1640a645f7SSrujana Challa 	.cpt_get_uc_compcode = otx2_cpt_get_uc_compcode,
1740a645f7SSrujana Challa };
1840a645f7SSrujana Challa 
1940a645f7SSrujana Challa static struct cpt_hw_ops cn10k_hw_ops = {
2040a645f7SSrujana Challa 	.send_cmd = cn10k_cpt_send_cmd,
2140a645f7SSrujana Challa 	.cpt_get_compcode = cn10k_cpt_get_compcode,
2240a645f7SSrujana Challa 	.cpt_get_uc_compcode = cn10k_cpt_get_uc_compcode,
2340a645f7SSrujana Challa };
2440a645f7SSrujana Challa 
cn10k_cpt_send_cmd(union otx2_cpt_inst_s * cptinst,u32 insts_num,struct otx2_cptlf_info * lf)25*72bc4e71SAlexander Lobakin static void cn10k_cpt_send_cmd(union otx2_cpt_inst_s *cptinst, u32 insts_num,
2640a645f7SSrujana Challa 			       struct otx2_cptlf_info *lf)
2740a645f7SSrujana Challa {
2840a645f7SSrujana Challa 	void __iomem *lmtline = lf->lmtline;
2940a645f7SSrujana Challa 	u64 val = (lf->slot & 0x7FF);
3040a645f7SSrujana Challa 	u64 tar_addr = 0;
3140a645f7SSrujana Challa 
3240a645f7SSrujana Challa 	/* tar_addr<6:4> = Size of first LMTST - 1 in units of 128b. */
3340a645f7SSrujana Challa 	tar_addr |= (__force u64)lf->ioreg |
3440a645f7SSrujana Challa 		    (((OTX2_CPT_INST_SIZE/16) - 1) & 0x7) << 4;
3540a645f7SSrujana Challa 	/*
3640a645f7SSrujana Challa 	 * Make sure memory areas pointed in CPT_INST_S
3740a645f7SSrujana Challa 	 * are flushed before the instruction is sent to CPT
3840a645f7SSrujana Challa 	 */
3940a645f7SSrujana Challa 	dma_wmb();
4040a645f7SSrujana Challa 
4140a645f7SSrujana Challa 	/* Copy CPT command to LMTLINE */
4240a645f7SSrujana Challa 	memcpy_toio(lmtline, cptinst, insts_num * OTX2_CPT_INST_SIZE);
4340a645f7SSrujana Challa 	cn10k_lmt_flush(val, tar_addr);
4440a645f7SSrujana Challa }
4540a645f7SSrujana Challa 
cn10k_cptpf_lmtst_init(struct otx2_cptpf_dev * cptpf)46eb33cd91SSrujana Challa int cn10k_cptpf_lmtst_init(struct otx2_cptpf_dev *cptpf)
47eb33cd91SSrujana Challa {
48eb33cd91SSrujana Challa 	struct pci_dev *pdev = cptpf->pdev;
49eb33cd91SSrujana Challa 	resource_size_t size;
50eb33cd91SSrujana Challa 	u64 lmt_base;
51eb33cd91SSrujana Challa 
5240a645f7SSrujana Challa 	if (!test_bit(CN10K_LMTST, &cptpf->cap_flag)) {
5340a645f7SSrujana Challa 		cptpf->lfs.ops = &otx2_hw_ops;
54eb33cd91SSrujana Challa 		return 0;
5540a645f7SSrujana Challa 	}
56eb33cd91SSrujana Challa 
5740a645f7SSrujana Challa 	cptpf->lfs.ops = &cn10k_hw_ops;
58eb33cd91SSrujana Challa 	lmt_base = readq(cptpf->reg_base + RVU_PF_LMTLINE_ADDR);
59eb33cd91SSrujana Challa 	if (!lmt_base) {
60eb33cd91SSrujana Challa 		dev_err(&pdev->dev, "PF LMTLINE address not configured\n");
61eb33cd91SSrujana Challa 		return -ENOMEM;
62eb33cd91SSrujana Challa 	}
63eb33cd91SSrujana Challa 	size = pci_resource_len(pdev, PCI_MBOX_BAR_NUM);
64eb33cd91SSrujana Challa 	size -= ((1 + cptpf->max_vfs) * MBOX_SIZE);
65eb33cd91SSrujana Challa 	cptpf->lfs.lmt_base = devm_ioremap_wc(&pdev->dev, lmt_base, size);
66eb33cd91SSrujana Challa 	if (!cptpf->lfs.lmt_base) {
67eb33cd91SSrujana Challa 		dev_err(&pdev->dev,
68eb33cd91SSrujana Challa 			"Mapping of PF LMTLINE address failed\n");
69eb33cd91SSrujana Challa 		return -ENOMEM;
70eb33cd91SSrujana Challa 	}
71eb33cd91SSrujana Challa 
72eb33cd91SSrujana Challa 	return 0;
73eb33cd91SSrujana Challa }
74*72bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(cn10k_cptpf_lmtst_init, CRYPTO_DEV_OCTEONTX2_CPT);
75eb33cd91SSrujana Challa 
cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev * cptvf)76eb33cd91SSrujana Challa int cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev *cptvf)
77eb33cd91SSrujana Challa {
78eb33cd91SSrujana Challa 	struct pci_dev *pdev = cptvf->pdev;
79eb33cd91SSrujana Challa 	resource_size_t offset, size;
80eb33cd91SSrujana Challa 
8140a645f7SSrujana Challa 	if (!test_bit(CN10K_LMTST, &cptvf->cap_flag)) {
8240a645f7SSrujana Challa 		cptvf->lfs.ops = &otx2_hw_ops;
83eb33cd91SSrujana Challa 		return 0;
8440a645f7SSrujana Challa 	}
85eb33cd91SSrujana Challa 
8640a645f7SSrujana Challa 	cptvf->lfs.ops = &cn10k_hw_ops;
87eb33cd91SSrujana Challa 	offset = pci_resource_start(pdev, PCI_MBOX_BAR_NUM);
88eb33cd91SSrujana Challa 	size = pci_resource_len(pdev, PCI_MBOX_BAR_NUM);
89eb33cd91SSrujana Challa 	/* Map VF LMILINE region */
90eb33cd91SSrujana Challa 	cptvf->lfs.lmt_base = devm_ioremap_wc(&pdev->dev, offset, size);
91eb33cd91SSrujana Challa 	if (!cptvf->lfs.lmt_base) {
92eb33cd91SSrujana Challa 		dev_err(&pdev->dev, "Unable to map BAR4\n");
93eb33cd91SSrujana Challa 		return -ENOMEM;
94eb33cd91SSrujana Challa 	}
95eb33cd91SSrujana Challa 
96eb33cd91SSrujana Challa 	return 0;
97eb33cd91SSrujana Challa }
98*72bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(cn10k_cptvf_lmtst_init, CRYPTO_DEV_OCTEONTX2_CPT);
99