1#-
2# Copyright (c) 2016 Alexander Motin <mav@FreeBSD.org>
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#
27
28#include <sys/bus.h>
29#include <machine/bus.h>
30
31INTERFACE ntb;
32
33HEADER {
34	enum ntb_speed {
35		NTB_SPEED_AUTO = -1,
36		NTB_SPEED_NONE = 0,
37		NTB_SPEED_GEN1 = 1,
38		NTB_SPEED_GEN2 = 2,
39		NTB_SPEED_GEN3 = 3,
40		NTB_SPEED_GEN4 = 4,
41	};
42
43	enum ntb_width {
44		NTB_WIDTH_AUTO = -1,
45		NTB_WIDTH_NONE = 0,
46		NTB_WIDTH_1 = 1,
47		NTB_WIDTH_2 = 2,
48		NTB_WIDTH_4 = 4,
49		NTB_WIDTH_8 = 8,
50		NTB_WIDTH_12 = 12,
51		NTB_WIDTH_16 = 16,
52		NTB_WIDTH_32 = 32,
53	};
54
55	typedef void (*ntb_db_callback)(void *data, uint32_t vector);
56	typedef void (*ntb_event_callback)(void *data);
57	struct ntb_ctx_ops {
58		ntb_event_callback	link_event;
59		ntb_db_callback		db_event;
60	};
61};
62
63METHOD int port_number {
64	device_t	ntb;
65};
66
67METHOD int peer_port_count {
68	device_t	ntb;
69};
70
71METHOD int peer_port_number {
72	device_t	ntb;
73	int		pidx;
74};
75
76METHOD int peer_port_idx {
77	device_t	ntb;
78	int		port;
79};
80
81METHOD bool link_is_up {
82	device_t	 ntb;
83	enum ntb_speed	*speed;
84	enum ntb_width	*width;
85};
86
87METHOD int link_enable {
88	device_t	 ntb;
89	enum ntb_speed	 speed;
90	enum ntb_width	 width;
91};
92
93METHOD int link_disable {
94	device_t	 ntb;
95};
96
97METHOD bool link_enabled {
98	device_t	 ntb;
99};
100
101METHOD int set_ctx {
102	device_t	 ntb;
103	void		*ctx;
104	const struct ntb_ctx_ops *ctx_ops;
105};
106
107METHOD void * get_ctx {
108	device_t	 ntb;
109	const struct ntb_ctx_ops **ctx_ops;
110};
111
112METHOD void clear_ctx {
113	device_t	 ntb;
114};
115
116METHOD uint8_t mw_count {
117	device_t	 ntb;
118};
119
120METHOD int mw_get_range {
121	device_t	 ntb;
122	unsigned	 mw_idx;
123	vm_paddr_t	*base;
124	caddr_t		*vbase;
125	size_t		*size;
126	size_t		*align;
127	size_t		*align_size;
128	bus_addr_t	*plimit;
129};
130
131METHOD int mw_set_trans {
132	device_t	 ntb;
133	unsigned	 mw_idx;
134	bus_addr_t	 addr;
135	size_t		 size;
136};
137
138METHOD int mw_clear_trans {
139	device_t	 ntb;
140	unsigned	 mw_idx;
141};
142
143METHOD int mw_get_wc {
144	device_t	 ntb;
145	unsigned	 mw_idx;
146	vm_memattr_t	*mode;
147};
148
149METHOD int mw_set_wc {
150	device_t	 ntb;
151	unsigned	 mw_idx;
152	vm_memattr_t	 mode;
153};
154
155METHOD uint8_t spad_count {
156	device_t	 ntb;
157};
158
159METHOD void spad_clear {
160	device_t	 ntb;
161};
162
163METHOD int spad_write {
164	device_t	 ntb;
165	unsigned int	 idx;
166	uint32_t	 val;
167};
168
169METHOD int spad_read {
170	device_t	 ntb;
171	unsigned int	 idx;
172	uint32_t	 *val;
173};
174
175METHOD int peer_spad_write {
176	device_t	 ntb;
177	unsigned int	 idx;
178	uint32_t	 val;
179};
180
181METHOD int peer_spad_read {
182	device_t	 ntb;
183	unsigned int	 idx;
184	uint32_t	*val;
185};
186
187METHOD uint64_t db_valid_mask {
188	device_t	 ntb;
189};
190
191METHOD int db_vector_count {
192	device_t	 ntb;
193};
194
195METHOD uint64_t db_vector_mask {
196	device_t	 ntb;
197	uint32_t	 vector;
198};
199
200METHOD int peer_db_addr {
201	device_t	 ntb;
202	bus_addr_t	*db_addr;
203	vm_size_t	*db_size;
204};
205
206METHOD void db_clear {
207	device_t	 ntb;
208	uint64_t	 bits;
209};
210
211METHOD void db_clear_mask {
212	device_t	 ntb;
213	uint64_t	 bits;
214};
215
216METHOD uint64_t db_read {
217	device_t	 ntb;
218};
219
220METHOD void db_set_mask {
221	device_t	 ntb;
222	uint64_t	 bits;
223};
224
225METHOD void peer_db_set {
226	device_t	 ntb;
227	uint64_t	 bits;
228};
229