@@ -8,6 +8,7 @@ rdma_python_test(tests
base_rdmacm.py
cuda_utils.py
efa_base.py
+ hbl_base.py
irdma_base.py
mlx5_base.py
mlx5_prm_structs.py
@@ -23,6 +24,7 @@ rdma_python_test(tests
test_efadv.py
test_flow.py
test_fork.py
+ test_hbldv.py
test_mlx5_cq.py
test_mlx5_crypto.py
test_mlx5_cuda_umem.py
new file mode 100644
@@ -0,0 +1,89 @@
+# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
+# Copyright 2022-2024 HabanaLabs, Ltd.
+# Copyright (C) 2023-2024, Intel Corporation.
+# All Rights Reserved.
+
+import unittest
+import os
+import re
+
+from pyverbs.providers.hbl.hbldv import HblContext, HblDVContextAttr, \
+ HblDVSetPortEx, HblDVPortExAttr
+from pyverbs.pyverbs_error import PyverbsRDMAError
+from pyverbs.base import PyverbsRDMAError
+from pyverbs.pyverbs_error import PyverbsUserError
+import pyverbs.providers.hbl.hbl_enums as hbl_e
+import pyverbs.providers.hbl.hbldv as hbl
+
+from tests.base import PyverbsAPITestCase
+
+
+HABANALABS_VENDOR_ID = 0x1da3
+
+
+def is_hbl_dev(ctx):
+ dev_attrs = ctx.query_device()
+ return dev_attrs.vendor_id == HABANALABS_VENDOR_ID
+
+
+def skip_if_not_hbl_dev(ctx):
+ if not is_hbl_dev(ctx):
+ raise unittest.SkipTest('Can not run the test over non hbl device')
+
+def bits(n):
+ b=0
+ while n:
+ if (n & 0x1):
+ yield b
+ b += 1
+ n >>= 1
+
+
+class HblAPITestCase(PyverbsAPITestCase):
+ def __init__(self, methodName='runTest'):
+ super().__init__(methodName)
+ self.fd = None
+
+ def setUp(self):
+ super().setUp()
+ skip_if_not_hbl_dev(self.ctx)
+
+ def create_context(self):
+ try:
+ path = None
+ for file in os.listdir('/dev/accel/'):
+ if re.match('^accel[0-9]+$', file):
+ path = os.path.join('/dev/accel/', file)
+ break
+
+ self.assertNotEqual(path, None, 'No core device found')
+
+ self.fd = os.open(path, os.O_RDWR | os.O_CLOEXEC)
+ attr = HblDVContextAttr()
+ attr.ports_mask = 0
+ attr.core_fd = self.fd
+ self.ctx = HblContext(attr, name=self.dev_name)
+ except PyverbsUserError as ex:
+ raise unittest.SkipTest(f'Could not open hbl context ({ex})')
+ except PyverbsRDMAError:
+ raise unittest.SkipTest('Opening hbl context is not supported')
+
+ try:
+ # Set ports Ex should be called for all enabled ports
+ ib_ports_mask = self.ctx.query_hbl_device().ports_mask
+ for ib_port in bits(ib_ports_mask):
+ attr = HblDVPortExAttr()
+ attr.port_num = ib_port
+ attr.mem_id = hbl_e.HBLDV_MEM_HOST
+ attr.max_num_of_wqs = 8
+ attr.max_num_of_wqes_in_wq = 16
+ attr.swq_granularity = hbl_e.HBLDV_SWQE_GRAN_32B
+ attr.caps = 1
+ port = HblDVSetPortEx()
+ port.set_port_ex(self.ctx, attr)
+ except PyverbsUserError as ex:
+ raise unittest.SkipTest(f'Could not set port extended params ({ex})')
+
+ def tearDown(self):
+ super().tearDown()
+ os.close(self.fd)
new file mode 100644
@@ -0,0 +1,226 @@
+# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
+# Copyright 2022-2024 HabanaLabs, Ltd.
+# Copyright (C) 2023-2024, Intel Corporation.
+# All Rights Reserved.
+
+"""
+Test module for hbl direct-verbs.
+"""
+
+import errno
+import unittest
+import struct
+import ctypes
+
+from pyverbs.providers.hbl.hbldv import (
+ HblDVUserFIFOAttr, HblDVCQattr, HblDVQueryCQ, HblDVCQ, HblDVPortAttr, HblDVQP,
+ HblDVQueryQP, HblDVEncap, HblDVEncapAttr, HblDVEncapOut, HblDVModifyQP
+)
+
+from pyverbs.base import PyverbsRDMAError
+from pyverbs.pyverbs_error import PyverbsUserError
+import pyverbs.providers.hbl.hbldv as hbl
+import pyverbs.providers.hbl.hbl_enums as hbl_e
+from pyverbs.cq import CQ
+from pyverbs.pd import PD
+import pyverbs.enums as e
+from pyverbs.qp import QPInitAttr, QPAttr
+
+from tests.hbl_base import HblAPITestCase
+
+
+class HblUserFIFOTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl user FIFO class
+ """
+ def test_hbldv_usr_fifo(self):
+ """
+ Test hbldv_usr_fifo()
+ """
+ try:
+ attr = HblDVUserFIFOAttr()
+ attr.port_num = self.ib_port
+ usr_fifo = hbl.HblDVUserFIFO()
+ usr_fifo.create_usr_fifo(self.ctx, attr)
+ usr_fifo.destroy_usr_fifo()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+class HblCQTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl CQ class
+ """
+ def test_hbldv_create_cq(self):
+ """
+ Test hbldv_create_cq()
+ """
+ try:
+ num_cqes = 512
+ cq_attr = HblDVCQattr()
+ cq_attr.port_num = self.ib_port
+ cq_attr.cq_type = 0
+ cq_obj = HblDVCQ()
+ cq_obj.create_cq(self.ctx, num_cqes, cq_attr)
+ cq_obj.destroy_cq()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+ def test_hbldv_query_cq(self):
+ """
+ Test hbldv_query_cq()
+ """
+ try:
+ num_cqes = 512
+ cq_attr = HblDVCQattr()
+ cq_attr.port_num = self.ib_port
+ cq_attr.cq_type = 0
+ cq_obj = HblDVCQ()
+ cq_obj.create_cq(self.ctx, num_cqes, cq_attr)
+ query_cq_obj = HblDVQueryCQ()
+ cq_obj.query_cq(query_cq_obj)
+ cq_obj.destroy_cq()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+class HblQueryPortTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl Query port class
+ """
+ def test_hbldv_query_port(self):
+ """
+ Test hbldv_query_port()
+ """
+ try:
+ attr = HblDVPortAttr()
+ port = hbl.HblQueryPort()
+ port.query_port(self.ctx, self.ib_port, attr)
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+class HblQPTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl Query QP class
+ """
+ def test_hbldv_modify_qp(self):
+ """
+ Test hbldv_modify_qp()
+ """
+ try:
+ pd_obj = PD(self.ctx)
+ cq_obj = CQ(self.ctx, 512)
+ qp_init_obj = QPInitAttr(e.IBV_QPT_RC, None, cq_obj, cq_obj)
+ qp_obj = HblDVQP()
+ qp_obj.create_qp(pd_obj, qp_init_obj)
+ qp_attr_obj = QPAttr()
+ qp_attr_obj.qp_state = e.IBV_QPS_INIT
+ qp_attr_obj.port_num = self.ib_port
+ qp_attr_obj.pkey_index = 0
+ qp_modify_attr = HblDVModifyQP()
+ qp_modify_attr.wq_type = 1
+ qp_obj.modify_qp(qp_attr_obj,
+ e.IBV_QP_STATE | e.IBV_QP_PKEY_INDEX |
+ e.IBV_QP_PORT | e.IBV_QP_ACCESS_FLAGS, qp_modify_attr)
+ qp_obj.destroy_qp()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+ def test_hbldv_query_qp(self):
+ """
+ Test hbldv_query_qp()
+ """
+ try:
+ cq_obj = CQ(self.ctx, 512)
+ pd_obj = PD(self.ctx)
+ qp_init_obj = QPInitAttr(e.IBV_QPT_RC, None, cq_obj, cq_obj)
+ qp_obj = HblDVQP()
+ qp_obj.create_qp(pd_obj, qp_init_obj)
+ qp_attr_obj = QPAttr()
+ qp_attr_obj.qp_state = e.IBV_QPS_INIT
+ qp_attr_obj.port_num = self.ib_port
+ qp_attr_obj.pkey_index = 0
+ qp_modify_attr = HblDVModifyQP()
+ qp_modify_attr.wq_type = 1
+ qp_obj.modify_qp(qp_attr_obj, e.IBV_QP_STATE | e.IBV_QP_PKEY_INDEX | e.IBV_QP_PORT | e.IBV_QP_ACCESS_FLAGS, qp_modify_attr)
+ query_qp_obj = HblDVQueryQP()
+ qp_obj.query_qp(query_qp_obj)
+ qp_obj.destroy_qp()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+class HblCCCQTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl CC CQ class
+ """
+ def test_hbldv_create_cq(self):
+ """
+ Test hbldv_create_cq() for CC
+ """
+ if not self.ctx.query_hbl_device().caps & hbl_e.HBLDV_DEVICE_ATTR_CAP_CC:
+ raise unittest.SkipTest('Test not supported on this device')
+ try:
+ num_cqes = 512
+ cq_attr = HblDVCQattr()
+ cq_attr.port_num = self.ib_port
+ cq_attr.cq_type = 1
+ cq_obj = HblDVCQ()
+ cq_obj.create_cq(self.ctx, num_cqes, cq_attr)
+ cq_obj.destroy_cq()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+ def test_hbldv_query_cq(self):
+ """
+ Test hbldv_query_cq() for CC
+ """
+ if not self.ctx.query_hbl_device().caps & hbl_e.HBLDV_DEVICE_ATTR_CAP_CC:
+ raise unittest.SkipTest('Test not supported on this device')
+ try:
+ num_cqes = 512
+ cq_attr = HblDVCQattr()
+ cq_attr.port_num = self.ib_port
+ cq_attr.cq_type = 1
+ cq_obj = HblDVCQ()
+ cq_obj.create_cq(self.ctx, num_cqes, cq_attr)
+ query_cq_obj = HblDVQueryCQ()
+ cq_obj.query_cq(query_cq_obj)
+ cq_obj.destroy_cq()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex
+
+class HblEncapTest(HblAPITestCase):
+ """
+ Test functionality of the Hbl Encap class
+ """
+ def test_hbldv_create_encap(self):
+ """
+ Test hbldv_create_encap()
+ """
+ try:
+ encap_attr = HblDVEncapAttr()
+ encap_attr.port_num = self.ib_port
+ encap_attr.encap_type = 2
+ encap_out = HblDVEncapOut()
+ encap_obj = HblDVEncap()
+ encap_attr.tnl_hdr_size = 32
+ encap_obj.create_encap(self.ctx, encap_attr, encap_out)
+ encap_obj.destroy_encap()
+ except PyverbsRDMAError as ex:
+ if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
+ raise unittest.SkipTest('Not supported on non hbl devices')
+ raise ex