xref: /spdk/module/accel/mlx5/accel_mlx5_rpc.c (revision 008a6371b33caa8925d311634c641c918c8d8709)
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