xref: /dpdk/drivers/net/nfp/nfp_service.c (revision b6de43530dfa30cbf6b70857e3835099701063d4)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2023 Corigine, Inc.
3  * All rights reserved.
4  */
5 
6 #include "nfp_service.h"
7 
8 #include <errno.h>
9 #include <rte_cycles.h>
10 
11 #include "nfp_logs.h"
12 
13 /* Disable service and try to get service status */
14 #define NFP_SERVICE_DISABLE_WAIT_COUNT 3000
15 
16 int
17 nfp_service_enable(const struct rte_service_spec *service_spec,
18 		struct nfp_service_info *info)
19 {
20 	int ret;
21 	int32_t lcore_count;
22 
23 	lcore_count = rte_service_lcore_count();
24 	if (lcore_count == 0)
25 		return -ENOTSUP;
26 
27 	/* Register the service */
28 	ret = rte_service_component_register(service_spec, &info->id);
29 	if (ret != 0) {
30 		PMD_DRV_LOG(DEBUG, "Could not register %s.", service_spec->name);
31 		return -EINVAL;
32 	}
33 
34 	/* Set the NFP service runstate of a component. */
35 	rte_service_component_runstate_set(info->id, 1);
36 
37 	PMD_DRV_LOG(DEBUG, "Enable service %s successfully.", service_spec->name);
38 
39 	return 0;
40 }
41 
42 int
43 nfp_service_disable(struct nfp_service_info *info)
44 {
45 	uint32_t i;
46 	const char *service_name;
47 
48 	service_name = rte_service_get_name(info->id);
49 	if (service_name == NULL) {
50 		PMD_DRV_LOG(ERR, "Could not find service %u.", info->id);
51 		return -EINVAL;
52 	}
53 
54 	rte_service_component_runstate_set(info->id, 0);
55 
56 	for (i = 0; i < NFP_SERVICE_DISABLE_WAIT_COUNT; i++) {
57 		if (rte_service_may_be_active(info->id) == 0)
58 			break;
59 		rte_delay_ms(1);
60 	}
61 
62 	if (i == NFP_SERVICE_DISABLE_WAIT_COUNT)
63 		PMD_DRV_LOG(ERR, "Could not stop service %s.", service_name);
64 
65 	rte_service_component_unregister(info->id);
66 
67 	return 0;
68 }
69