obj-$(CONFIG_CRYPTO_DEV_OCTEONTX2_CPT) += rvu_cptpf.o rvu_cptvf.o
 
 rvu_cptpf-objs := otx2_cptpf_main.o otx2_cptpf_mbox.o \
-                 otx2_cpt_mbox_common.o otx2_cptpf_ucode.o otx2_cptlf.o
+                 otx2_cpt_mbox_common.o otx2_cptpf_ucode.o otx2_cptlf.o \
+                 cn10k_cpt.o
 rvu_cptvf-objs := otx2_cptvf_main.o otx2_cptvf_mbox.o otx2_cptlf.o \
                  otx2_cpt_mbox_common.o otx2_cptvf_reqmgr.o \
-                 otx2_cptvf_algs.o
+                 otx2_cptvf_algs.o cn10k_cpt.o
 
 ccflags-y += -I$(srctree)/drivers/net/ethernet/marvell/octeontx2/af
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (C) 2021 Marvell. */
+
+#include "otx2_cptpf.h"
+#include "otx2_cptvf.h"
+#include "otx2_cptlf.h"
+#include "cn10k_cpt.h"
+
+int cn10k_cptpf_lmtst_init(struct otx2_cptpf_dev *cptpf)
+{
+       struct pci_dev *pdev = cptpf->pdev;
+       resource_size_t size;
+       u64 lmt_base;
+
+       if (!test_bit(CN10K_LMTST, &cptpf->cap_flag))
+               return 0;
+
+       lmt_base = readq(cptpf->reg_base + RVU_PF_LMTLINE_ADDR);
+       if (!lmt_base) {
+               dev_err(&pdev->dev, "PF LMTLINE address not configured\n");
+               return -ENOMEM;
+       }
+       size = pci_resource_len(pdev, PCI_MBOX_BAR_NUM);
+       size -= ((1 + cptpf->max_vfs) * MBOX_SIZE);
+       cptpf->lfs.lmt_base = devm_ioremap_wc(&pdev->dev, lmt_base, size);
+       if (!cptpf->lfs.lmt_base) {
+               dev_err(&pdev->dev,
+                       "Mapping of PF LMTLINE address failed\n");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+int cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev *cptvf)
+{
+       struct pci_dev *pdev = cptvf->pdev;
+       resource_size_t offset, size;
+
+       if (!test_bit(CN10K_LMTST, &cptvf->cap_flag))
+               return 0;
+
+       offset = pci_resource_start(pdev, PCI_MBOX_BAR_NUM);
+       size = pci_resource_len(pdev, PCI_MBOX_BAR_NUM);
+       /* Map VF LMILINE region */
+       cptvf->lfs.lmt_base = devm_ioremap_wc(&pdev->dev, offset, size);
+       if (!cptvf->lfs.lmt_base) {
+               dev_err(&pdev->dev, "Unable to map BAR4\n");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
 
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only
+ * Copyright (C) 2021 Marvell.
+ */
+#ifndef __CN10K_CPT_H
+#define __CN10K_CPT_H
+
+#include "otx2_cptpf.h"
+#include "otx2_cptvf.h"
+
+int cn10k_cptpf_lmtst_init(struct otx2_cptpf_dev *cptpf);
+int cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev *cptvf);
+
+#endif /* __CN10K_CPTLF_H */
 
 
 /* HW capability flags */
 #define CN10K_MBOX  0
+#define CN10K_LMTST 1
 
 #define BAD_OTX2_CPT_ENG_TYPE OTX2_CPT_MAX_ENG_TYPES
 
 static inline void otx2_cpt_set_hw_caps(struct pci_dev *pdev,
                                        unsigned long *cap_flag)
 {
-       if (!is_dev_otx2(pdev))
+       if (!is_dev_otx2(pdev)) {
                __set_bit(CN10K_MBOX, cap_flag);
+               __set_bit(CN10K_LMTST, cap_flag);
+       }
 }
 
 
 
 struct otx2_cptlfs_info {
        /* Registers start address of VF/PF LFs are attached to */
        void __iomem *reg_base;
+#define LMTLINE_SIZE  128
+       void __iomem *lmt_base;
        struct pci_dev *pdev;   /* Device LFs are attached to */
        struct otx2_cptlf_info lf[OTX2_CPT_MAX_LFS_NUM];
        struct otx2_mbox *mbox;
 
 #include "otx2_cpt_common.h"
 #include "otx2_cptpf_ucode.h"
 #include "otx2_cptpf.h"
+#include "cn10k_cpt.h"
 #include "rvu_reg.h"
 
 #define OTX2_CPT_DRV_NAME    "rvu_cptpf"
 
        cptpf->max_vfs = pci_sriov_get_totalvfs(pdev);
 
+       err = cn10k_cptpf_lmtst_init(cptpf);
+       if (err)
+               goto unregister_intr;
+
        /* Initialize CPT PF device */
        err = cptpf_device_init(cptpf);
        if (err)
 
 #include "otx2_cptvf.h"
 #include "otx2_cptlf.h"
 #include "otx2_cptvf_algs.h"
+#include "cn10k_cpt.h"
 #include <rvu_reg.h>
 
 #define OTX2_CPTVF_DRV_NAME "rvu_cptvf"
        cptvf->reg_base = pcim_iomap_table(pdev)[PCI_PF_REG_BAR_NUM];
 
        otx2_cpt_set_hw_caps(pdev, &cptvf->cap_flag);
+
+       ret = cn10k_cptvf_lmtst_init(cptvf);
+       if (ret)
+               goto clear_drvdata;
+
        /* Initialize PF<=>VF mailbox */
        ret = cptvf_pfvf_mbox_init(cptvf);
        if (ret)