xref: /dpdk/drivers/net/nfp/nfp_service.c (revision b6de43530dfa30cbf6b70857e3835099701063d4)
1600f6d2cSLong Wu /* SPDX-License-Identifier: BSD-3-Clause
2600f6d2cSLong Wu  * Copyright (c) 2023 Corigine, Inc.
3600f6d2cSLong Wu  * All rights reserved.
4600f6d2cSLong Wu  */
5600f6d2cSLong Wu 
6600f6d2cSLong Wu #include "nfp_service.h"
7600f6d2cSLong Wu 
80e7ee91bSLong Wu #include <errno.h>
90e7ee91bSLong Wu #include <rte_cycles.h>
100e7ee91bSLong Wu 
11600f6d2cSLong Wu #include "nfp_logs.h"
12600f6d2cSLong Wu 
13600f6d2cSLong Wu /* Disable service and try to get service status */
14600f6d2cSLong Wu #define NFP_SERVICE_DISABLE_WAIT_COUNT 3000
15600f6d2cSLong Wu 
16600f6d2cSLong Wu int
17600f6d2cSLong Wu nfp_service_enable(const struct rte_service_spec *service_spec,
18600f6d2cSLong Wu 		struct nfp_service_info *info)
19600f6d2cSLong Wu {
20600f6d2cSLong Wu 	int ret;
210e7ee91bSLong Wu 	int32_t lcore_count;
220e7ee91bSLong Wu 
230e7ee91bSLong Wu 	lcore_count = rte_service_lcore_count();
240e7ee91bSLong Wu 	if (lcore_count == 0)
250e7ee91bSLong Wu 		return -ENOTSUP;
26600f6d2cSLong Wu 
27600f6d2cSLong Wu 	/* Register the service */
28600f6d2cSLong Wu 	ret = rte_service_component_register(service_spec, &info->id);
29600f6d2cSLong Wu 	if (ret != 0) {
30*b6de4353SZerun Fu 		PMD_DRV_LOG(DEBUG, "Could not register %s.", service_spec->name);
31600f6d2cSLong Wu 		return -EINVAL;
32600f6d2cSLong Wu 	}
33600f6d2cSLong Wu 
340e7ee91bSLong Wu 	/* Set the NFP service runstate of a component. */
350e7ee91bSLong Wu 	rte_service_component_runstate_set(info->id, 1);
36600f6d2cSLong Wu 
37*b6de4353SZerun Fu 	PMD_DRV_LOG(DEBUG, "Enable service %s successfully.", service_spec->name);
38600f6d2cSLong Wu 
39600f6d2cSLong Wu 	return 0;
40600f6d2cSLong Wu }
41600f6d2cSLong Wu 
42600f6d2cSLong Wu int
43600f6d2cSLong Wu nfp_service_disable(struct nfp_service_info *info)
44600f6d2cSLong Wu {
45600f6d2cSLong Wu 	uint32_t i;
46600f6d2cSLong Wu 	const char *service_name;
47600f6d2cSLong Wu 
48600f6d2cSLong Wu 	service_name = rte_service_get_name(info->id);
49600f6d2cSLong Wu 	if (service_name == NULL) {
50*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "Could not find service %u.", info->id);
51600f6d2cSLong Wu 		return -EINVAL;
52600f6d2cSLong Wu 	}
53600f6d2cSLong Wu 
54600f6d2cSLong Wu 	rte_service_component_runstate_set(info->id, 0);
55600f6d2cSLong Wu 
56600f6d2cSLong Wu 	for (i = 0; i < NFP_SERVICE_DISABLE_WAIT_COUNT; i++) {
57600f6d2cSLong Wu 		if (rte_service_may_be_active(info->id) == 0)
58600f6d2cSLong Wu 			break;
59600f6d2cSLong Wu 		rte_delay_ms(1);
60600f6d2cSLong Wu 	}
61b043bbb9SChaoyong He 
62600f6d2cSLong Wu 	if (i == NFP_SERVICE_DISABLE_WAIT_COUNT)
63*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "Could not stop service %s.", service_name);
64600f6d2cSLong Wu 
65600f6d2cSLong Wu 	rte_service_component_unregister(info->id);
66600f6d2cSLong Wu 
67600f6d2cSLong Wu 	return 0;
68600f6d2cSLong Wu }
69