ae4d785050e400dae212d19a381a7e0e2a92ddab
[dpdk.git] / drivers / event / dlb2 / pf / dlb2_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_pci.h>
27 #include <rte_bus_pci.h>
28 #include <rte_eventdev.h>
29 #include <rte_eventdev_pmd.h>
30 #include <rte_eventdev_pmd_pci.h>
31 #include <rte_memory.h>
32 #include <rte_string_fns.h>
33
34 #include "../dlb2_priv.h"
35 #include "../dlb2_inline_fns.h"
36 #include "dlb2_main.h"
37 #include "base/dlb2_hw_types.h"
38 #include "base/dlb2_osdep.h"
39 #include "base/dlb2_resource.h"
40
41 static const char *event_dlb2_pf_name = RTE_STR(EVDEV_DLB2_NAME_PMD);
42
43 /* Stubs: Allow building partial probe patch */
44 int dlb2_hw_get_num_resources(struct dlb2_hw *hw,
45                               struct dlb2_get_num_resources_args *arg,
46                               bool vdev_req,
47                               unsigned int vdev_id)
48 {
49         RTE_SET_USED(hw);
50         RTE_SET_USED(arg);
51         RTE_SET_USED(vdev_req);
52         RTE_SET_USED(vdev_id);
53
54         return 0;
55 }
56
57 void dlb2_hw_enable_sparse_ldb_cq_mode(struct dlb2_hw *hw)
58 {
59         RTE_SET_USED(hw);
60 }
61
62 void dlb2_hw_enable_sparse_dir_cq_mode(struct dlb2_hw *hw)
63 {
64         RTE_SET_USED(hw);
65 }
66 /* End stubs */
67
68 static void
69 dlb2_pf_iface_fn_ptrs_init(void)
70 {
71 /* flexible iface fn ptr assignments will go here */
72 }
73
74 /* PCI DEV HOOKS */
75 static int
76 dlb2_eventdev_pci_init(struct rte_eventdev *eventdev)
77 {
78         int ret = 0;
79         struct rte_pci_device *pci_dev;
80         struct dlb2_devargs dlb2_args = {
81                 .socket_id = rte_socket_id(),
82                 .max_num_events = DLB2_MAX_NUM_LDB_CREDITS,
83                 .num_dir_credits_override = -1,
84                 .qid_depth_thresholds = { {0} },
85                 .cos_id = DLB2_COS_DEFAULT
86         };
87         struct dlb2_eventdev *dlb2;
88
89         DLB2_LOG_DBG("Enter with dev_id=%d socket_id=%d",
90                      eventdev->data->dev_id, eventdev->data->socket_id);
91
92         dlb2_pf_iface_fn_ptrs_init();
93
94         pci_dev = RTE_DEV_TO_PCI(eventdev->dev);
95
96         if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
97                 dlb2 = dlb2_pmd_priv(eventdev); /* rte_zmalloc_socket mem */
98
99                 /* Probe the DLB2 PF layer */
100                 dlb2->qm_instance.pf_dev = dlb2_probe(pci_dev);
101
102                 if (dlb2->qm_instance.pf_dev == NULL) {
103                         DLB2_LOG_ERR("DLB2 PF Probe failed with error %d\n",
104                                      rte_errno);
105                         ret = -rte_errno;
106                         goto dlb2_probe_failed;
107                 }
108
109                 /* Were we invoked with runtime parameters? */
110                 if (pci_dev->device.devargs) {
111                         ret = dlb2_parse_params(pci_dev->device.devargs->args,
112                                                 pci_dev->device.devargs->name,
113                                                 &dlb2_args);
114                         if (ret) {
115                                 DLB2_LOG_ERR("PFPMD failed to parse args ret=%d, errno=%d\n",
116                                              ret, rte_errno);
117                                 goto dlb2_probe_failed;
118                         }
119                 }
120
121                 ret = dlb2_primary_eventdev_probe(eventdev,
122                                                   event_dlb2_pf_name,
123                                                   &dlb2_args);
124         } else {
125                 ret = dlb2_secondary_eventdev_probe(eventdev,
126                                                     event_dlb2_pf_name);
127         }
128         if (ret)
129                 goto dlb2_probe_failed;
130
131         DLB2_LOG_INFO("DLB2 PF Probe success\n");
132
133         return 0;
134
135 dlb2_probe_failed:
136
137         DLB2_LOG_INFO("DLB2 PF Probe failed, ret=%d\n", ret);
138
139         return ret;
140 }
141
142 #define EVENTDEV_INTEL_VENDOR_ID 0x8086
143
144 static const struct rte_pci_id pci_id_dlb2_map[] = {
145         {
146                 RTE_PCI_DEVICE(EVENTDEV_INTEL_VENDOR_ID,
147                                PCI_DEVICE_ID_INTEL_DLB2_PF)
148         },
149         {
150                 .vendor_id = 0,
151         },
152 };
153
154 static int
155 event_dlb2_pci_probe(struct rte_pci_driver *pci_drv,
156                      struct rte_pci_device *pci_dev)
157 {
158         int ret;
159
160         ret = rte_event_pmd_pci_probe_named(pci_drv, pci_dev,
161                                              sizeof(struct dlb2_eventdev),
162                                              dlb2_eventdev_pci_init,
163                                              event_dlb2_pf_name);
164         if (ret) {
165                 DLB2_LOG_INFO("rte_event_pmd_pci_probe_named() failed, "
166                                 "ret=%d\n", ret);
167         }
168
169         return ret;
170 }
171
172 static int
173 event_dlb2_pci_remove(struct rte_pci_device *pci_dev)
174 {
175         int ret;
176
177         ret = rte_event_pmd_pci_remove(pci_dev, NULL);
178
179         if (ret) {
180                 DLB2_LOG_INFO("rte_event_pmd_pci_remove() failed, "
181                                 "ret=%d\n", ret);
182         }
183
184         return ret;
185
186 }
187
188 static struct rte_pci_driver pci_eventdev_dlb2_pmd = {
189         .id_table = pci_id_dlb2_map,
190         .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
191         .probe = event_dlb2_pci_probe,
192         .remove = event_dlb2_pci_remove,
193 };
194
195 RTE_PMD_REGISTER_PCI(event_dlb2_pf, pci_eventdev_dlb2_pmd);
196 RTE_PMD_REGISTER_PCI_TABLE(event_dlb2_pf, pci_id_dlb2_map);