# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) # Copyright (c) 2020 Nvidia, Inc. All rights reserved. See COPYING file from pyverbs.pyverbs_error import PyverbsUserError, PyverbsRDMAError cimport pyverbs.providers.mlx5.libmlx5 as dv from pyverbs.base import PyverbsRDMAErrno from pyverbs.pd cimport PD cdef class Mlx5SigCrc(PyverbsObject): def __init__(self, crc_type=0, seed=0): """ Initializes a Mlx5SigCrc object representing mlx5dv_sig_crc C struct. :param crc_type: The specific CRC type. :param seed: A seed for the CRC calculation per block. """ self.mlx5dv_sig_crc.type = crc_type self.mlx5dv_sig_crc.seed = seed cdef class Mlx5SigT10Dif(PyverbsObject): def __init__(self, bg_type=0, bg=0, app_tag=0, ref_tag=0, flags=0): """ Initializes a Mlx5SigT10Dif object representing mlx5dv_sig_t10dif C struct. :param bg_type: The block guard type to be used. :param bg: A seed for the block guard calculation per block. :param app_tag: An application tag to generate or validate. :param ref_tag: A reference tag to generate or validate. :param flags: Flags for the T10DIF attributes. """ self.mlx5dv_sig_t10dif.bg_type = bg_type self.mlx5dv_sig_t10dif.bg = bg self.mlx5dv_sig_t10dif.app_tag = app_tag self.mlx5dv_sig_t10dif.ref_tag = ref_tag self.mlx5dv_sig_t10dif.flags = flags cdef class Mlx5SigBlockDomain(PyverbsObject): def __init__(self, sig_type=0, Mlx5SigT10Dif dif=None, Mlx5SigCrc crc=None, block_size=0, comp_mask=0): """ Initializes a Mlx5SigBlockDomain object representing mlx5dv_sig_block_domain C struct. :param sig_type: The signature type for this domain. :param dif: Mlx5SigT10Dif object. :param crc: Mlx5SigCrc object. :param block_size: The block size for this domain. :param comp_mask: Compatibility mask. """ self.mlx5dv_sig_block_domain.sig_type = sig_type self.mlx5dv_sig_block_domain.block_size = block_size self.mlx5dv_sig_block_domain.comp_mask = comp_mask if dif: self.mlx5dv_sig_block_domain.sig.dif = &dif.mlx5dv_sig_t10dif if crc: self.mlx5dv_sig_block_domain.sig.crc = &crc.mlx5dv_sig_crc cdef class Mlx5SigBlockAttr(PyverbsObject): def __init__(self, Mlx5SigBlockDomain mem=None, Mlx5SigBlockDomain wire=None, flags=0, check_mask=0, copy_mask=0, comp_mask=0): """ Initializes a Mlx5SigBlockAttr object representing mlx5dv_sig_block_attr C struct. :param mem: Mlx5SigBlockDomain of the signature configuration for the memory domain or None if the domain does not have a signature. :param wire: Mlx5SigBlockDomain of the signature configuration for the wire domain or None if the domain does not have a signature. :param flags: Flags for the block signature attributes. :param check_mask: Byte of the input signature is checked if corresponding bit in check_mask is set. :param copy_mask: Byte of the signature is copied from the source domain to the destination domain if corresponding bit in copy_mask is set. :param comp_mask: Compatibility mask. """ self.mlx5dv_sig_block_attr.flags = flags self.mlx5dv_sig_block_attr.check_mask = check_mask self.mlx5dv_sig_block_attr.copy_mask = copy_mask self.mlx5dv_sig_block_attr.comp_mask = comp_mask if mem: self.mlx5dv_sig_block_attr.mem = &mem.mlx5dv_sig_block_domain if wire: self.mlx5dv_sig_block_attr.wire = &wire.mlx5dv_sig_block_domain cdef class Mlx5SigErr(PyverbsObject): def __init__(self, actual_value=0, expected_value=0, offset=0): """ Initializes a Mlx5SigBlockAttr object representing mlx5dv_sig_block_attr C struct. :param actual_value: The actual value that was calculated from the transferred data. :param expected_value: The expected value based on what appears in the signature respected field. :param offset: The offset within the transfer where the error happened. """ self.mlx5dv_sig_err.actual_value = actual_value self.mlx5dv_sig_err.expected_value = expected_value self.mlx5dv_sig_err.offset = offset @property def actual_value(self): return self.mlx5dv_sig_err.actual_value @property def expected_value(self): return self.mlx5dv_sig_err.expected_value @property def offset(self): return self.mlx5dv_sig_err.offset cdef class Mlx5MkeyErr(PyverbsObject): def __init__(self, Mlx5SigErr sig_err=Mlx5SigErr(), err_type=dv.MLX5DV_MKEY_NO_ERR): """ Initializes a Mlx5MkeyErr object representing mlx5dv_mkey_err C struct. :param sig_err: Mlx5SigErr object that handle the sig error. :param err_type: Indicate what kind of error happened. """ self.mlx5dv_mkey_err.err_type = err_type self.mlx5dv_mkey_err.err.sig = sig_err.mlx5dv_sig_err @property def err_type(self): return self.mlx5dv_mkey_err.err_type @property def sig_err(self): return Mlx5SigErr(self.mlx5dv_mkey_err.err.sig.actual_value, self.mlx5dv_mkey_err.err.sig.expected_value, self.mlx5dv_mkey_err.err.sig.offset) cdef class Mlx5MkeyConfAttr(PyverbsObject): def __init__(self, conf_flags=0, comp_mask=0): """ Initializes a Mlx5MkeyConfAttr object representing mlx5dv_mkey_conf_attr C struct. :param conf_flags: Mkey configuration flags. :param comp_mask: Compatibility mask. """ self.mlx5dv_mkey_conf_attr.conf_flags = conf_flags self.mlx5dv_mkey_conf_attr.comp_mask = comp_mask cdef class Mlx5MrInterleaved(PyverbsObject): def __init__(self, addr, bytes_count, bytes_skip, lkey): """ Initializes a Mlx5MrInterleaved object representing mlx5dv_mr_interleaved C struct. :param addr: The start of address. :param bytes_count: Count of bytes from the address that will hold the real data. :param bytes_skip: Count of bytes to skip after the bytes_count. :param lkey: The lkey of this memory. """ self.mlx5dv_mr_interleaved.addr = addr self.mlx5dv_mr_interleaved.bytes_count = bytes_count self.mlx5dv_mr_interleaved.bytes_skip = bytes_skip self.mlx5dv_mr_interleaved.lkey = lkey cdef class Mlx5Mkey(PyverbsCM): def __init__(self, PD pd not None, create_flags, max_entries): """ Creates an indirect mkey and store the actual mkey max_entries after the mkey creation. :param pd: PD instance. :param create_flags: Mkey creation flags. :param max_entries: Requested max number of pointed entries by this indirect mkey. """ cdef dv.mlx5dv_mkey_init_attr mkey_init mkey_init.pd = pd.pd mkey_init.create_flags = create_flags mkey_init.max_entries = max_entries self.mlx5dv_mkey = dv.mlx5dv_create_mkey(&mkey_init) if self.mlx5dv_mkey == NULL: raise PyverbsRDMAErrno('Failed to create mkey') self.max_entries = mkey_init.max_entries self.pd = pd self.pd.mkeys.add(self) def mkey_check(self): """ Checks the mkey for errors and provides the result in err_info on success. :return: Mlx5MkeyErr object, the result of the Mkey check. """ mkey_err = Mlx5MkeyErr() rc = dv.mlx5dv_mkey_check(self.mlx5dv_mkey, &mkey_err.mlx5dv_mkey_err) if rc: raise PyverbsRDMAError('Failed to check the mkey', rc) return mkey_err @property def lkey(self): return self.mlx5dv_mkey.lkey @property def rkey(self): return self.mlx5dv_mkey.rkey @property def max_entries(self): return self.max_entries def __dealloc__(self): self.close() cpdef close(self): if self.mlx5dv_mkey != NULL: rc = dv.mlx5dv_destroy_mkey(self.mlx5dv_mkey) if rc: raise PyverbsRDMAError('Failed to destroy a mkey', rc) self.mlx5dv_mkey = NULL self.pd = None