xref: /dpdk/lib/mldev/rte_mldev_pmd.c (revision ea80eafbd4d821c13a8caa0ef06879c44a398d53)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2022 Marvell.
3  */
4 
5 #include <dev_driver.h>
6 #include <rte_eal.h>
7 #include <rte_malloc.h>
8 
9 #include "rte_mldev_pmd.h"
10 
11 struct rte_ml_dev *
rte_ml_dev_pmd_create(const char * name,struct rte_device * device,struct rte_ml_dev_pmd_init_params * params)12 rte_ml_dev_pmd_create(const char *name, struct rte_device *device,
13 		      struct rte_ml_dev_pmd_init_params *params)
14 {
15 	struct rte_ml_dev *dev;
16 
17 	RTE_MLDEV_LOG(INFO, "ML device initialisation - name: %s, socket_id: %u", name,
18 		      params->socket_id);
19 
20 	/* Allocate device structure */
21 	dev = rte_ml_dev_pmd_allocate(name, params->socket_id);
22 	if (dev == NULL) {
23 		RTE_MLDEV_LOG(ERR, "Failed to allocate ML device for %s", name);
24 		return NULL;
25 	}
26 
27 	/* Allocate private device structure */
28 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
29 		dev->data->dev_private =
30 			rte_zmalloc_socket("ml_dev_private", params->private_data_size,
31 					   RTE_CACHE_LINE_SIZE, params->socket_id);
32 
33 		if (dev->data->dev_private == NULL) {
34 			RTE_MLDEV_LOG(ERR, "Cannot allocate memory for mldev %s private data",
35 				      name);
36 			rte_ml_dev_pmd_release(dev);
37 			return NULL;
38 		}
39 	}
40 	dev->device = device;
41 
42 	return dev;
43 }
44 
45 int
rte_ml_dev_pmd_destroy(struct rte_ml_dev * dev)46 rte_ml_dev_pmd_destroy(struct rte_ml_dev *dev)
47 {
48 	int ret;
49 
50 	RTE_MLDEV_LOG(INFO, "Releasing ML device - name: %s", dev->device->name);
51 	ret = rte_ml_dev_pmd_release(dev);
52 	if (ret)
53 		return ret;
54 
55 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
56 		rte_free(dev->data->dev_private);
57 
58 	dev->data = NULL;
59 	dev->device = NULL;
60 
61 	return 0;
62 }
63