1098ca2bdSWarner Losh#- 26182fdbdSPeter Wemm# Copyright (c) 1998 Doug Rabson 36182fdbdSPeter Wemm# All rights reserved. 46182fdbdSPeter Wemm# 56182fdbdSPeter Wemm# Redistribution and use in source and binary forms, with or without 66182fdbdSPeter Wemm# modification, are permitted provided that the following conditions 76182fdbdSPeter Wemm# are met: 86182fdbdSPeter Wemm# 1. Redistributions of source code must retain the above copyright 96182fdbdSPeter Wemm# notice, this list of conditions and the following disclaimer. 106182fdbdSPeter Wemm# 2. Redistributions in binary form must reproduce the above copyright 116182fdbdSPeter Wemm# notice, this list of conditions and the following disclaimer in the 126182fdbdSPeter Wemm# documentation and/or other materials provided with the distribution. 136182fdbdSPeter Wemm# 146182fdbdSPeter Wemm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 156182fdbdSPeter Wemm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 166182fdbdSPeter Wemm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 176182fdbdSPeter Wemm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 186182fdbdSPeter Wemm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 196182fdbdSPeter Wemm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 206182fdbdSPeter Wemm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 216182fdbdSPeter Wemm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 226182fdbdSPeter Wemm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 236182fdbdSPeter Wemm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 246182fdbdSPeter Wemm# SUCH DAMAGE. 256182fdbdSPeter Wemm# 26c3aac50fSPeter Wemm# $FreeBSD$ 276182fdbdSPeter Wemm# 286182fdbdSPeter Wemm 29f7b77691SDoug Rabson#include <sys/bus.h> 30d7be980dSAndrew Turner#include <dev/pci/pcivar.h> 31f7b77691SDoug Rabson 326182fdbdSPeter WemmINTERFACE pci; 336182fdbdSPeter Wemm 349bf4c9c1SJohn BaldwinCODE { 359bf4c9c1SJohn Baldwin static int 369bf4c9c1SJohn Baldwin null_msi_count(device_t dev, device_t child) 379bf4c9c1SJohn Baldwin { 389bf4c9c1SJohn Baldwin return (0); 399bf4c9c1SJohn Baldwin } 409bfb1e36SRyan Stone 41ce204e1bSJohn Baldwin static int 42ce204e1bSJohn Baldwin null_msix_bar(device_t dev, device_t child) 43ce204e1bSJohn Baldwin { 44ce204e1bSJohn Baldwin return (-1); 45ce204e1bSJohn Baldwin } 46ce204e1bSJohn Baldwin 479bfb1e36SRyan Stone static device_t 489bfb1e36SRyan Stone null_create_iov_child(device_t bus, device_t pf, uint16_t rid, 499bfb1e36SRyan Stone uint16_t vid, uint16_t did) 509bfb1e36SRyan Stone { 519bfb1e36SRyan Stone device_printf(bus, "PCI_IOV not implemented on this bus.\n"); 529bfb1e36SRyan Stone return (NULL); 539bfb1e36SRyan Stone } 549bf4c9c1SJohn Baldwin}; 559bf4c9c1SJohn Baldwin 561191f715SRyan StoneHEADER { 571191f715SRyan Stone struct nvlist; 58d7be980dSAndrew Turner 59d7be980dSAndrew Turner enum pci_id_type { 60d7be980dSAndrew Turner PCI_ID_RID, 61*1e43b18cSAndrew Turner PCI_ID_MSI, 62d7be980dSAndrew Turner }; 631191f715SRyan Stone} 641191f715SRyan Stone 659bf4c9c1SJohn Baldwin 666182fdbdSPeter WemmMETHOD u_int32_t read_config { 676182fdbdSPeter Wemm device_t dev; 686182fdbdSPeter Wemm device_t child; 696182fdbdSPeter Wemm int reg; 706182fdbdSPeter Wemm int width; 716182fdbdSPeter Wemm}; 726182fdbdSPeter Wemm 736182fdbdSPeter WemmMETHOD void write_config { 746182fdbdSPeter Wemm device_t dev; 756182fdbdSPeter Wemm device_t child; 766182fdbdSPeter Wemm int reg; 776182fdbdSPeter Wemm u_int32_t val; 786182fdbdSPeter Wemm int width; 796182fdbdSPeter Wemm}; 809eb13b39SPeter Wemm 819eb13b39SPeter WemmMETHOD int get_powerstate { 829eb13b39SPeter Wemm device_t dev; 839eb13b39SPeter Wemm device_t child; 849eb13b39SPeter Wemm}; 859eb13b39SPeter Wemm 869eb13b39SPeter WemmMETHOD int set_powerstate { 879eb13b39SPeter Wemm device_t dev; 889eb13b39SPeter Wemm device_t child; 899eb13b39SPeter Wemm int state; 909eb13b39SPeter Wemm}; 919eb13b39SPeter Wemm 92667dc26eSJohn-Mark GurneyMETHOD int get_vpd_ident { 93667dc26eSJohn-Mark Gurney device_t dev; 94667dc26eSJohn-Mark Gurney device_t child; 95667dc26eSJohn-Mark Gurney const char **identptr; 96667dc26eSJohn-Mark Gurney}; 97667dc26eSJohn-Mark Gurney 98667dc26eSJohn-Mark GurneyMETHOD int get_vpd_readonly { 99667dc26eSJohn-Mark Gurney device_t dev; 100667dc26eSJohn-Mark Gurney device_t child; 101667dc26eSJohn-Mark Gurney const char *kw; 102667dc26eSJohn-Mark Gurney const char **vptr; 103667dc26eSJohn-Mark Gurney}; 104667dc26eSJohn-Mark Gurney 105c047e5b1SMatthew N. DoddMETHOD int enable_busmaster { 1069eb13b39SPeter Wemm device_t dev; 1079eb13b39SPeter Wemm device_t child; 1089eb13b39SPeter Wemm}; 1099eb13b39SPeter Wemm 110c047e5b1SMatthew N. DoddMETHOD int disable_busmaster { 1119eb13b39SPeter Wemm device_t dev; 1129eb13b39SPeter Wemm device_t child; 1139eb13b39SPeter Wemm}; 1149eb13b39SPeter Wemm 115c047e5b1SMatthew N. DoddMETHOD int enable_io { 1169eb13b39SPeter Wemm device_t dev; 1179eb13b39SPeter Wemm device_t child; 1189eb13b39SPeter Wemm int space; 1199eb13b39SPeter Wemm}; 1209eb13b39SPeter Wemm 121c047e5b1SMatthew N. DoddMETHOD int disable_io { 1229eb13b39SPeter Wemm device_t dev; 1239eb13b39SPeter Wemm device_t child; 1249eb13b39SPeter Wemm int space; 1259eb13b39SPeter Wemm}; 1263920999dSThomas Moestl 1273920999dSThomas MoestlMETHOD int assign_interrupt { 1283920999dSThomas Moestl device_t dev; 1293920999dSThomas Moestl device_t child; 1303920999dSThomas Moestl}; 1314f9795b9SJohn Baldwin 132c668000bSJohn BaldwinMETHOD int find_cap { 133c668000bSJohn Baldwin device_t dev; 134c668000bSJohn Baldwin device_t child; 135c668000bSJohn Baldwin int capability; 136c668000bSJohn Baldwin int *capreg; 137c668000bSJohn Baldwin}; 138c668000bSJohn Baldwin 1394f9795b9SJohn BaldwinMETHOD int find_extcap { 1404f9795b9SJohn Baldwin device_t dev; 1414f9795b9SJohn Baldwin device_t child; 1424f9795b9SJohn Baldwin int capability; 1434f9795b9SJohn Baldwin int *capreg; 1444f9795b9SJohn Baldwin}; 1459bf4c9c1SJohn Baldwin 146c668000bSJohn BaldwinMETHOD int find_htcap { 147c668000bSJohn Baldwin device_t dev; 148c668000bSJohn Baldwin device_t child; 149c668000bSJohn Baldwin int capability; 150c668000bSJohn Baldwin int *capreg; 151c668000bSJohn Baldwin}; 152c668000bSJohn Baldwin 1539bf4c9c1SJohn BaldwinMETHOD int alloc_msi { 1549bf4c9c1SJohn Baldwin device_t dev; 1559bf4c9c1SJohn Baldwin device_t child; 1569bf4c9c1SJohn Baldwin int *count; 1579bf4c9c1SJohn Baldwin}; 1589bf4c9c1SJohn Baldwin 1595fe82bcaSJohn BaldwinMETHOD int alloc_msix { 1605fe82bcaSJohn Baldwin device_t dev; 1615fe82bcaSJohn Baldwin device_t child; 1625fe82bcaSJohn Baldwin int *count; 1635fe82bcaSJohn Baldwin}; 1645fe82bcaSJohn Baldwin 165073bf9ddSRoger Pau MonnéMETHOD void enable_msi { 166073bf9ddSRoger Pau Monné device_t dev; 167073bf9ddSRoger Pau Monné device_t child; 168073bf9ddSRoger Pau Monné uint64_t address; 169073bf9ddSRoger Pau Monné uint16_t data; 170073bf9ddSRoger Pau Monné}; 171073bf9ddSRoger Pau Monné 172073bf9ddSRoger Pau MonnéMETHOD void enable_msix { 173073bf9ddSRoger Pau Monné device_t dev; 174073bf9ddSRoger Pau Monné device_t child; 175073bf9ddSRoger Pau Monné u_int index; 176073bf9ddSRoger Pau Monné uint64_t address; 177073bf9ddSRoger Pau Monné uint32_t data; 178073bf9ddSRoger Pau Monné}; 179073bf9ddSRoger Pau Monné 180073bf9ddSRoger Pau MonnéMETHOD void disable_msi { 181073bf9ddSRoger Pau Monné device_t dev; 182073bf9ddSRoger Pau Monné device_t child; 183073bf9ddSRoger Pau Monné}; 184073bf9ddSRoger Pau Monné 1855fe82bcaSJohn BaldwinMETHOD int remap_msix { 1865fe82bcaSJohn Baldwin device_t dev; 1875fe82bcaSJohn Baldwin device_t child; 188e706f7f0SJohn Baldwin int count; 189e706f7f0SJohn Baldwin const u_int *vectors; 1905fe82bcaSJohn Baldwin}; 1915fe82bcaSJohn Baldwin 1929bf4c9c1SJohn BaldwinMETHOD int release_msi { 1939bf4c9c1SJohn Baldwin device_t dev; 1949bf4c9c1SJohn Baldwin device_t child; 1959bf4c9c1SJohn Baldwin}; 1969bf4c9c1SJohn Baldwin 1979bf4c9c1SJohn BaldwinMETHOD int msi_count { 1989bf4c9c1SJohn Baldwin device_t dev; 1999bf4c9c1SJohn Baldwin device_t child; 2009bf4c9c1SJohn Baldwin} DEFAULT null_msi_count; 2015fe82bcaSJohn Baldwin 2025fe82bcaSJohn BaldwinMETHOD int msix_count { 2035fe82bcaSJohn Baldwin device_t dev; 2045fe82bcaSJohn Baldwin device_t child; 2055fe82bcaSJohn Baldwin} DEFAULT null_msi_count; 2065605a99eSRyan Stone 207ce204e1bSJohn BaldwinMETHOD int msix_pba_bar { 208ce204e1bSJohn Baldwin device_t dev; 209ce204e1bSJohn Baldwin device_t child; 210ce204e1bSJohn Baldwin} DEFAULT null_msix_bar; 211ce204e1bSJohn Baldwin 212ce204e1bSJohn BaldwinMETHOD int msix_table_bar { 213ce204e1bSJohn Baldwin device_t dev; 214ce204e1bSJohn Baldwin device_t child; 215ce204e1bSJohn Baldwin} DEFAULT null_msix_bar; 216ce204e1bSJohn Baldwin 217d7be980dSAndrew TurnerMETHOD int get_id { 2185605a99eSRyan Stone device_t dev; 2195605a99eSRyan Stone device_t child; 220d7be980dSAndrew Turner enum pci_id_type type; 221d7be980dSAndrew Turner uintptr_t *id; 2225605a99eSRyan Stone}; 2235605a99eSRyan Stone 2246cd99ae8SJohn BaldwinMETHOD struct pci_devinfo * alloc_devinfo { 2256cd99ae8SJohn Baldwin device_t dev; 2266cd99ae8SJohn Baldwin}; 2276cd99ae8SJohn Baldwin 228cd407ca2SRoger Pau MonnéMETHOD void child_added { 229cd407ca2SRoger Pau Monné device_t dev; 230cd407ca2SRoger Pau Monné device_t child; 231cd407ca2SRoger Pau Monné}; 2329bfb1e36SRyan Stone 2339bfb1e36SRyan StoneMETHOD int iov_attach { 2349bfb1e36SRyan Stone device_t dev; 2359bfb1e36SRyan Stone device_t child; 2361191f715SRyan Stone struct nvlist *pf_schema; 2371191f715SRyan Stone struct nvlist *vf_schema; 2389bfb1e36SRyan Stone}; 2399bfb1e36SRyan Stone 2409bfb1e36SRyan StoneMETHOD int iov_detach { 2419bfb1e36SRyan Stone device_t dev; 2429bfb1e36SRyan Stone device_t child; 2439bfb1e36SRyan Stone}; 2449bfb1e36SRyan Stone 2459bfb1e36SRyan StoneMETHOD device_t create_iov_child { 2469bfb1e36SRyan Stone device_t bus; 2479bfb1e36SRyan Stone device_t pf; 2489bfb1e36SRyan Stone uint16_t rid; 2499bfb1e36SRyan Stone uint16_t vid; 2509bfb1e36SRyan Stone uint16_t did; 2519bfb1e36SRyan Stone} DEFAULT null_create_iov_child; 252