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