2019-04-01 19:13:35 +08:00
// SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
// Copyright (c) 2019 Hisilicon Limited.
# include <rdma/rdma_cm.h>
# include <rdma/restrack.h>
# include <uapi/rdma/rdma_netlink.h>
# include "hnae3.h"
# include "hns_roce_common.h"
# include "hns_roce_device.h"
# include "hns_roce_hw_v2.h"
static int hns_roce_fill_cq ( struct sk_buff * msg ,
struct hns_roce_v2_cq_context * context )
{
if ( rdma_nl_put_driver_u32 ( msg , " state " ,
roce_get_field ( context - > byte_4_pg_ceqn ,
V2_CQC_BYTE_4_ARM_ST_M ,
V2_CQC_BYTE_4_ARM_ST_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 ( msg , " ceqn " ,
roce_get_field ( context - > byte_4_pg_ceqn ,
V2_CQC_BYTE_4_CEQN_M ,
V2_CQC_BYTE_4_CEQN_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 ( msg , " cqn " ,
roce_get_field ( context - > byte_8_cqn ,
V2_CQC_BYTE_8_CQN_M ,
V2_CQC_BYTE_8_CQN_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 ( msg , " hopnum " ,
roce_get_field ( context - > byte_16_hop_addr ,
V2_CQC_BYTE_16_CQE_HOP_NUM_M ,
V2_CQC_BYTE_16_CQE_HOP_NUM_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 (
msg , " pi " ,
roce_get_field ( context - > byte_28_cq_pi ,
V2_CQC_BYTE_28_CQ_PRODUCER_IDX_M ,
V2_CQC_BYTE_28_CQ_PRODUCER_IDX_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 (
msg , " ci " ,
roce_get_field ( context - > byte_32_cq_ci ,
V2_CQC_BYTE_32_CQ_CONSUMER_IDX_M ,
V2_CQC_BYTE_32_CQ_CONSUMER_IDX_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 (
msg , " coalesce " ,
roce_get_field ( context - > byte_56_cqe_period_maxcnt ,
V2_CQC_BYTE_56_CQ_MAX_CNT_M ,
V2_CQC_BYTE_56_CQ_MAX_CNT_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 (
msg , " period " ,
roce_get_field ( context - > byte_56_cqe_period_maxcnt ,
V2_CQC_BYTE_56_CQ_PERIOD_M ,
V2_CQC_BYTE_56_CQ_PERIOD_S ) ) )
goto err ;
if ( rdma_nl_put_driver_u32 ( msg , " cnt " ,
roce_get_field ( context - > byte_52_cqe_cnt ,
V2_CQC_BYTE_52_CQE_CNT_M ,
V2_CQC_BYTE_52_CQE_CNT_S ) ) )
goto err ;
return 0 ;
err :
return - EMSGSIZE ;
}
2020-06-23 14:30:37 +03:00
int hns_roce_fill_res_cq_entry ( struct sk_buff * msg ,
struct ib_cq * ib_cq )
2019-04-01 19:13:35 +08:00
{
struct hns_roce_dev * hr_dev = to_hr_dev ( ib_cq - > device ) ;
struct hns_roce_cq * hr_cq = to_hr_cq ( ib_cq ) ;
struct hns_roce_v2_cq_context * context ;
struct nlattr * table_attr ;
int ret ;
if ( ! hr_dev - > dfx - > query_cqc_info )
return - EINVAL ;
context = kzalloc ( sizeof ( struct hns_roce_v2_cq_context ) , GFP_KERNEL ) ;
if ( ! context )
return - ENOMEM ;
ret = hr_dev - > dfx - > query_cqc_info ( hr_dev , hr_cq - > cqn , ( int * ) context ) ;
if ( ret )
2019-10-24 14:10:34 +01:00
goto err ;
2019-04-01 19:13:35 +08:00
table_attr = nla_nest_start ( msg , RDMA_NLDEV_ATTR_DRIVER ) ;
2019-10-24 14:10:34 +01:00
if ( ! table_attr ) {
ret = - EMSGSIZE ;
2019-04-01 19:13:35 +08:00
goto err ;
2019-10-24 14:10:34 +01:00
}
2019-04-01 19:13:35 +08:00
2019-10-24 14:10:34 +01:00
if ( hns_roce_fill_cq ( msg , context ) ) {
ret = - EMSGSIZE ;
2019-04-01 19:13:35 +08:00
goto err_cancel_table ;
2019-10-24 14:10:34 +01:00
}
2019-04-01 19:13:35 +08:00
nla_nest_end ( msg , table_attr ) ;
kfree ( context ) ;
return 0 ;
err_cancel_table :
nla_nest_cancel ( msg , table_attr ) ;
err :
kfree ( context ) ;
2019-10-24 14:10:34 +01:00
return ret ;
2019-04-01 19:13:35 +08:00
}