1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 1997, Stefan Esser <se@freebsd.org> 5 * Copyright (c) 2000, Michael Smith <msmith@freebsd.org> 6 * Copyright (c) 2000, BSDi 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice unmodified, this list of conditions, and the following 14 * disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 */ 31 32#ifndef _PCI_PRIVATE_H_ 33#define _PCI_PRIVATE_H_ 34 35/* 36 * Export definitions of the pci bus so that we can more easily share 37 * it with "subclass" buses. 38 */ 39DECLARE_CLASS(pci_driver); 40 41struct pci_softc { 42 bus_dma_tag_t sc_dma_tag; 43#ifdef PCI_RES_BUS 44 struct resource *sc_bus; 45#endif 46}; 47 48extern int pci_do_power_resume; 49extern int pci_do_power_suspend; 50 51 52device_attach_t pci_attach; 53device_detach_t pci_detach; 54device_resume_t pci_resume; 55 56bus_print_child_t pci_print_child; 57bus_probe_nomatch_t pci_probe_nomatch; 58bus_read_ivar_t pci_read_ivar; 59bus_write_ivar_t pci_write_ivar; 60bus_driver_added_t pci_driver_added; 61bus_setup_intr_t pci_setup_intr; 62bus_teardown_intr_t pci_teardown_intr; 63 64bus_get_dma_tag_t pci_get_dma_tag; 65bus_get_resource_list_t pci_get_resource_list; 66bus_delete_resource_t pci_delete_resource; 67bus_alloc_resource_t pci_alloc_resource; 68#ifdef PCI_IOV 69bus_adjust_resource_t pci_adjust_resource; 70#endif 71bus_release_resource_t pci_release_resource; 72bus_activate_resource_t pci_activate_resource; 73bus_deactivate_resource_t pci_deactivate_resource; 74#ifdef PCI_IOV 75bus_map_resource_t pci_map_resource; 76bus_unmap_resource_t pci_unmap_resource; 77#endif 78bus_child_deleted_t pci_child_deleted; 79bus_child_detached_t pci_child_detached; 80bus_child_pnpinfo_t pci_child_pnpinfo_method; 81bus_child_location_t pci_child_location_method; 82bus_get_device_path_t pci_get_device_path_method; 83bus_suspend_child_t pci_suspend_child; 84bus_resume_child_t pci_resume_child; 85bus_rescan_t pci_rescan_method; 86 87pci_read_config_t pci_read_config_method; 88pci_write_config_t pci_write_config_method; 89pci_enable_busmaster_t pci_enable_busmaster_method; 90pci_disable_busmaster_t pci_disable_busmaster_method; 91pci_enable_io_t pci_enable_io_method; 92pci_disable_io_t pci_disable_io_method; 93pci_get_vpd_ident_t pci_get_vpd_ident_method; 94pci_get_vpd_readonly_t pci_get_vpd_readonly_method; 95pci_get_powerstate_t pci_get_powerstate_method; 96pci_set_powerstate_t pci_set_powerstate_method; 97pci_assign_interrupt_t pci_assign_interrupt_method; 98pci_find_cap_t pci_find_cap_method; 99pci_find_next_cap_t pci_find_next_cap_method; 100pci_find_extcap_t pci_find_extcap_method; 101pci_find_next_extcap_t pci_find_next_extcap_method; 102pci_find_htcap_t pci_find_htcap_method; 103pci_find_next_htcap_t pci_find_next_htcap_method; 104pci_alloc_msi_t pci_alloc_msi_method; 105pci_alloc_msix_t pci_alloc_msix_method; 106pci_enable_msi_t pci_enable_msi_method; 107pci_enable_msix_t pci_enable_msix_method; 108pci_disable_msi_t pci_disable_msi_method; 109pci_remap_msix_t pci_remap_msix_method; 110pci_release_msi_t pci_release_msi_method; 111pci_msi_count_t pci_msi_count_method; 112pci_msix_count_t pci_msix_count_method; 113pci_msix_pba_bar_t pci_msix_pba_bar_method; 114pci_msix_table_bar_t pci_msix_table_bar_method; 115pci_alloc_devinfo_t pci_alloc_devinfo_method; 116pci_child_added_t pci_child_added_method; 117#ifdef PCI_IOV 118pci_iov_attach_t pci_iov_attach_method; 119pci_iov_detach_t pci_iov_detach_method; 120pci_create_iov_child_t pci_create_iov_child_method; 121#endif 122 123void pci_add_children(device_t dev, int domain, int busno); 124void pci_add_child(device_t bus, struct pci_devinfo *dinfo); 125device_t pci_add_iov_child(device_t bus, device_t pf, uint16_t rid, 126 uint16_t vid, uint16_t did); 127void pci_add_resources(device_t bus, device_t dev, int force, 128 uint32_t prefetchmask); 129void pci_add_resources_ea(device_t bus, device_t dev, int alloc_iov); 130int pci_attach_common(device_t dev); 131int pci_ea_is_enabled(device_t dev, int rid); 132struct pci_devinfo *pci_read_device(device_t pcib, device_t bus, int d, int b, 133 int s, int f); 134void pci_print_verbose(struct pci_devinfo *dinfo); 135int pci_freecfg(struct pci_devinfo *dinfo); 136 137/** Restore the config register state. The state must be previously 138 * saved with pci_cfg_save. However, the pci bus driver takes care of 139 * that. This function will also return the device to PCI_POWERSTATE_D0 140 * if it is currently in a lower power mode. 141 */ 142void pci_cfg_restore(device_t, struct pci_devinfo *); 143 144/** Save the config register state. Optionally set the power state to D3 145 * if the third argument is non-zero. 146 */ 147void pci_cfg_save(device_t, struct pci_devinfo *, int); 148 149int pci_mapsize(uint64_t testval); 150void pci_read_bar(device_t dev, int reg, pci_addr_t *mapp, 151 pci_addr_t *testvalp, int *bar64); 152struct pci_map *pci_add_bar(device_t dev, int reg, pci_addr_t value, 153 pci_addr_t size); 154 155struct resource *pci_reserve_map(device_t dev, device_t child, int type, 156 int *rid, rman_res_t start, rman_res_t end, 157 rman_res_t count, u_int num, u_int flags); 158 159struct resource *pci_alloc_multi_resource(device_t dev, device_t child, 160 int type, int *rid, rman_res_t start, rman_res_t end, 161 rman_res_t count, u_long num, u_int flags); 162 163struct resource *pci_vf_alloc_mem_resource(device_t dev, device_t child, 164 int *rid, rman_res_t start, rman_res_t end, 165 rman_res_t count, u_int flags); 166int pci_vf_release_mem_resource(device_t dev, device_t child, 167 struct resource *r); 168int pci_vf_activate_mem_resource(device_t dev, device_t child, 169 struct resource *r); 170int pci_vf_deactivate_mem_resource(device_t dev, device_t child, 171 struct resource *r); 172int pci_vf_adjust_mem_resource(device_t dev, device_t child, 173 struct resource *r, rman_res_t start, rman_res_t end); 174int pci_vf_map_mem_resource(device_t dev, device_t child, 175 struct resource *r, struct resource_map_request *argsp, 176 struct resource_map *map); 177int pci_vf_unmap_mem_resource(device_t dev, device_t child, 178 struct resource *r, struct resource_map *map); 179 180#endif /* _PCI_PRIVATE_H_ */ 181