1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017-2018 Intel Corporation 3 */ 4 5 #include <rte_malloc.h> 6 #include <rte_kvargs.h> 7 #include <rte_eal.h> 8 9 #include "rte_compressdev_internal.h" 10 #include "rte_compressdev_pmd.h" 11 12 int compressdev_logtype; 13 14 /** 15 * Parse name from argument 16 */ 17 static int 18 rte_compressdev_pmd_parse_name_arg(const char *key __rte_unused, 19 const char *value, void *extra_args) 20 { 21 struct rte_compressdev_pmd_init_params *params = extra_args; 22 int n; 23 24 n = snprintf(params->name, RTE_COMPRESSDEV_NAME_MAX_LEN, "%s", value); 25 if (n >= RTE_COMPRESSDEV_NAME_MAX_LEN) 26 return -EINVAL; 27 28 return 0; 29 } 30 31 /** 32 * Parse unsigned integer from argument 33 */ 34 static int 35 rte_compressdev_pmd_parse_uint_arg(const char *key __rte_unused, 36 const char *value, void *extra_args) 37 { 38 int i; 39 char *end; 40 41 errno = 0; 42 i = strtol(value, &end, 10); 43 if (*end != 0 || errno != 0 || i < 0) 44 return -EINVAL; 45 46 *((uint32_t *)extra_args) = i; 47 return 0; 48 } 49 50 int __rte_experimental 51 rte_compressdev_pmd_parse_input_args( 52 struct rte_compressdev_pmd_init_params *params, 53 const char *args) 54 { 55 struct rte_kvargs *kvlist = NULL; 56 int ret = 0; 57 58 if (params == NULL) 59 return -EINVAL; 60 61 if (args) { 62 kvlist = rte_kvargs_parse(args, compressdev_pmd_valid_params); 63 if (kvlist == NULL) 64 return -EINVAL; 65 66 ret = rte_kvargs_process(kvlist, 67 RTE_COMPRESSDEV_PMD_SOCKET_ID_ARG, 68 &rte_compressdev_pmd_parse_uint_arg, 69 ¶ms->socket_id); 70 if (ret < 0) 71 goto free_kvlist; 72 73 ret = rte_kvargs_process(kvlist, 74 RTE_COMPRESSDEV_PMD_NAME_ARG, 75 &rte_compressdev_pmd_parse_name_arg, 76 params); 77 if (ret < 0) 78 goto free_kvlist; 79 } 80 81 free_kvlist: 82 rte_kvargs_free(kvlist); 83 return ret; 84 } 85 86 struct rte_compressdev * __rte_experimental 87 rte_compressdev_pmd_create(const char *name, 88 struct rte_device *device, 89 size_t private_data_size, 90 struct rte_compressdev_pmd_init_params *params) 91 { 92 struct rte_compressdev *compressdev; 93 94 if (params->name[0] != '\0') { 95 COMPRESSDEV_LOG(INFO, "User specified device name = %s\n", 96 params->name); 97 name = params->name; 98 } 99 100 COMPRESSDEV_LOG(INFO, "Creating compressdev %s\n", name); 101 102 COMPRESSDEV_LOG(INFO, "Init parameters - name: %s, socket id: %d", 103 name, params->socket_id); 104 105 /* allocate device structure */ 106 compressdev = rte_compressdev_pmd_allocate(name, params->socket_id); 107 if (compressdev == NULL) { 108 COMPRESSDEV_LOG(ERR, "Failed to allocate comp device %s", name); 109 return NULL; 110 } 111 112 /* allocate private device structure */ 113 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 114 compressdev->data->dev_private = 115 rte_zmalloc_socket("compressdev device private", 116 private_data_size, 117 RTE_CACHE_LINE_SIZE, 118 params->socket_id); 119 120 if (compressdev->data->dev_private == NULL) { 121 COMPRESSDEV_LOG(ERR, 122 "Cannot allocate memory for compressdev" 123 " %s private data", name); 124 125 rte_compressdev_pmd_release_device(compressdev); 126 return NULL; 127 } 128 } 129 130 compressdev->device = device; 131 132 return compressdev; 133 } 134 135 int __rte_experimental 136 rte_compressdev_pmd_destroy(struct rte_compressdev *compressdev) 137 { 138 int retval; 139 140 COMPRESSDEV_LOG(INFO, "Closing comp device %s", 141 compressdev->device->name); 142 143 /* free comp device */ 144 retval = rte_compressdev_pmd_release_device(compressdev); 145 if (retval) 146 return retval; 147 148 if (rte_eal_process_type() == RTE_PROC_PRIMARY) 149 rte_free(compressdev->data->dev_private); 150 151 compressdev->device = NULL; 152 compressdev->data = NULL; 153 154 return 0; 155 } 156