xref: /freebsd/sys/dev/pci/pcib_if.m (revision a998d4b50e60cf4f39fc53fbd7c517662ba9f388)
1#-
2# Copyright (c) 2000 Doug Rabson
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD$
27#
28
29#include <sys/bus.h>
30#include <sys/rman.h>
31#include <dev/pci/pcivar.h>
32#include <dev/pci/pcib_private.h>
33
34INTERFACE pcib;
35
36CODE {
37	static int
38	null_route_interrupt(device_t pcib, device_t dev, int pin)
39	{
40		return (PCI_INVALID_IRQ);
41	}
42};
43
44#
45# Return the number of slots on the attached PCI bus.
46#
47METHOD int maxslots {
48	device_t	dev;
49};
50
51#
52#
53# Return the number of functions on the attached PCI bus.
54#
55METHOD int maxfuncs {
56	device_t	dev;
57} DEFAULT pcib_maxfuncs;
58
59#
60# Read configuration space on the PCI bus. The bus, slot and func
61# arguments determine the device which is being read and the reg
62# argument is a byte offset into configuration space for that
63# device. The width argument (which should be 1, 2 or 4) specifies how
64# many byte of configuration space to read from that offset.
65#
66METHOD u_int32_t read_config {
67	device_t	dev;
68	u_int		bus;
69	u_int		slot;
70	u_int		func;
71	u_int		reg;
72	int		width;
73};
74
75#
76# Write configuration space on the PCI bus. The bus, slot and func
77# arguments determine the device which is being written and the reg
78# argument is a byte offset into configuration space for that
79# device. The value field is written to the configuration space, with
80# the number of bytes written depending on the width argument.
81#
82METHOD void write_config {
83	device_t	dev;
84	u_int		bus;
85	u_int		slot;
86	u_int		func;
87	u_int		reg;
88	u_int32_t	value;
89	int		width;
90};
91
92#
93# Route an interrupt.  Returns a value suitable for stuffing into
94# a device's interrupt register.
95#
96METHOD int route_interrupt {
97	device_t	pcib;
98	device_t	dev;
99	int		pin;
100} DEFAULT null_route_interrupt;
101
102#
103# Allocate 'count' MSI messsages mapped onto 'count' IRQs.  'irq' points
104# to an array of at least 'count' ints.  The max number of messages this
105# device supports is included so that the MD code can take that into
106# account when assigning resources so that the proper number of low bits
107# are clear in the resulting message data value.
108#
109METHOD int alloc_msi {
110	device_t	pcib;
111	device_t	dev;
112	int		count;
113	int		maxcount;
114	int		*irqs;
115};
116
117#
118# Release 'count' MSI messages mapped onto 'count' IRQs stored in the
119# array pointed to by 'irqs'.
120#
121METHOD int release_msi {
122	device_t	pcib;
123	device_t	dev;
124	int		count;
125	int		*irqs;
126};
127
128#
129# Allocate a single MSI-X message mapped onto '*irq'.
130#
131METHOD int alloc_msix {
132	device_t	pcib;
133	device_t	dev;
134	int		*irq;
135};
136
137#
138# Release a single MSI-X message mapped onto 'irq'.
139#
140METHOD int release_msix {
141	device_t	pcib;
142	device_t	dev;
143	int		irq;
144};
145
146#
147# Determine the MSI/MSI-X message address and data for 'irq'.  The address
148# is returned in '*addr', and the data in '*data'.
149#
150METHOD int map_msi {
151	device_t	pcib;
152	device_t	dev;
153	int		irq;
154	uint64_t	*addr;
155	uint32_t	*data;
156};
157
158#
159# Return the device power state to be used during a system sleep state
160# transition such as suspend and resume.
161#
162METHOD int power_for_sleep {
163	device_t	pcib;
164	device_t	dev;
165	int		*pstate;
166};
167
168#
169# Return the PCI Routing Identifier (RID) for the device.
170#
171METHOD uint16_t get_rid {
172	device_t	pcib;
173	device_t	dev;
174} DEFAULT pcib_get_rid;
175
176#
177# Enable Alternative RID Interpretation if both the downstream port (pcib)
178# and the endpoint device (dev) both support it.
179#
180METHOD int try_enable_ari {
181	device_t	pcib;
182	device_t	dev;
183};
184
185