1a1dfa7ecSAlexey Marchuk /* SPDX-License-Identifier: BSD-3-Clause 23f657ddbSAlexey Marchuk * Copyright (c) 2022-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3a1dfa7ecSAlexey Marchuk */ 4a1dfa7ecSAlexey Marchuk 5a1dfa7ecSAlexey Marchuk #include "spdk/rpc.h" 6a1dfa7ecSAlexey Marchuk #include "spdk/util.h" 7a1dfa7ecSAlexey Marchuk #include "spdk/log.h" 8a1dfa7ecSAlexey Marchuk 9a1dfa7ecSAlexey Marchuk #include "accel_mlx5.h" 10a1dfa7ecSAlexey Marchuk 11a1dfa7ecSAlexey Marchuk static const struct spdk_json_object_decoder rpc_mlx5_module_decoder[] = { 12a1dfa7ecSAlexey Marchuk {"qp_size", offsetof(struct accel_mlx5_attr, qp_size), spdk_json_decode_uint16, true}, 13a1dfa7ecSAlexey Marchuk {"num_requests", offsetof(struct accel_mlx5_attr, num_requests), spdk_json_decode_uint32, true}, 143f657ddbSAlexey Marchuk {"allowed_devs", offsetof(struct accel_mlx5_attr, allowed_devs), spdk_json_decode_string, true}, 15e892af6bSAlexey Marchuk {"crypto_split_blocks", offsetof(struct accel_mlx5_attr, crypto_split_blocks), spdk_json_decode_uint16, true}, 16*008a6371SAlexey Marchuk {"enable_driver", offsetof(struct accel_mlx5_attr, enable_driver), spdk_json_decode_bool, true}, 17a1dfa7ecSAlexey Marchuk }; 18a1dfa7ecSAlexey Marchuk 19a1dfa7ecSAlexey Marchuk static void 20a1dfa7ecSAlexey Marchuk rpc_mlx5_scan_accel_module(struct spdk_jsonrpc_request *request, 21a1dfa7ecSAlexey Marchuk const struct spdk_json_val *params) 22a1dfa7ecSAlexey Marchuk { 236438af6bSAlexey Marchuk struct accel_mlx5_attr attr = {}; 24a1dfa7ecSAlexey Marchuk int rc; 25a1dfa7ecSAlexey Marchuk 26a1dfa7ecSAlexey Marchuk accel_mlx5_get_default_attr(&attr); 27a1dfa7ecSAlexey Marchuk 28a1dfa7ecSAlexey Marchuk if (params != NULL) { 29a1dfa7ecSAlexey Marchuk if (spdk_json_decode_object(params, rpc_mlx5_module_decoder, 30a1dfa7ecSAlexey Marchuk SPDK_COUNTOF(rpc_mlx5_module_decoder), 31a1dfa7ecSAlexey Marchuk &attr)) { 32a1dfa7ecSAlexey Marchuk SPDK_ERRLOG("spdk_json_decode_object() failed\n"); 336438af6bSAlexey Marchuk free(attr.allowed_devs); 34a1dfa7ecSAlexey Marchuk spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 35a1dfa7ecSAlexey Marchuk "spdk_json_decode_object failed"); 36a1dfa7ecSAlexey Marchuk return; 37a1dfa7ecSAlexey Marchuk } 38a1dfa7ecSAlexey Marchuk } 39a1dfa7ecSAlexey Marchuk 40a1dfa7ecSAlexey Marchuk rc = accel_mlx5_enable(&attr); 41a1dfa7ecSAlexey Marchuk if (rc) { 42bc3ab3d3SPierre Lestringant spdk_jsonrpc_send_error_response_fmt(request, rc, "mlx5 scan failed with %d", rc); 43a1dfa7ecSAlexey Marchuk } else { 44a1dfa7ecSAlexey Marchuk spdk_jsonrpc_send_bool_response(request, true); 45a1dfa7ecSAlexey Marchuk } 466438af6bSAlexey Marchuk free(attr.allowed_devs); 47a1dfa7ecSAlexey Marchuk } 48a1dfa7ecSAlexey Marchuk SPDK_RPC_REGISTER("mlx5_scan_accel_module", rpc_mlx5_scan_accel_module, SPDK_RPC_STARTUP) 49fe7bb7bdSAlexey Marchuk 50fe7bb7bdSAlexey Marchuk static int 51fe7bb7bdSAlexey Marchuk rpc_decode_dump_stat_level(const struct spdk_json_val *val, void *out) 52fe7bb7bdSAlexey Marchuk { 53fe7bb7bdSAlexey Marchuk enum accel_mlx5_dump_state_level *level = out; 54fe7bb7bdSAlexey Marchuk 55fe7bb7bdSAlexey Marchuk if (spdk_json_strequal(val, "total") == true) { 56fe7bb7bdSAlexey Marchuk *level = ACCEL_MLX5_DUMP_STAT_LEVEL_TOTAL; 57fe7bb7bdSAlexey Marchuk } else if (spdk_json_strequal(val, "channel") == true) { 58fe7bb7bdSAlexey Marchuk *level = ACCEL_MLX5_DUMP_STAT_LEVEL_CHANNEL; 59fe7bb7bdSAlexey Marchuk } else if (spdk_json_strequal(val, "device") == true) { 60fe7bb7bdSAlexey Marchuk *level = ACCEL_MLX5_DUMP_STAT_LEVEL_DEV; 61fe7bb7bdSAlexey Marchuk } else { 62fe7bb7bdSAlexey Marchuk SPDK_NOTICELOG("Invalid parameter value: level\n"); 63fe7bb7bdSAlexey Marchuk return -EINVAL; 64fe7bb7bdSAlexey Marchuk } 65fe7bb7bdSAlexey Marchuk 66fe7bb7bdSAlexey Marchuk return 0; 67fe7bb7bdSAlexey Marchuk } 68fe7bb7bdSAlexey Marchuk 69fe7bb7bdSAlexey Marchuk struct accel_mlx5_rpc_dump_stats_ctx { 70fe7bb7bdSAlexey Marchuk struct spdk_jsonrpc_request *request; 71fe7bb7bdSAlexey Marchuk struct spdk_json_write_ctx *w; 72fe7bb7bdSAlexey Marchuk }; 73fe7bb7bdSAlexey Marchuk 74fe7bb7bdSAlexey Marchuk static void 75fe7bb7bdSAlexey Marchuk accel_mlx5_dump_stats_done(void *_ctx, int rc) 76fe7bb7bdSAlexey Marchuk { 77fe7bb7bdSAlexey Marchuk struct accel_mlx5_rpc_dump_stats_ctx *ctx = _ctx; 78fe7bb7bdSAlexey Marchuk if (rc) { 79fe7bb7bdSAlexey Marchuk spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 80fe7bb7bdSAlexey Marchuk "Failed to dump stats"); 81fe7bb7bdSAlexey Marchuk } else { 82fe7bb7bdSAlexey Marchuk spdk_jsonrpc_end_result(ctx->request, ctx->w); 83fe7bb7bdSAlexey Marchuk } 84fe7bb7bdSAlexey Marchuk free(ctx); 85fe7bb7bdSAlexey Marchuk } 86fe7bb7bdSAlexey Marchuk 87fe7bb7bdSAlexey Marchuk static const struct spdk_json_object_decoder rpc_accel_mlx5_dump_stats_decoder[] = { 88fe7bb7bdSAlexey Marchuk {"level", 0, rpc_decode_dump_stat_level, true}, 89fe7bb7bdSAlexey Marchuk }; 90fe7bb7bdSAlexey Marchuk 91fe7bb7bdSAlexey Marchuk static void 92fe7bb7bdSAlexey Marchuk rpc_accel_mlx5_dump_stats(struct spdk_jsonrpc_request *request, 93fe7bb7bdSAlexey Marchuk const struct spdk_json_val *params) 94fe7bb7bdSAlexey Marchuk { 95fe7bb7bdSAlexey Marchuk struct accel_mlx5_rpc_dump_stats_ctx *ctx; 96fe7bb7bdSAlexey Marchuk enum accel_mlx5_dump_state_level level = ACCEL_MLX5_DUMP_STAT_LEVEL_CHANNEL; 97fe7bb7bdSAlexey Marchuk int rc; 98fe7bb7bdSAlexey Marchuk 99fe7bb7bdSAlexey Marchuk if (params != NULL) { 100fe7bb7bdSAlexey Marchuk if (spdk_json_decode_object(params, rpc_accel_mlx5_dump_stats_decoder, 101fe7bb7bdSAlexey Marchuk SPDK_COUNTOF(rpc_accel_mlx5_dump_stats_decoder), 102fe7bb7bdSAlexey Marchuk &level)) { 103fe7bb7bdSAlexey Marchuk SPDK_ERRLOG("spdk_json_decode_object() failed\n"); 104fe7bb7bdSAlexey Marchuk spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 105fe7bb7bdSAlexey Marchuk "spdk_json_decode_object failed"); 106fe7bb7bdSAlexey Marchuk return; 107fe7bb7bdSAlexey Marchuk } 108fe7bb7bdSAlexey Marchuk } 109fe7bb7bdSAlexey Marchuk 110fe7bb7bdSAlexey Marchuk ctx = calloc(1, sizeof(*ctx)); 111fe7bb7bdSAlexey Marchuk if (!ctx) { 112fe7bb7bdSAlexey Marchuk spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 113fe7bb7bdSAlexey Marchuk "memory allocation failed"); 114fe7bb7bdSAlexey Marchuk return; 115fe7bb7bdSAlexey Marchuk } 116fe7bb7bdSAlexey Marchuk ctx->request = request; 117fe7bb7bdSAlexey Marchuk ctx->w = spdk_jsonrpc_begin_result(ctx->request); 118fe7bb7bdSAlexey Marchuk rc = accel_mlx5_dump_stats(ctx->w, level, accel_mlx5_dump_stats_done, ctx); 119fe7bb7bdSAlexey Marchuk if (rc) { 120fe7bb7bdSAlexey Marchuk spdk_json_write_null(ctx->w); 121fe7bb7bdSAlexey Marchuk spdk_jsonrpc_end_result(ctx->request, ctx->w); 122fe7bb7bdSAlexey Marchuk free(ctx); 123fe7bb7bdSAlexey Marchuk } 124fe7bb7bdSAlexey Marchuk } 125fe7bb7bdSAlexey Marchuk SPDK_RPC_REGISTER("accel_mlx5_dump_stats", rpc_accel_mlx5_dump_stats, SPDK_RPC_RUNTIME) 126