162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2022, Microsoft Corporation. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "mana_ib.h" 762306a36Sopenharmony_ci#include <net/mana/mana_auxiliary.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciMODULE_DESCRIPTION("Microsoft Azure Network Adapter IB driver"); 1062306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 1162306a36Sopenharmony_ciMODULE_IMPORT_NS(NET_MANA); 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic const struct ib_device_ops mana_ib_dev_ops = { 1462306a36Sopenharmony_ci .owner = THIS_MODULE, 1562306a36Sopenharmony_ci .driver_id = RDMA_DRIVER_MANA, 1662306a36Sopenharmony_ci .uverbs_abi_ver = MANA_IB_UVERBS_ABI_VERSION, 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci .alloc_pd = mana_ib_alloc_pd, 1962306a36Sopenharmony_ci .alloc_ucontext = mana_ib_alloc_ucontext, 2062306a36Sopenharmony_ci .create_cq = mana_ib_create_cq, 2162306a36Sopenharmony_ci .create_qp = mana_ib_create_qp, 2262306a36Sopenharmony_ci .create_rwq_ind_table = mana_ib_create_rwq_ind_table, 2362306a36Sopenharmony_ci .create_wq = mana_ib_create_wq, 2462306a36Sopenharmony_ci .dealloc_pd = mana_ib_dealloc_pd, 2562306a36Sopenharmony_ci .dealloc_ucontext = mana_ib_dealloc_ucontext, 2662306a36Sopenharmony_ci .dereg_mr = mana_ib_dereg_mr, 2762306a36Sopenharmony_ci .destroy_cq = mana_ib_destroy_cq, 2862306a36Sopenharmony_ci .destroy_qp = mana_ib_destroy_qp, 2962306a36Sopenharmony_ci .destroy_rwq_ind_table = mana_ib_destroy_rwq_ind_table, 3062306a36Sopenharmony_ci .destroy_wq = mana_ib_destroy_wq, 3162306a36Sopenharmony_ci .disassociate_ucontext = mana_ib_disassociate_ucontext, 3262306a36Sopenharmony_ci .get_port_immutable = mana_ib_get_port_immutable, 3362306a36Sopenharmony_ci .mmap = mana_ib_mmap, 3462306a36Sopenharmony_ci .modify_qp = mana_ib_modify_qp, 3562306a36Sopenharmony_ci .modify_wq = mana_ib_modify_wq, 3662306a36Sopenharmony_ci .query_device = mana_ib_query_device, 3762306a36Sopenharmony_ci .query_gid = mana_ib_query_gid, 3862306a36Sopenharmony_ci .query_port = mana_ib_query_port, 3962306a36Sopenharmony_ci .reg_user_mr = mana_ib_reg_user_mr, 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci INIT_RDMA_OBJ_SIZE(ib_cq, mana_ib_cq, ibcq), 4262306a36Sopenharmony_ci INIT_RDMA_OBJ_SIZE(ib_pd, mana_ib_pd, ibpd), 4362306a36Sopenharmony_ci INIT_RDMA_OBJ_SIZE(ib_qp, mana_ib_qp, ibqp), 4462306a36Sopenharmony_ci INIT_RDMA_OBJ_SIZE(ib_ucontext, mana_ib_ucontext, ibucontext), 4562306a36Sopenharmony_ci INIT_RDMA_OBJ_SIZE(ib_rwq_ind_table, mana_ib_rwq_ind_table, 4662306a36Sopenharmony_ci ib_ind_table), 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic int mana_ib_probe(struct auxiliary_device *adev, 5062306a36Sopenharmony_ci const struct auxiliary_device_id *id) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci struct mana_adev *madev = container_of(adev, struct mana_adev, adev); 5362306a36Sopenharmony_ci struct gdma_dev *mdev = madev->mdev; 5462306a36Sopenharmony_ci struct mana_context *mc; 5562306a36Sopenharmony_ci struct mana_ib_dev *dev; 5662306a36Sopenharmony_ci int ret; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci mc = mdev->driver_data; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci dev = ib_alloc_device(mana_ib_dev, ib_dev); 6162306a36Sopenharmony_ci if (!dev) 6262306a36Sopenharmony_ci return -ENOMEM; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci ib_set_device_ops(&dev->ib_dev, &mana_ib_dev_ops); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci dev->ib_dev.phys_port_cnt = mc->num_ports; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci ibdev_dbg(&dev->ib_dev, "mdev=%p id=%d num_ports=%d\n", mdev, 6962306a36Sopenharmony_ci mdev->dev_id.as_uint32, dev->ib_dev.phys_port_cnt); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci dev->gdma_dev = mdev; 7262306a36Sopenharmony_ci dev->ib_dev.node_type = RDMA_NODE_IB_CA; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* 7562306a36Sopenharmony_ci * num_comp_vectors needs to set to the max MSIX index 7662306a36Sopenharmony_ci * when interrupts and event queues are implemented 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci dev->ib_dev.num_comp_vectors = 1; 7962306a36Sopenharmony_ci dev->ib_dev.dev.parent = mdev->gdma_context->dev; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci ret = ib_register_device(&dev->ib_dev, "mana_%d", 8262306a36Sopenharmony_ci mdev->gdma_context->dev); 8362306a36Sopenharmony_ci if (ret) { 8462306a36Sopenharmony_ci ib_dealloc_device(&dev->ib_dev); 8562306a36Sopenharmony_ci return ret; 8662306a36Sopenharmony_ci } 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci dev_set_drvdata(&adev->dev, dev); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci return 0; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic void mana_ib_remove(struct auxiliary_device *adev) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci struct mana_ib_dev *dev = dev_get_drvdata(&adev->dev); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci ib_unregister_device(&dev->ib_dev); 9862306a36Sopenharmony_ci ib_dealloc_device(&dev->ib_dev); 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic const struct auxiliary_device_id mana_id_table[] = { 10262306a36Sopenharmony_ci { 10362306a36Sopenharmony_ci .name = "mana.rdma", 10462306a36Sopenharmony_ci }, 10562306a36Sopenharmony_ci {}, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciMODULE_DEVICE_TABLE(auxiliary, mana_id_table); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic struct auxiliary_driver mana_driver = { 11162306a36Sopenharmony_ci .name = "rdma", 11262306a36Sopenharmony_ci .probe = mana_ib_probe, 11362306a36Sopenharmony_ci .remove = mana_ib_remove, 11462306a36Sopenharmony_ci .id_table = mana_id_table, 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cimodule_auxiliary_driver(mana_driver); 118