mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
RDMA/bnxt_re: Add UAPI to share a page with user space
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>
This commit is contained in:
parent
4f973e211b
commit
9b0a7a2cb8
@ -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),
|
||||
{}
|
||||
};
|
||||
|
@ -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 {
|
||||
|
@ -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__*/
|
||||
|
Loading…
Reference in New Issue
Block a user