blob: e98e1a11d199bfa1dced507a0ebb55628fa80a93 [file]
# 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