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