fix(infra): QAT init
[csit.git] / resources / libraries / python / QATUtil.py
index e709aad..e16221f 100644 (file)
 """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
+from resources.libraries.python.ssh import exec_cmd_no_error
 
 
 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.
+    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)
-        sriov_numvfs = DUTSetup.get_sriov_numvfs(node, pci_addr)
+        VPPUtil.stop_vpp_service_on_all_duts(nodes)
 
-        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']}"
-                )
+        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"])
+
+        cmd = f"adf_ctl status | grep {device['pci_address']} | "
+        cmd += "awk '{print $1}'"
+        stdout, _ = exec_cmd_no_error(
+            node, cmd, sudo=True, message="Failed to check crypto device!"
+        )
+        if stdout.strip():
+            qat_dev = stdout.split("_")[-1]
+            conf_file = f"/etc/{device['driver']}_{qat_dev.strip()}.conf"
+            exec_cmd_no_error(
+                node, f"adf_ctl --config {conf_file} {stdout.strip()} restart",
+                sudo=True, message="Failed to restart crypto device!"
+            )
+        else:
+            raise ValueError("Crypto device error")
 
         # 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:
+            path = f"drivers/{device['driver']}"
+            DUTSetup.set_sriov_numvfs(
+                node, device["pci_address"], path=path,
+                numvfs=device["numvfs"]
+            )
+
+        if device["driver"] not in ["c4xxx"]:
+            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"
+                )