RDMA/bnxt_re: Add UAPI to share a page with user space
authorSelvin Xavier <selvin.xavier@broadcom.com>
Thu, 14 Dec 2023 06:31:23 +0000 (22:31 -0800)
committerLeon Romanovsky <leon@kernel.org>
Sun, 17 Dec 2023 13:35:58 +0000 (15:35 +0200)
Gen P7 adapters require to share a toggle value for CQ
and SRQ. This is received by the driver as part of
interrupt notifications and needs to be shared with the
user space. Add a new UAPI infrastructure to get the
shared page for CQ and SRQ.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://lore.kernel.org/r/1702535484-26844-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/ib_verbs.h
include/uapi/rdma/bnxt_re-abi.h

index e7ef099c3edd34fa968b1927f320ff5b9a0168c1..758ea02e1d139c34effc9dcd6b2e908eb944305e 100644 (file)
@@ -567,6 +567,7 @@ bnxt_re_mmap_entry_insert(struct bnxt_re_ucontext *uctx, u64 mem_offset,
        case BNXT_RE_MMAP_WC_DB:
        case BNXT_RE_MMAP_DBR_BAR:
        case BNXT_RE_MMAP_DBR_PAGE:
+       case BNXT_RE_MMAP_TOGGLE_PAGE:
                ret = rdma_user_mmap_entry_insert(&uctx->ib_uctx,
                                                  &entry->rdma_entry, PAGE_SIZE);
                break;
@@ -4254,6 +4255,7 @@ int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
                                        rdma_entry);
                break;
        case BNXT_RE_MMAP_DBR_PAGE:
+       case BNXT_RE_MMAP_TOGGLE_PAGE:
                /* Driver doesn't expect write access for user space */
                if (vma->vm_flags & VM_WRITE)
                        return -EFAULT;
@@ -4430,8 +4432,111 @@ DECLARE_UVERBS_NAMED_METHOD(BNXT_RE_METHOD_NOTIFY_DRV);
 DECLARE_UVERBS_GLOBAL_METHODS(BNXT_RE_OBJECT_NOTIFY_DRV,
                              &UVERBS_METHOD(BNXT_RE_METHOD_NOTIFY_DRV));
 
+/* Toggle MEM */
+static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bundle *attrs)
+{
+       struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs, BNXT_RE_TOGGLE_MEM_HANDLE);
+       enum bnxt_re_mmap_flag mmap_flag = BNXT_RE_MMAP_TOGGLE_PAGE;
+       enum bnxt_re_get_toggle_mem_type res_type;
+       struct bnxt_re_user_mmap_entry *entry;
+       struct bnxt_re_ucontext *uctx;
+       struct ib_ucontext *ib_uctx;
+       struct bnxt_re_dev *rdev;
+       u64 mem_offset;
+       u64 addr = 0;
+       u32 length;
+       u32 offset;
+       int err;
+
+       ib_uctx = ib_uverbs_get_ucontext(attrs);
+       if (IS_ERR(ib_uctx))
+               return PTR_ERR(ib_uctx);
+
+       err = uverbs_get_const(&res_type, attrs, BNXT_RE_TOGGLE_MEM_TYPE);
+       if (err)
+               return err;
+
+       uctx = container_of(ib_uctx, struct bnxt_re_ucontext, ib_uctx);
+       rdev = uctx->rdev;
+
+       switch (res_type) {
+       case BNXT_RE_CQ_TOGGLE_MEM:
+       case BNXT_RE_SRQ_TOGGLE_MEM:
+               break;
+
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       entry = bnxt_re_mmap_entry_insert(uctx, addr, mmap_flag, &mem_offset);
+       if (!entry)
+               return -ENOMEM;
+
+       uobj->object = entry;
+       uverbs_finalize_uobj_create(attrs, BNXT_RE_TOGGLE_MEM_HANDLE);
+       err = uverbs_copy_to(attrs, BNXT_RE_TOGGLE_MEM_MMAP_PAGE,
+                            &mem_offset, sizeof(mem_offset));
+       if (err)
+               return err;
+
+       err = uverbs_copy_to(attrs, BNXT_RE_TOGGLE_MEM_MMAP_LENGTH,
+                            &length, sizeof(length));
+       if (err)
+               return err;
+
+       err = uverbs_copy_to(attrs, BNXT_RE_TOGGLE_MEM_MMAP_OFFSET,
+                            &offset, sizeof(length));
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int get_toggle_mem_obj_cleanup(struct ib_uobject *uobject,
+                                     enum rdma_remove_reason why,
+                                     struct uverbs_attr_bundle *attrs)
+{
+       struct  bnxt_re_user_mmap_entry *entry = uobject->object;
+
+       rdma_user_mmap_entry_remove(&entry->rdma_entry);
+       return 0;
+}
+
+DECLARE_UVERBS_NAMED_METHOD(BNXT_RE_METHOD_GET_TOGGLE_MEM,
+                           UVERBS_ATTR_IDR(BNXT_RE_TOGGLE_MEM_HANDLE,
+                                           BNXT_RE_OBJECT_GET_TOGGLE_MEM,
+                                           UVERBS_ACCESS_NEW,
+                                           UA_MANDATORY),
+                           UVERBS_ATTR_CONST_IN(BNXT_RE_TOGGLE_MEM_TYPE,
+                                                enum bnxt_re_get_toggle_mem_type,
+                                                UA_MANDATORY),
+                           UVERBS_ATTR_PTR_IN(BNXT_RE_TOGGLE_MEM_RES_ID,
+                                              UVERBS_ATTR_TYPE(u32),
+                                              UA_MANDATORY),
+                           UVERBS_ATTR_PTR_OUT(BNXT_RE_TOGGLE_MEM_MMAP_PAGE,
+                                               UVERBS_ATTR_TYPE(u64),
+                                               UA_MANDATORY),
+                           UVERBS_ATTR_PTR_OUT(BNXT_RE_TOGGLE_MEM_MMAP_OFFSET,
+                                               UVERBS_ATTR_TYPE(u32),
+                                               UA_MANDATORY),
+                           UVERBS_ATTR_PTR_OUT(BNXT_RE_TOGGLE_MEM_MMAP_LENGTH,
+                                               UVERBS_ATTR_TYPE(u32),
+                                               UA_MANDATORY));
+
+DECLARE_UVERBS_NAMED_METHOD_DESTROY(BNXT_RE_METHOD_RELEASE_TOGGLE_MEM,
+                                   UVERBS_ATTR_IDR(BNXT_RE_RELEASE_TOGGLE_MEM_HANDLE,
+                                                   BNXT_RE_OBJECT_GET_TOGGLE_MEM,
+                                                   UVERBS_ACCESS_DESTROY,
+                                                   UA_MANDATORY));
+
+DECLARE_UVERBS_NAMED_OBJECT(BNXT_RE_OBJECT_GET_TOGGLE_MEM,
+                           UVERBS_TYPE_ALLOC_IDR(get_toggle_mem_obj_cleanup),
+                           &UVERBS_METHOD(BNXT_RE_METHOD_GET_TOGGLE_MEM),
+                           &UVERBS_METHOD(BNXT_RE_METHOD_RELEASE_TOGGLE_MEM));
+
 const struct uapi_definition bnxt_re_uapi_defs[] = {
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(BNXT_RE_OBJECT_ALLOC_PAGE),
        UAPI_DEF_CHAIN_OBJ_TREE_NAMED(BNXT_RE_OBJECT_NOTIFY_DRV),
+       UAPI_DEF_CHAIN_OBJ_TREE_NAMED(BNXT_RE_OBJECT_GET_TOGGLE_MEM),
        {}
 };
index 98baea98fc176143c976d3b89eba8ecd57e56554..da3fe018f2557313cf07515abb789e9e58e1eb83 100644 (file)
@@ -149,6 +149,7 @@ enum bnxt_re_mmap_flag {
        BNXT_RE_MMAP_WC_DB,
        BNXT_RE_MMAP_DBR_PAGE,
        BNXT_RE_MMAP_DBR_BAR,
+       BNXT_RE_MMAP_TOGGLE_PAGE,
 };
 
 struct bnxt_re_user_mmap_entry {
index 3342276aeac137c1b71b70801bae5ce94cc3d022..9b9eb10cb5e5e6cb8d359798a3ea39b79c7ff6a9 100644 (file)
@@ -143,6 +143,7 @@ enum bnxt_re_shpg_offt {
 enum bnxt_re_objects {
        BNXT_RE_OBJECT_ALLOC_PAGE = (1U << UVERBS_ID_NS_SHIFT),
        BNXT_RE_OBJECT_NOTIFY_DRV,
+       BNXT_RE_OBJECT_GET_TOGGLE_MEM,
 };
 
 enum bnxt_re_alloc_page_type {
@@ -171,4 +172,29 @@ enum bnxt_re_alloc_page_methods {
 enum bnxt_re_notify_drv_methods {
        BNXT_RE_METHOD_NOTIFY_DRV = (1U << UVERBS_ID_NS_SHIFT),
 };
+
+/* Toggle mem */
+
+enum bnxt_re_get_toggle_mem_type {
+       BNXT_RE_CQ_TOGGLE_MEM = 0,
+       BNXT_RE_SRQ_TOGGLE_MEM,
+};
+
+enum bnxt_re_var_toggle_mem_attrs {
+       BNXT_RE_TOGGLE_MEM_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+       BNXT_RE_TOGGLE_MEM_TYPE,
+       BNXT_RE_TOGGLE_MEM_RES_ID,
+       BNXT_RE_TOGGLE_MEM_MMAP_PAGE,
+       BNXT_RE_TOGGLE_MEM_MMAP_OFFSET,
+       BNXT_RE_TOGGLE_MEM_MMAP_LENGTH,
+};
+
+enum bnxt_re_toggle_mem_attrs {
+       BNXT_RE_RELEASE_TOGGLE_MEM_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
+};
+
+enum bnxt_re_toggle_mem_methods {
+       BNXT_RE_METHOD_GET_TOGGLE_MEM = (1U << UVERBS_ID_NS_SHIFT),
+       BNXT_RE_METHOD_RELEASE_TOGGLE_MEM,
+};
 #endif /* __BNXT_RE_UVERBS_ABI_H__*/