feat(core): QAT initialization refactor
[csit.git] / resources / libraries / python / QATUtil.py
index 34a8e3b..be8cc95 100644 (file)
@@ -14,7 +14,7 @@
 """QAT util library."""
 
 from resources.libraries.python.DUTSetup import DUTSetup
-from resources.libraries.python.topology import Topology
+from resources.libraries.python.topology import NodeType, Topology
 from resources.libraries.python.VPPUtil import VPPUtil
 
 
@@ -22,88 +22,53 @@ class QATUtil:
     """Contains methods for setting up QATs."""
 
     @staticmethod
-    def crypto_device_verify(node, crypto_type, numvfs, force_init=True):
-        """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.
+    def crypto_device_verify_on_all_duts(nodes):
+        """Verify if Crypto QAT device and its virtual functions are initialized
+        on all DUTs.
 
-        :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.
+        :param nodes: Nodes in the topology.
+        :type nodes: dict
         """
-        pci_addr = Topology.get_cryptodev(node)
-
-        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']}"
-            )
+        VPPUtil.stop_vpp_service_on_all_duts(nodes)
 
-        # QAT VF devices must be re-bound to vfio-pci driver before use.
-        pci_addr = Topology.get_cryptodev(node)
-        for i in range(numvfs):
-            DUTSetup.pci_vf_driver_unbind(node, pci_addr, i)
-            DUTSetup.pci_vf_driver_bind(node, pci_addr, i, "vfio-pci")
+        for node in nodes.values():
+            if node["type"] == NodeType.DUT:
+                cryptodevs = Topology.get_cryptodev(node)
+                if not cryptodevs:
+                    return
+                for device in cryptodevs.values():
+                    QATUtil.crypto_device_init(node, device)
 
     @staticmethod
-    def crypto_device_init(node, crypto_type, numvfs):
+    def crypto_device_init(node, device):
         """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.
+        :device: Crypto device entry from topology file.
         :type node: dict
-        :type crypto_type: string
-        :type numvfs: int
-        :returns: nothing
-        :raises RuntimeError: If failed to stop VPP or QAT failed to initialize.
+        :type device: dict
         """
-        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)
+        DUTSetup.verify_kernel_module(node, device["module"], force_load=True)
 
         current_driver = DUTSetup.get_pci_dev_driver(
-            node, pci_addr.replace(u":", r"\:")
+            node, device["pci_address"].replace(":", r"\:")
         )
         if current_driver is not None:
-            DUTSetup.pci_driver_unbind(node, pci_addr)
-
+            DUTSetup.pci_driver_unbind(node, device["pci_address"])
         # Bind to kernel driver.
-        DUTSetup.pci_driver_bind(node, pci_addr, kernel_drv)
+        DUTSetup.pci_driver_bind(node, device["pci_address"], device["driver"])
 
         # Initialize QAT VFs.
-        if numvfs > 0:
-            DUTSetup.set_sriov_numvfs(node, pci_addr, numvfs)
\ No newline at end of file
+        if int(device["numvfs"]) > 0:
+            DUTSetup.set_sriov_numvfs(
+                node, device["pci_address"], type="drivers/4xxx",
+                numvfs=device["numvfs"]
+            )
+
+        for cvf in range(int(device["numvfs"])):
+            DUTSetup.pci_vf_driver_unbind(
+                node, device["pci_address"], cvf
+            )
+            DUTSetup.pci_vf_driver_bind(
+                node, device["pci_address"], cvf, "vfio-pci"
+            )