1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2021 HiSilicon Limited
3 * Copyright(c) 2021 Intel Corporation
11 #include <rte_malloc.h>
12 #include <rte_memzone.h>
13 #include <rte_string_fns.h>
15 #include "rte_dmadev.h"
16 #include "rte_dmadev_pmd.h"
18 static int16_t dma_devices_max;
20 struct rte_dma_dev *rte_dma_devices;
22 RTE_LOG_REGISTER_DEFAULT(rte_dma_logtype, INFO);
23 #define RTE_DMA_LOG(level, ...) \
24 rte_log(RTE_LOG_ ## level, rte_dma_logtype, RTE_FMT("dma: " \
25 RTE_FMT_HEAD(__VA_ARGS__,) "\n", RTE_FMT_TAIL(__VA_ARGS__,)))
28 rte_dma_dev_max(size_t dev_max)
30 /* This function may be called before rte_eal_init(), so no rte library
31 * function can be called in this function.
33 if (dev_max == 0 || dev_max > INT16_MAX)
36 if (dma_devices_max > 0)
39 dma_devices_max = dev_max;
45 dma_check_name(const char *name)
50 RTE_DMA_LOG(ERR, "Name can't be NULL");
54 name_len = strnlen(name, RTE_DEV_NAME_MAX_LEN);
56 RTE_DMA_LOG(ERR, "Zero length DMA device name");
59 if (name_len >= RTE_DEV_NAME_MAX_LEN) {
60 RTE_DMA_LOG(ERR, "DMA device name is too long");
68 dma_find_free_id(void)
72 if (rte_dma_devices == NULL)
75 for (i = 0; i < dma_devices_max; i++) {
76 if (rte_dma_devices[i].state == RTE_DMA_DEV_UNUSED)
83 static struct rte_dma_dev*
84 dma_find_by_name(const char *name)
88 if (rte_dma_devices == NULL)
91 for (i = 0; i < dma_devices_max; i++) {
92 if ((rte_dma_devices[i].state != RTE_DMA_DEV_UNUSED) &&
93 (!strcmp(name, rte_dma_devices[i].dev_name)))
94 return &rte_dma_devices[i];
101 dma_dev_data_prepare(void)
105 if (rte_dma_devices != NULL)
108 size = dma_devices_max * sizeof(struct rte_dma_dev);
109 rte_dma_devices = malloc(size);
110 if (rte_dma_devices == NULL)
112 memset(rte_dma_devices, 0, size);
118 dma_data_prepare(void)
120 if (dma_devices_max == 0)
121 dma_devices_max = RTE_DMADEV_DEFAULT_MAX;
122 return dma_dev_data_prepare();
125 static struct rte_dma_dev *
126 dma_allocate(const char *name, int numa_node, size_t private_data_size)
128 struct rte_dma_dev *dev;
133 ret = dma_data_prepare();
135 RTE_DMA_LOG(ERR, "Cannot initialize dmadevs data");
139 dev = dma_find_by_name(name);
141 RTE_DMA_LOG(ERR, "DMA device already allocated");
145 dev_private = rte_zmalloc_socket(name, private_data_size,
146 RTE_CACHE_LINE_SIZE, numa_node);
147 if (dev_private == NULL) {
148 RTE_DMA_LOG(ERR, "Cannot allocate private data");
152 dev_id = dma_find_free_id();
154 RTE_DMA_LOG(ERR, "Reached maximum number of DMA devices");
155 rte_free(dev_private);
159 dev = &rte_dma_devices[dev_id];
160 rte_strscpy(dev->dev_name, name, sizeof(dev->dev_name));
161 dev->dev_id = dev_id;
162 dev->numa_node = numa_node;
163 dev->dev_private = dev_private;
169 dma_release(struct rte_dma_dev *dev)
171 rte_free(dev->dev_private);
172 memset(dev, 0, sizeof(struct rte_dma_dev));
176 rte_dma_pmd_allocate(const char *name, int numa_node, size_t private_data_size)
178 struct rte_dma_dev *dev;
180 if (dma_check_name(name) != 0 || private_data_size == 0)
183 dev = dma_allocate(name, numa_node, private_data_size);
187 dev->state = RTE_DMA_DEV_REGISTERED;
193 rte_dma_pmd_release(const char *name)
195 struct rte_dma_dev *dev;
197 if (dma_check_name(name) != 0)
200 dev = dma_find_by_name(name);
209 rte_dma_get_dev_id_by_name(const char *name)
211 struct rte_dma_dev *dev;
213 if (dma_check_name(name) != 0)
216 dev = dma_find_by_name(name);
224 rte_dma_is_valid(int16_t dev_id)
226 return (dev_id >= 0) && (dev_id < dma_devices_max) &&
227 rte_dma_devices != NULL &&
228 rte_dma_devices[dev_id].state != RTE_DMA_DEV_UNUSED;
232 rte_dma_count_avail(void)
237 if (rte_dma_devices == NULL)
240 for (i = 0; i < dma_devices_max; i++) {
241 if (rte_dma_devices[i].state != RTE_DMA_DEV_UNUSED)