| // SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB |
| /* |
| * Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved |
| */ |
| |
| #include <infiniband/cmd_write.h> |
| |
| int ibv_cmd_alloc_dmah(struct ibv_context *ctx, |
| struct verbs_dmah *dmah, |
| struct ibv_dmah_init_attr *attr) |
| { |
| DECLARE_COMMAND_BUFFER(cmdb, UVERBS_OBJECT_DMAH, UVERBS_METHOD_DMAH_ALLOC, 4); |
| struct ib_uverbs_attr *handle; |
| int ret; |
| |
| handle = fill_attr_out_obj(cmdb, UVERBS_ATTR_ALLOC_DMAH_HANDLE); |
| if (attr->comp_mask & IBV_DMAH_INIT_ATTR_MASK_CPU_ID) |
| fill_attr_in_uint32(cmdb, UVERBS_ATTR_ALLOC_DMAH_CPU_ID, |
| attr->cpu_id); |
| if (attr->comp_mask & IBV_DMAH_INIT_ATTR_MASK_TPH_MEM_TYPE) |
| fill_attr_in_enum(cmdb, UVERBS_ATTR_ALLOC_DMAH_TPH_MEM_TYPE, |
| attr->tph_mem_type, NULL, 0); |
| if (attr->comp_mask & IBV_DMAH_INIT_ATTR_MASK_PH) |
| fill_attr_in(cmdb, UVERBS_ATTR_ALLOC_DMAH_PH, |
| &attr->ph, sizeof(attr->ph)); |
| ret = execute_ioctl(ctx, cmdb); |
| if (ret) |
| return errno; |
| |
| dmah->handle = read_attr_obj(UVERBS_ATTR_ALLOC_DMAH_HANDLE, handle); |
| dmah->dmah.context = ctx; |
| |
| return 0; |
| } |
| |
| int ibv_cmd_free_dmah(struct verbs_dmah *dmah) |
| { |
| DECLARE_COMMAND_BUFFER(cmdb, UVERBS_OBJECT_DMAH, UVERBS_METHOD_DMAH_FREE, 1); |
| int ret; |
| |
| fill_attr_in_obj(cmdb, UVERBS_ATTR_FREE_DMA_HANDLE, dmah->handle); |
| |
| ret = execute_ioctl(dmah->dmah.context, cmdb); |
| if (verbs_is_destroy_err(&ret)) |
| return ret; |
| |
| return 0; |
| } |