X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fpci%2Fpci.h;h=71d4baedd20e400cfaa456b8c75cbc26953f2823;hb=d2bfb78f4f8fbfae204424467a4106530b89e608;hp=072988a356177c3c96da3888c0057ccbe10036fb;hpb=599a16bf8afeee9937cf3b12f2385a454d956bc7;p=vpp.git diff --git a/src/vlib/pci/pci.h b/src/vlib/pci/pci.h index 072988a3561..71d4baedd20 100644 --- a/src/vlib/pci/pci.h +++ b/src/vlib/pci/pci.h @@ -59,6 +59,9 @@ typedef CLIB_PACKED (union typedef struct vlib_pci_device_info { + u32 flags; +#define VLIB_PCI_DEVICE_INFO_F_NOIOMMU (1 << 0); + /* addr */ vlib_pci_addr_t addr; @@ -93,12 +96,16 @@ typedef struct vlib_pci_device_info typedef u32 vlib_pci_dev_handle_t; -vlib_pci_device_info_t *vlib_pci_get_device_info (vlib_pci_addr_t * addr, +vlib_pci_device_info_t *vlib_pci_get_device_info (vlib_main_t * vm, + vlib_pci_addr_t * addr, clib_error_t ** error); vlib_pci_addr_t *vlib_pci_get_all_dev_addrs (); -vlib_pci_addr_t *vlib_pci_get_addr (vlib_pci_dev_handle_t h); -uword vlib_pci_get_private_data (vlib_pci_dev_handle_t h); -void vlib_pci_set_private_data (vlib_pci_dev_handle_t h, uword private_data); +vlib_pci_addr_t *vlib_pci_get_addr (vlib_main_t * vm, + vlib_pci_dev_handle_t h); +u32 vlib_pci_get_numa_node (vlib_main_t * vm, vlib_pci_dev_handle_t h); +uword vlib_pci_get_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h); +void vlib_pci_set_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h, + uword private_data); static inline void vlib_pci_free_device_info (vlib_pci_device_info_t * di) @@ -117,8 +124,10 @@ typedef struct u16 vendor_id, device_id; } pci_device_id_t; -typedef void (pci_intx_handler_function_t) (vlib_pci_dev_handle_t handle); -typedef void (pci_msix_handler_function_t) (vlib_pci_dev_handle_t handle, +typedef void (pci_intx_handler_function_t) (vlib_main_t * vm, + vlib_pci_dev_handle_t handle); +typedef void (pci_msix_handler_function_t) (vlib_main_t * vm, + vlib_pci_dev_handle_t handle, u16 line); typedef struct _pci_device_registration @@ -142,6 +151,8 @@ typedef struct { vlib_main_t *vlib_main; pci_device_registration_t *pci_device_registrations; + /* logging */ + vlib_log_class_t log_default; } vlib_pci_main_t; extern vlib_pci_main_t pci_main; @@ -156,87 +167,111 @@ static void __vlib_add_pci_device_registration_##x (void) \ x.next_registration = pm->pci_device_registrations; \ pm->pci_device_registrations = &x; \ } \ +static void __vlib_rm_pci_device_registration_##x (void) \ + __attribute__((__destructor__)) ; \ +static void __vlib_rm_pci_device_registration_##x (void) \ +{ \ + vlib_pci_main_t * pm = &pci_main; \ + VLIB_REMOVE_FROM_LINKED_LIST (pm->pci_device_registrations, \ + &x, next_registration); \ +} \ __VA_ARGS__ pci_device_registration_t x -clib_error_t *vlib_pci_bind_to_uio (vlib_pci_addr_t * addr, +clib_error_t *vlib_pci_bind_to_uio (vlib_main_t * vm, vlib_pci_addr_t * addr, char *uio_driver_name); /* Configuration space read/write. */ -clib_error_t *vlib_pci_read_write_config (vlib_pci_dev_handle_t handle, +clib_error_t *vlib_pci_read_write_config (vlib_main_t * vm, + vlib_pci_dev_handle_t handle, vlib_read_or_write_t read_or_write, - uword address, - void *data, u32 n_bytes); + uword address, void *data, + u32 n_bytes); + +/* io space read/write. */ +clib_error_t *vlib_pci_read_write_io (vlib_main_t * vm, + vlib_pci_dev_handle_t handle, + vlib_read_or_write_t read_or_write, + uword address, void *data, u32 n_bytes); + -#define _(t) \ +#define _(t, x) \ static inline clib_error_t * \ -vlib_pci_read_config_##t (vlib_pci_dev_handle_t h, \ +vlib_pci_read_##x##_##t (vlib_main_t *vm, vlib_pci_dev_handle_t h, \ uword address, t * data) \ { \ - return vlib_pci_read_write_config (h, VLIB_READ,address, data, \ + return vlib_pci_read_write_##x (vm, h, VLIB_READ,address, data, \ sizeof (data[0])); \ } -_(u32); -_(u16); -_(u8); +_(u32, config); +_(u16, config); +_(u8, config); + +_(u32, io); +_(u16, io); +_(u8, io); #undef _ -#define _(t) \ +#define _(t, x) \ static inline clib_error_t * \ -vlib_pci_write_config_##t (vlib_pci_dev_handle_t h, uword address, \ - t * data) \ +vlib_pci_write_##x##_##t (vlib_main_t *vm, vlib_pci_dev_handle_t h, \ + uword address, t * data) \ { \ - return vlib_pci_read_write_config (h, VLIB_WRITE, \ + return vlib_pci_read_write_##x (vm, h, VLIB_WRITE, \ address, data, sizeof (data[0])); \ } -_(u32); -_(u16); -_(u8); +_(u32, config); +_(u16, config); +_(u8, config); + +_(u32, io); +_(u16, io); +_(u8, io); #undef _ static inline clib_error_t * -vlib_pci_intr_enable (vlib_pci_dev_handle_t h) +vlib_pci_intr_enable (vlib_main_t * vm, vlib_pci_dev_handle_t h) { u16 command; clib_error_t *err; - err = vlib_pci_read_config_u16 (h, 4, &command); + err = vlib_pci_read_config_u16 (vm, h, 4, &command); if (err) return err; command &= ~PCI_COMMAND_INTX_DISABLE; - return vlib_pci_write_config_u16 (h, 4, &command); + return vlib_pci_write_config_u16 (vm, h, 4, &command); } static inline clib_error_t * -vlib_pci_intr_disable (vlib_pci_dev_handle_t h) +vlib_pci_intr_disable (vlib_main_t * vm, vlib_pci_dev_handle_t h) { u16 command; clib_error_t *err; - err = vlib_pci_read_config_u16 (h, 4, &command); + err = vlib_pci_read_config_u16 (vm, h, 4, &command); if (err) return err; command |= PCI_COMMAND_INTX_DISABLE; - return vlib_pci_write_config_u16 (h, 4, &command); + return vlib_pci_write_config_u16 (vm, h, 4, &command); } static inline clib_error_t * -vlib_pci_bus_master_enable (vlib_pci_dev_handle_t h) +vlib_pci_bus_master_enable (vlib_main_t * vm, vlib_pci_dev_handle_t h) { clib_error_t *err; u16 command; /* Set bus master enable (BME) */ - err = vlib_pci_read_config_u16 (h, 4, &command); + err = vlib_pci_read_config_u16 (vm, h, 4, &command); if (err) return err; @@ -246,24 +281,41 @@ vlib_pci_bus_master_enable (vlib_pci_dev_handle_t h) command |= PCI_COMMAND_BUS_MASTER; - return vlib_pci_write_config_u16 (h, 4, &command); + return vlib_pci_write_config_u16 (vm, h, 4, &command); } -clib_error_t *vlib_pci_map_region (vlib_pci_dev_handle_t h, u32 resource, - void **result); - -clib_error_t *vlib_pci_map_region_fixed (vlib_pci_dev_handle_t h, +clib_error_t *vlib_pci_device_open (vlib_main_t * vm, vlib_pci_addr_t * addr, + pci_device_id_t ids[], + vlib_pci_dev_handle_t * handle); +void vlib_pci_device_close (vlib_main_t * vm, vlib_pci_dev_handle_t h); +clib_error_t *vlib_pci_map_region (vlib_main_t * vm, vlib_pci_dev_handle_t h, + u32 resource, void **result); +clib_error_t *vlib_pci_map_region_fixed (vlib_main_t * vm, + vlib_pci_dev_handle_t h, u32 resource, u8 * addr, void **result); - -clib_error_t *vlib_pci_register_msix_handler (vlib_pci_dev_handle_t h, +clib_error_t *vlib_pci_io_region (vlib_main_t * vm, vlib_pci_dev_handle_t h, + u32 resource); +clib_error_t *vlib_pci_register_intx_handler (vlib_main_t * vm, + vlib_pci_dev_handle_t h, + pci_intx_handler_function_t * + intx_handler); +clib_error_t *vlib_pci_register_msix_handler (vlib_main_t * vm, + vlib_pci_dev_handle_t h, u32 start, u32 count, pci_msix_handler_function_t * msix_handler); -clib_error_t *vlib_pci_enable_msix_irq (vlib_pci_dev_handle_t h, u16 start, +clib_error_t *vlib_pci_enable_msix_irq (vlib_main_t * vm, + vlib_pci_dev_handle_t h, u16 start, u16 count); -clib_error_t *vlib_pci_disable_msix_irq (vlib_pci_dev_handle_t h, u16 start, +clib_error_t *vlib_pci_disable_msix_irq (vlib_main_t * vm, + vlib_pci_dev_handle_t h, u16 start, u16 count); +clib_error_t *vlib_pci_map_dma (vlib_main_t * vm, vlib_pci_dev_handle_t h, + void *ptr); + +int vlib_pci_supports_virtual_addr_dma (vlib_main_t * vm, + vlib_pci_dev_handle_t h); unformat_function_t unformat_vlib_pci_addr; format_function_t format_vlib_pci_addr;