1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2016-2017 Cavium, Inc 3 */ 4 5 #ifndef _RTE_EVENTDEV_PMD_PCI_H_ 6 #define _RTE_EVENTDEV_PMD_PCI_H_ 7 8 /** @file 9 * RTE Eventdev PCI PMD APIs 10 * 11 * @note 12 * These API are from event PCI PMD only and user applications should not call 13 * them directly. 14 */ 15 16 #include <string.h> 17 18 #include <rte_compat.h> 19 #include <rte_config.h> 20 #include <rte_eal.h> 21 #include <rte_lcore.h> 22 #include <rte_pci.h> 23 #include <bus_pci_driver.h> 24 25 #include "eventdev_pmd.h" 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 31 typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev); 32 33 /** 34 * @internal 35 * Wrapper for use by pci drivers as a .probe function to attach to an event 36 * interface. Same as rte_event_pmd_pci_probe, except caller can specify 37 * the name. 38 */ 39 __rte_internal 40 static inline int 41 rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv, 42 struct rte_pci_device *pci_dev, 43 size_t private_data_size, 44 eventdev_pmd_pci_callback_t devinit, 45 const char *name) 46 { 47 struct rte_eventdev *eventdev; 48 int retval; 49 50 if (devinit == NULL) 51 return -EINVAL; 52 53 eventdev = rte_event_pmd_allocate(name, 54 pci_dev->device.numa_node); 55 if (eventdev == NULL) 56 return -ENOMEM; 57 58 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 59 eventdev->data->dev_private = 60 rte_zmalloc_socket( 61 "eventdev private structure", 62 private_data_size, 63 RTE_CACHE_LINE_SIZE, 64 rte_socket_id()); 65 66 if (eventdev->data->dev_private == NULL) 67 rte_panic("Cannot allocate memzone for private " 68 "device data"); 69 } 70 71 eventdev->dev = &pci_dev->device; 72 73 /* Invoke PMD device initialization function */ 74 retval = devinit(eventdev); 75 if (retval == 0) { 76 event_dev_probing_finish(eventdev); 77 return 0; 78 } 79 80 RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)" 81 " failed", pci_drv->driver.name, 82 (unsigned int) pci_dev->id.vendor_id, 83 (unsigned int) pci_dev->id.device_id); 84 85 rte_event_pmd_release(eventdev); 86 87 return -ENXIO; 88 } 89 90 /** 91 * @internal 92 * Wrapper for use by pci drivers as a .probe function to attach to a event 93 * interface. 94 */ 95 __rte_internal 96 static inline int 97 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, 98 struct rte_pci_device *pci_dev, 99 size_t private_data_size, 100 eventdev_pmd_pci_callback_t devinit) 101 { 102 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 103 104 rte_pci_device_name(&pci_dev->addr, eventdev_name, 105 sizeof(eventdev_name)); 106 107 return rte_event_pmd_pci_probe_named(pci_drv, 108 pci_dev, 109 private_data_size, 110 devinit, 111 eventdev_name); 112 } 113 114 /** 115 * @internal 116 * Wrapper for use by pci drivers as a .remove function to detach a event 117 * interface. 118 */ 119 __rte_internal 120 static inline int 121 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev, 122 eventdev_pmd_pci_callback_t devuninit) 123 { 124 struct rte_eventdev *eventdev; 125 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 126 int ret = 0; 127 128 if (pci_dev == NULL) 129 return -EINVAL; 130 131 rte_pci_device_name(&pci_dev->addr, eventdev_name, 132 sizeof(eventdev_name)); 133 134 eventdev = rte_event_pmd_get_named_dev(eventdev_name); 135 if (eventdev == NULL) 136 return -ENODEV; 137 138 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 139 ret = rte_event_dev_close(eventdev->data->dev_id); 140 if (ret < 0) 141 return ret; 142 } 143 144 /* Invoke PMD device un-init function */ 145 if (devuninit) 146 ret = devuninit(eventdev); 147 if (ret) 148 return ret; 149 150 /* Free event device */ 151 rte_event_pmd_release(eventdev); 152 153 eventdev->dev = NULL; 154 155 return 0; 156 } 157 158 #ifdef __cplusplus 159 } 160 #endif 161 162 #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */ 163