xref: /freebsd/sys/dev/pci/pci_if.m (revision 1e43b18c4b5960382eb9a0df487360dba4bbd349)
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