aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/QATUtil.py
diff options
context:
space:
mode:
authorpmikus <peter.mikus@protonmail.ch>2023-07-26 13:49:46 +0000
committerPeter Mikus <peter.mikus@protonmail.ch>2023-07-27 10:34:51 +0000
commitfb731e12fc85bf225e8917fe068fcc357f9a2158 (patch)
tree0c026bc5b230c6e70b06a6e9b18290335b5dc872 /resources/libraries/python/QATUtil.py
parenteaaa89b6a446485a06c63eaad94ed752ccae0bf9 (diff)
fix(core): QAT initialization
Signed-off-by: pmikus <peter.mikus@protonmail.ch> Change-Id: I28af64b7d39a97bbb84f9d987a3f5d3a2d02701b
Diffstat (limited to 'resources/libraries/python/QATUtil.py')
-rw-r--r--resources/libraries/python/QATUtil.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/resources/libraries/python/QATUtil.py b/resources/libraries/python/QATUtil.py
new file mode 100644
index 0000000000..e709aad6ed
--- /dev/null
+++ b/resources/libraries/python/QATUtil.py
@@ -0,0 +1,105 @@
+# Copyright (c) 2023 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""QAT util library."""
+
+from resources.libraries.python.DUTSetup import DUTSetup
+from resources.libraries.python.topology import Topology
+from resources.libraries.python.VPPUtil import VPPUtil
+
+
+class QATUtil:
+ """Contains methods for setting up QATs."""
+
+ @staticmethod
+ def crypto_device_verify(node, crypto_type, numvfs, force_init=False):
+ """Verify if Crypto QAT device virtual functions are initialized on all
+ DUTs. If parameter force initialization is set to True, then try to
+ initialize or remove VFs on QAT.
+
+ :param node: DUT node.
+ :crypto_type: Crypto device type - HW_DH895xcc, HW_C3xxx, HW_C4xxx
+ or HW_4xxx.
+ :param numvfs: Number of VFs to initialize, 0 - disable the VFs.
+ :param force_init: If True then try to initialize to specific value.
+ :type node: dict
+ :type crypto_type: string
+ :type numvfs: int
+ :type force_init: bool
+ :returns: nothing
+ :raises RuntimeError: If QAT VFs are not created and force init is set
+ to False.
+ """
+ pci_addr = Topology.get_cryptodev(node)
+ sriov_numvfs = DUTSetup.get_sriov_numvfs(node, pci_addr)
+
+ if sriov_numvfs != numvfs:
+ if force_init:
+ # QAT is not initialized and we want to initialize with numvfs
+ QATUtil.crypto_device_init(node, crypto_type, numvfs)
+ else:
+ raise RuntimeError(
+ f"QAT device failed to create VFs on {node[u'host']}"
+ )
+
+ @staticmethod
+ def crypto_device_init(node, crypto_type, numvfs):
+ """Init Crypto QAT device virtual functions on DUT.
+
+ :param node: DUT node.
+ :crypto_type: Crypto device type - HW_DH895xcc, HW_C3xxx, HW_C4xxx
+ or HW_4xxx.
+ :param numvfs: Number of VFs to initialize, 0 - disable the VFs.
+ :type node: dict
+ :type crypto_type: string
+ :type numvfs: int
+ :returns: nothing
+ :raises RuntimeError: If failed to stop VPP or QAT failed to initialize.
+ """
+ if crypto_type == u"HW_DH895xcc":
+ kernel_mod = u"qat_dh895xcc"
+ kernel_drv = u"dh895xcc"
+ elif crypto_type == u"HW_C3xxx":
+ kernel_mod = u"qat_c3xxx"
+ kernel_drv = u"c3xxx"
+ elif crypto_type == u"HW_C4xxx":
+ kernel_mod = u"qat_c4xxx"
+ kernel_drv = u"c4xxx"
+ elif crypto_type == u"HW_4xxx":
+ kernel_mod = u"qat_4xxx"
+ kernel_drv = u"4xxx"
+ else:
+ raise RuntimeError(
+ f"Unsupported crypto device type on {node[u'host']}"
+ )
+
+ pci_addr = Topology.get_cryptodev(node)
+
+ # QAT device must be re-bound to kernel driver before initialization.
+ DUTSetup.verify_kernel_module(node, kernel_mod, force_load=True)
+
+ # Stop VPP to prevent deadlock.
+ VPPUtil.stop_vpp_service(node)
+
+ current_driver = DUTSetup.get_pci_dev_driver(
+ node, pci_addr.replace(u":", r"\:")
+ )
+ if current_driver is not None:
+ DUTSetup.pci_driver_unbind(node, pci_addr)
+
+ # Bind to kernel driver.
+ DUTSetup.pci_driver_bind(node, pci_addr, kernel_drv)
+
+ # Initialize QAT VFs.
+ if numvfs > 0:
+ DUTSetup.set_sriov_numvfs(node, pci_addr, numvfs) \ No newline at end of file