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