diff --git a/src/urpc/include/umq/transport_layer/umq_tp_api.h b/src/urpc/include/umq/transport_layer/umq_tp_api.h index a2aabc0142a3a72d1fda3221b1c8385224540bfb..d11a486ee3aae2f1e62a61fc20bbf0a3f180c630 100644 --- a/src/urpc/include/umq/transport_layer/umq_tp_api.h +++ b/src/urpc/include/umq/transport_layer/umq_tp_api.h @@ -261,6 +261,13 @@ typedef struct umq_ops { * Return: 0 on success, other value on error */ int (*umq_tp_dev_info_get)(char *dev_name, umq_trans_mode_t umq_trans_mode, umq_dev_info_t *umq_dev_info); + /** + * Get umq cfg. + * @param[in] umqh_tp: umq tp handle + * @param[out] cfg: umq cfg + * Return: 0 on success, other value on error + */ + int (*umq_tp_cfg_get)(uint64_t umqh_tp, umq_qcfg_get_t *cfg); } umq_ops_t; typedef umq_ops_t* (*umq_ops_get_t)(void); diff --git a/src/urpc/include/umq/umq_api.h b/src/urpc/include/umq/umq_api.h index b8cec114fdc0ad4cd766f5d59a6602c09505dc29..eb891ea6d4ecfba65da9f84e553d44ea61740f85 100644 --- a/src/urpc/include/umq/umq_api.h +++ b/src/urpc/include/umq/umq_api.h @@ -304,6 +304,14 @@ int umq_mempool_state_refresh(uint64_t umqh, uint32_t mempool_id); */ int umq_dev_info_get(char *dev_name, umq_trans_mode_t umq_trans_mode, umq_dev_info_t *umq_dev_info); +/** + * Query umq configuration + * @param[in] umqh: Queue handle + * @param[out] cfg: Configuration information for umq + * Return 0 on success, error code on failure, other value on error + */ +int umq_cfg_get(uint64_t umqh, umq_qcfg_get_t *cfg); + #ifdef __cplusplus } #endif diff --git a/src/urpc/include/umq/umq_types.h b/src/urpc/include/umq/umq_types.h index 183b9827ef616bc383208359d9f82b6f1b37e03b..7c88b626779ff922edfd0a99b41e82126631c856 100644 --- a/src/urpc/include/umq/umq_types.h +++ b/src/urpc/include/umq/umq_types.h @@ -553,6 +553,19 @@ typedef struct umq_dev_info { }; } umq_dev_info_t; +typedef struct umq_qcfg_get { + uint32_t create_flag; // indicates which below creation property takes effect + uint32_t rx_buf_size; // size of the receive buffer + uint32_t tx_buf_size; // size of the send buffer + uint32_t rx_depth; // depth of the receive buffer ring + uint32_t tx_depth; // depth of the send buffer ring + uint64_t umq_ctx; // umq ctx + uint64_t share_rq_umqh; // share jfr queue handle + umq_trans_mode_t trans_mode; // transmission mode of the queue + umq_queue_mode_t mode; // mode of queue, QUEUE_MODE_POLLING for default + umq_state_t state; // queue state +} umq_qcfg_get_t; + #ifdef __cplusplus } #endif diff --git a/src/urpc/umq/umq_api.c b/src/urpc/umq/umq_api.c index f817d168f978e833b71bd48a50eb53b5d8c68c6e..42feebdf38b0e637133264f7dd2993d73b23edc8 100644 --- a/src/urpc/umq/umq_api.c +++ b/src/urpc/umq/umq_api.c @@ -1107,4 +1107,15 @@ int umq_dev_info_get(char *dev_name, umq_trans_mode_t umq_trans_mode, umq_dev_in } return umq_fw->tp_ops->umq_tp_dev_info_get(dev_name, umq_trans_mode, umq_dev_info); +} + +int umq_cfg_get(uint64_t umqh, umq_qcfg_get_t *cfg) +{ + umq_t *umq = (umq_t *)(uintptr_t)umqh; + if (umq == NULL || umq->umqh_tp == UMQ_INVALID_HANDLE || umq->tp_ops == NULL + || umq->tp_ops->umq_tp_cfg_get == NULL) { + UMQ_VLOG_ERR("parameter invalid\n"); + return -UMQ_ERR_EINVAL; + } + return umq->tp_ops->umq_tp_cfg_get(umqh, cfg); } \ No newline at end of file diff --git a/src/urpc/umq/umq_ub/core/private/umq_ub.c b/src/urpc/umq/umq_ub/core/private/umq_ub.c index 24778039db9b1fce9578b27694e7e4c02101186d..53318ca22aa13e85d7fd2203979a8848c24d0614 100644 --- a/src/urpc/umq/umq_ub/core/private/umq_ub.c +++ b/src/urpc/umq/umq_ub/core/private/umq_ub.c @@ -686,6 +686,7 @@ int check_and_set_param(umq_ub_ctx_t *dev_ctx, umq_create_option_t *option, ub_q queue->umq_trans_mode = option->trans_mode; queue->remote_rx_buf_size = dev_ctx->dev_attr.dev_cap.max_msg_size; queue->create_flag = option->create_flag; + queue->umq_ctx = option->umq_ctx; queue->share_rq_umqh = option->share_rq_umqh; return UMQ_SUCCESS; } diff --git a/src/urpc/umq/umq_ub/core/private/umq_ub_private.h b/src/urpc/umq/umq_ub/core/private/umq_ub_private.h index c4f757b4d544181d3f3044b6ed78992f70374c88..1bec06c27aa7e3dd518f390404cbde228a8a0cb5 100644 --- a/src/urpc/umq/umq_ub/core/private/umq_ub_private.h +++ b/src/urpc/umq/umq_ub/core/private/umq_ub_private.h @@ -228,6 +228,7 @@ typedef struct ub_queue { atomic_uint require_rx_count; volatile uint32_t tx_outstanding; uint32_t create_flag; + uint64_t umq_ctx; urma_target_seg_t **imported_tseg_list; // read-only uint64_t addr_list[UMQ_MAX_ID_NUM]; diff --git a/src/urpc/umq/umq_ub/core/umq_ub_impl.c b/src/urpc/umq/umq_ub/core/umq_ub_impl.c index 99377accdbdffb0ae2109588e674f51969107aae..74b4ea52cbb4b01370d2e1c75efb6a8e82d4fb71 100644 --- a/src/urpc/umq/umq_ub/core/umq_ub_impl.c +++ b/src/urpc/umq/umq_ub/core/umq_ub_impl.c @@ -1411,6 +1411,25 @@ int umq_ub_dev_info_get_impl(char *dev_name, umq_trans_mode_t umq_trans_mode, um umq_dev_info->umq_trans_mode = umq_trans_mode; memcpy(umq_dev_info->dev_name, dev_name, strnlen(dev_name, UMQ_DEV_NAME_SIZE)); urma_free_eid_list(eid_info_list); + return UMQ_SUCCESS; +} +int umq_ub_cfg_get_impl(uint64_t umqh_tp, umq_qcfg_get_t *cfg) +{ + if (cfg == NULL) { + UMQ_VLOG_ERR("umq cfg is invalid\n"); + return -UMQ_ERR_EINVAL; + } + ub_queue_t *queue = (ub_queue_t *)(uintptr_t)umqh_tp; + cfg->create_flag = queue->create_flag; + cfg->rx_buf_size = queue->rx_buf_size; + cfg->tx_buf_size = queue->tx_buf_size; + cfg->rx_depth = queue->rx_depth; + cfg->tx_depth = queue->tx_depth; + cfg->umq_ctx = queue->umq_ctx; + cfg->share_rq_umqh = queue->share_rq_umqh; + cfg->trans_mode = queue->umq_trans_mode; + cfg->mode = queue->mode; + cfg->state = queue->state; return UMQ_SUCCESS; } \ No newline at end of file diff --git a/src/urpc/umq/umq_ub/core/umq_ub_impl.h b/src/urpc/umq/umq_ub/core/umq_ub_impl.h index b56d3d237483271d37b3e7737348d2cec3c4e5dd..89c35226747782b6ae24e8f043001748095cd380 100644 --- a/src/urpc/umq/umq_ub/core/umq_ub_impl.h +++ b/src/urpc/umq/umq_ub/core/umq_ub_impl.h @@ -81,6 +81,7 @@ int umq_ub_user_ctl_impl(uint64_t umqh_tp, umq_user_ctl_in_t *in, umq_user_ctl_o int umq_ub_mempool_state_get_impl(uint64_t umqh_tp, uint32_t mempool_id, umq_mempool_state_t *mempool_state); int umq_ub_mempool_state_refresh_impl(uint64_t umqh_tp, uint32_t mempool_id); int umq_ub_dev_info_get_impl(char *umq_dev_name, umq_trans_mode_t umq_trans_mode, umq_dev_info_t *umq_dev_info); +int umq_ub_cfg_get_impl(uint64_t umqh_tp, umq_qcfg_get_t *cfg); #ifdef __cplusplus } diff --git a/src/urpc/umq/umq_ub/umq_ub_api.c b/src/urpc/umq/umq_ub/umq_ub_api.c index 227d6860bbb3a74b9fbe6934935c0a61560df9ad..c6270aab17615a583f94c20b7726bd0032a6f531 100644 --- a/src/urpc/umq/umq_ub/umq_ub_api.c +++ b/src/urpc/umq/umq_ub/umq_ub_api.c @@ -174,6 +174,11 @@ static int umq_tp_ub_dev_info_get(char *dev_name, umq_trans_mode_t umq_trans_mod return umq_ub_dev_info_get_impl(dev_name, umq_trans_mode, umq_dev_info); } +static int umq_tp_ub_cfg_get(uint64_t umqh_tp, umq_qcfg_get_t *cfg) +{ + return umq_ub_cfg_get_impl(umqh_tp, cfg); +} + static umq_ops_t g_umq_ub_ops = { .mode = UMQ_TRANS_MODE_UB, // control plane api @@ -194,6 +199,7 @@ static umq_ops_t g_umq_ub_ops = { .umq_tp_mempool_state_get = umq_tp_ub_mempool_state_get, .umq_tp_mempool_state_refresh = umq_tp_ub_mempool_state_refresh, .umq_tp_dev_info_get = umq_tp_ub_dev_info_get, + .umq_tp_cfg_get = umq_tp_ub_cfg_get, // datapath plane api .umq_tp_buf_alloc = umq_tp_ub_buf_alloc, diff --git a/src/urpc/umq/umq_ub/umq_ub_plus_api.c b/src/urpc/umq/umq_ub/umq_ub_plus_api.c index 45fb058b150838bfc955848acf4f626acb8f1085..af197040a167d04979e0c386e9f3753c9ff45ec8 100644 --- a/src/urpc/umq/umq_ub/umq_ub_plus_api.c +++ b/src/urpc/umq/umq_ub/umq_ub_plus_api.c @@ -188,6 +188,11 @@ static int umq_tp_ub_plus_dev_info_get(char *dev_name, umq_trans_mode_t umq_tran return umq_ub_dev_info_get_impl(dev_name, umq_trans_mode, umq_dev_info); } +static int umq_tp_ub_plus_cfg_get(uint64_t umqh_tp, umq_qcfg_get_t *cfg) +{ + return umq_ub_cfg_get_impl(umqh_tp, cfg); +} + static umq_ops_t g_umq_ub_plus_ops = { .mode = UMQ_TRANS_MODE_UB_PLUS, // control plane api @@ -208,6 +213,7 @@ static umq_ops_t g_umq_ub_plus_ops = { .umq_tp_mempool_state_get = umq_tp_ub_plus_mempool_state_get, .umq_tp_mempool_state_refresh = umq_tp_ub_plus_mempool_state_refresh, .umq_tp_dev_info_get = umq_tp_ub_plus_dev_info_get, + .umq_tp_cfg_get = umq_tp_ub_plus_cfg_get, // datapath plane api .umq_tp_buf_alloc = umq_tp_ub_plus_buf_alloc,