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