event/cnxk: add platform specific device probe
[dpdk.git] / drivers / event / cnxk / cnxk_eventdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "cnxk_eventdev.h"
6
7 void
8 cnxk_sso_info_get(struct cnxk_sso_evdev *dev,
9                   struct rte_event_dev_info *dev_info)
10 {
11
12         dev_info->min_dequeue_timeout_ns = dev->min_dequeue_timeout_ns;
13         dev_info->max_dequeue_timeout_ns = dev->max_dequeue_timeout_ns;
14         dev_info->max_event_queues = dev->max_event_queues;
15         dev_info->max_event_queue_flows = (1ULL << 20);
16         dev_info->max_event_queue_priority_levels = 8;
17         dev_info->max_event_priority_levels = 1;
18         dev_info->max_event_ports = dev->max_event_ports;
19         dev_info->max_event_port_dequeue_depth = 1;
20         dev_info->max_event_port_enqueue_depth = 1;
21         dev_info->max_num_events = dev->max_num_events;
22         dev_info->event_dev_cap = RTE_EVENT_DEV_CAP_QUEUE_QOS |
23                                   RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED |
24                                   RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES |
25                                   RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK |
26                                   RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT |
27                                   RTE_EVENT_DEV_CAP_NONSEQ_MODE |
28                                   RTE_EVENT_DEV_CAP_CARRY_FLOW_ID;
29 }
30
31 int
32 cnxk_sso_init(struct rte_eventdev *event_dev)
33 {
34         const struct rte_memzone *mz = NULL;
35         struct rte_pci_device *pci_dev;
36         struct cnxk_sso_evdev *dev;
37         int rc;
38
39         mz = rte_memzone_reserve(CNXK_SSO_MZ_NAME, sizeof(uint64_t),
40                                  SOCKET_ID_ANY, 0);
41         if (mz == NULL) {
42                 plt_err("Failed to create eventdev memzone");
43                 return -ENOMEM;
44         }
45
46         dev = cnxk_sso_pmd_priv(event_dev);
47         pci_dev = container_of(event_dev->dev, struct rte_pci_device, device);
48         dev->sso.pci_dev = pci_dev;
49
50         *(uint64_t *)mz->addr = (uint64_t)dev;
51
52         /* Initialize the base cnxk_dev object */
53         rc = roc_sso_dev_init(&dev->sso);
54         if (rc < 0) {
55                 plt_err("Failed to initialize RoC SSO rc=%d", rc);
56                 goto error;
57         }
58
59         dev->is_timeout_deq = 0;
60         dev->min_dequeue_timeout_ns = USEC2NSEC(1);
61         dev->max_dequeue_timeout_ns = USEC2NSEC(0x3FF);
62         dev->max_num_events = -1;
63         dev->nb_event_queues = 0;
64         dev->nb_event_ports = 0;
65
66         return 0;
67
68 error:
69         rte_memzone_free(mz);
70         return rc;
71 }
72
73 int
74 cnxk_sso_fini(struct rte_eventdev *event_dev)
75 {
76         struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
77
78         /* For secondary processes, nothing to be done */
79         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
80                 return 0;
81
82         roc_sso_rsrc_fini(&dev->sso);
83         roc_sso_dev_fini(&dev->sso);
84
85         return 0;
86 }
87
88 int
89 cnxk_sso_remove(struct rte_pci_device *pci_dev)
90 {
91         return rte_event_pmd_pci_remove(pci_dev, cnxk_sso_fini);
92 }