"""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=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"])
+
+ 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"
+ )