event/dlb: add flexible interface
[dpdk.git] / drivers / event / dlb / pf / dlb_pf.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2020 Intel Corporation
3  */
4
5 #include <stdint.h>
6 #include <stdbool.h>
7 #include <stdio.h>
8 #include <sys/mman.h>
9 #include <sys/fcntl.h>
10 #include <sys/time.h>
11 #include <errno.h>
12 #include <assert.h>
13 #include <unistd.h>
14 #include <string.h>
15 #include <rte_debug.h>
16 #include <rte_log.h>
17 #include <rte_dev.h>
18 #include <rte_devargs.h>
19 #include <rte_mbuf.h>
20 #include <rte_ring.h>
21 #include <rte_errno.h>
22 #include <rte_kvargs.h>
23 #include <rte_malloc.h>
24 #include <rte_cycles.h>
25 #include <rte_io.h>
26 #include <rte_memory.h>
27 #include <rte_string_fns.h>
28
29 #include "../dlb_priv.h"
30 #include "../dlb_iface.h"
31 #include "../dlb_inline_fns.h"
32 #include "dlb_main.h"
33 #include "base/dlb_hw_types.h"
34 #include "base/dlb_osdep.h"
35 #include "base/dlb_resource.h"
36
37 static void
38 dlb_pf_iface_fn_ptrs_init(void)
39 {
40
41 }
42
43 /* PCI DEV HOOKS */
44 static int
45 dlb_eventdev_pci_init(struct rte_eventdev *eventdev)
46 {
47         int ret = 0;
48         struct rte_pci_device *pci_dev;
49         struct dlb_devargs dlb_args = {
50                 .socket_id = rte_socket_id(),
51                 .max_num_events = DLB_MAX_NUM_LDB_CREDITS,
52                 .num_dir_credits_override = -1,
53                 .defer_sched = 0,
54                 .num_atm_inflights = DLB_NUM_ATOMIC_INFLIGHTS_PER_QUEUE,
55         };
56         struct dlb_eventdev *dlb;
57
58         DLB_LOG_DBG("Enter with dev_id=%d socket_id=%d",
59                     eventdev->data->dev_id, eventdev->data->socket_id);
60
61         dlb_entry_points_init(eventdev);
62
63         dlb_pf_iface_fn_ptrs_init();
64
65         pci_dev = RTE_DEV_TO_PCI(eventdev->dev);
66
67         if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
68                 dlb = dlb_pmd_priv(eventdev); /* rte_zmalloc_socket mem */
69
70                 /* Probe the DLB PF layer */
71                 dlb->qm_instance.pf_dev = dlb_probe(pci_dev);
72
73                 if (dlb->qm_instance.pf_dev == NULL) {
74                         DLB_LOG_ERR("DLB PF Probe failed with error %d\n",
75                                     rte_errno);
76                         ret = -rte_errno;
77                         goto dlb_probe_failed;
78                 }
79
80                 /* Were we invoked with runtime parameters? */
81                 if (pci_dev->device.devargs) {
82                         ret = dlb_parse_params(pci_dev->device.devargs->args,
83                                                pci_dev->device.devargs->name,
84                                                &dlb_args);
85                         if (ret) {
86                                 DLB_LOG_ERR("PFPMD failed to parse args ret=%d, errno=%d\n",
87                                             ret, rte_errno);
88                                 goto dlb_probe_failed;
89                         }
90                 }
91
92                 ret = dlb_primary_eventdev_probe(eventdev,
93                                                  EVDEV_DLB_NAME_PMD_STR,
94                                                  &dlb_args);
95         } else {
96                 ret = dlb_secondary_eventdev_probe(eventdev,
97                                                    EVDEV_DLB_NAME_PMD_STR);
98         }
99         if (ret)
100                 goto dlb_probe_failed;
101
102         DLB_LOG_INFO("DLB PF Probe success\n");
103
104         return 0;
105
106 dlb_probe_failed:
107
108         DLB_LOG_INFO("DLB PF Probe failed, ret=%d\n", ret);
109
110         return ret;
111 }
112
113 #define EVENTDEV_INTEL_VENDOR_ID 0x8086
114
115 static const struct rte_pci_id pci_id_dlb_map[] = {
116         {
117                 RTE_PCI_DEVICE(EVENTDEV_INTEL_VENDOR_ID,
118                                DLB_PF_DEV_ID)
119         },
120         {
121                 .vendor_id = 0,
122         },
123 };
124
125 static int
126 event_dlb_pci_probe(struct rte_pci_driver *pci_drv,
127                     struct rte_pci_device *pci_dev)
128 {
129         return rte_event_pmd_pci_probe_named(pci_drv, pci_dev,
130                 sizeof(struct dlb_eventdev), dlb_eventdev_pci_init,
131                 EVDEV_DLB_NAME_PMD_STR);
132 }
133
134 static int
135 event_dlb_pci_remove(struct rte_pci_device *pci_dev)
136 {
137         return rte_event_pmd_pci_remove(pci_dev, NULL);
138 }
139
140 static struct rte_pci_driver pci_eventdev_dlb_pmd = {
141         .id_table = pci_id_dlb_map,
142         .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
143         .probe = event_dlb_pci_probe,
144         .remove = event_dlb_pci_remove,
145 };
146
147 RTE_PMD_REGISTER_PCI(event_dlb_pf, pci_eventdev_dlb_pmd);
148 RTE_PMD_REGISTER_PCI_TABLE(event_dlb_pf, pci_id_dlb_map);