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