|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB |
2 | 2 | /* |
3 | | - * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. |
| 3 | + * Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved. |
4 | 4 | */ |
5 | 5 |
|
6 | 6 | #include <linux/dma-buf.h> |
|
13 | 13 | #include <rdma/ib_user_verbs.h> |
14 | 14 | #include <rdma/ib_verbs.h> |
15 | 15 | #include <rdma/uverbs_ioctl.h> |
| 16 | +#define UVERBS_MODULE_NAME efa_ib |
| 17 | +#include <rdma/uverbs_named_ioctl.h> |
| 18 | +#include <rdma/ib_user_ioctl_cmds.h> |
16 | 19 |
|
17 | 20 | #include "efa.h" |
18 | 21 | #include "efa_io_defs.h" |
@@ -1653,6 +1656,12 @@ static int efa_register_mr(struct ib_pd *ibpd, struct efa_mr *mr, u64 start, |
1653 | 1656 | mr->ibmr.lkey = result.l_key; |
1654 | 1657 | mr->ibmr.rkey = result.r_key; |
1655 | 1658 | mr->ibmr.length = length; |
| 1659 | + mr->ic_info.recv_ic_id = result.ic_info.recv_ic_id; |
| 1660 | + mr->ic_info.rdma_read_ic_id = result.ic_info.rdma_read_ic_id; |
| 1661 | + mr->ic_info.rdma_recv_ic_id = result.ic_info.rdma_recv_ic_id; |
| 1662 | + mr->ic_info.recv_ic_id_valid = result.ic_info.recv_ic_id_valid; |
| 1663 | + mr->ic_info.rdma_read_ic_id_valid = result.ic_info.rdma_read_ic_id_valid; |
| 1664 | + mr->ic_info.rdma_recv_ic_id_valid = result.ic_info.rdma_recv_ic_id_valid; |
1656 | 1665 | ibdev_dbg(&dev->ibdev, "Registered mr[%d]\n", mr->ibmr.lkey); |
1657 | 1666 |
|
1658 | 1667 | return 0; |
@@ -1735,6 +1744,39 @@ struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length, |
1735 | 1744 | return ERR_PTR(err); |
1736 | 1745 | } |
1737 | 1746 |
|
| 1747 | +static int UVERBS_HANDLER(EFA_IB_METHOD_MR_QUERY)(struct uverbs_attr_bundle *attrs) |
| 1748 | +{ |
| 1749 | + struct ib_mr *ibmr = uverbs_attr_get_obj(attrs, EFA_IB_ATTR_QUERY_MR_HANDLE); |
| 1750 | + struct efa_mr *mr = to_emr(ibmr); |
| 1751 | + u16 ic_id_validity = 0; |
| 1752 | + int ret; |
| 1753 | + |
| 1754 | + ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID, |
| 1755 | + &mr->ic_info.recv_ic_id, sizeof(mr->ic_info.recv_ic_id)); |
| 1756 | + if (ret) |
| 1757 | + return ret; |
| 1758 | + |
| 1759 | + ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID, |
| 1760 | + &mr->ic_info.rdma_read_ic_id, sizeof(mr->ic_info.rdma_read_ic_id)); |
| 1761 | + if (ret) |
| 1762 | + return ret; |
| 1763 | + |
| 1764 | + ret = uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID, |
| 1765 | + &mr->ic_info.rdma_recv_ic_id, sizeof(mr->ic_info.rdma_recv_ic_id)); |
| 1766 | + if (ret) |
| 1767 | + return ret; |
| 1768 | + |
| 1769 | + if (mr->ic_info.recv_ic_id_valid) |
| 1770 | + ic_id_validity |= EFA_QUERY_MR_VALIDITY_RECV_IC_ID; |
| 1771 | + if (mr->ic_info.rdma_read_ic_id_valid) |
| 1772 | + ic_id_validity |= EFA_QUERY_MR_VALIDITY_RDMA_READ_IC_ID; |
| 1773 | + if (mr->ic_info.rdma_recv_ic_id_valid) |
| 1774 | + ic_id_validity |= EFA_QUERY_MR_VALIDITY_RDMA_RECV_IC_ID; |
| 1775 | + |
| 1776 | + return uverbs_copy_to(attrs, EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY, |
| 1777 | + &ic_id_validity, sizeof(ic_id_validity)); |
| 1778 | +} |
| 1779 | + |
1738 | 1780 | int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) |
1739 | 1781 | { |
1740 | 1782 | struct efa_dev *dev = to_edev(ibmr->device); |
@@ -2157,3 +2199,30 @@ enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev, |
2157 | 2199 | return IB_LINK_LAYER_UNSPECIFIED; |
2158 | 2200 | } |
2159 | 2201 |
|
| 2202 | +DECLARE_UVERBS_NAMED_METHOD(EFA_IB_METHOD_MR_QUERY, |
| 2203 | + UVERBS_ATTR_IDR(EFA_IB_ATTR_QUERY_MR_HANDLE, |
| 2204 | + UVERBS_OBJECT_MR, |
| 2205 | + UVERBS_ACCESS_READ, |
| 2206 | + UA_MANDATORY), |
| 2207 | + UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY, |
| 2208 | + UVERBS_ATTR_TYPE(u16), |
| 2209 | + UA_MANDATORY), |
| 2210 | + UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID, |
| 2211 | + UVERBS_ATTR_TYPE(u16), |
| 2212 | + UA_MANDATORY), |
| 2213 | + UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID, |
| 2214 | + UVERBS_ATTR_TYPE(u16), |
| 2215 | + UA_MANDATORY), |
| 2216 | + UVERBS_ATTR_PTR_OUT(EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID, |
| 2217 | + UVERBS_ATTR_TYPE(u16), |
| 2218 | + UA_MANDATORY)); |
| 2219 | + |
| 2220 | +ADD_UVERBS_METHODS(efa_mr, |
| 2221 | + UVERBS_OBJECT_MR, |
| 2222 | + &UVERBS_METHOD(EFA_IB_METHOD_MR_QUERY)); |
| 2223 | + |
| 2224 | +const struct uapi_definition efa_uapi_defs[] = { |
| 2225 | + UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_MR, |
| 2226 | + &efa_mr), |
| 2227 | + {}, |
| 2228 | +}; |
0 commit comments