xref: /freebsd/sys/dev/bhnd/bhnd_bus_if.m (revision eb9da1ada8b6b2c74378a5c17029ec5a7fb199e6)
1#-
2# Copyright (c) 2015 Landon Fuller <landon@landonf.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 ``AS IS'' AND ANY EXPRESS OR
15# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17# IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
23# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24#
25# $FreeBSD$
26
27#include <sys/types.h>
28#include <sys/bus.h>
29#include <sys/rman.h>
30
31#include <dev/bhnd/bhnd_types.h>
32
33INTERFACE bhnd_bus;
34
35#
36# bhnd(4) bus interface
37#
38
39HEADER {
40	/* forward declarations */
41	struct bhnd_board_info;
42	struct bhnd_core_info;
43	struct bhnd_chipid;
44	struct bhnd_devinfo;
45	struct bhnd_resource;
46}
47
48CODE {
49	#include <sys/systm.h>
50
51	#include <dev/bhnd/bhndvar.h>
52
53	static struct bhnd_chipid *
54	bhnd_bus_null_get_chipid(device_t dev, device_t child)
55	{
56		panic("bhnd_bus_get_chipid unimplemented");
57	}
58
59	static bhnd_attach_type
60	bhnd_bus_null_get_attach_type(device_t dev, device_t child)
61	{
62		panic("bhnd_bus_get_attach_type unimplemented");
63	}
64
65	static int
66	bhnd_bus_null_read_board_info(device_t dev, device_t child,
67	    struct bhnd_board_info *info)
68	{
69		panic("bhnd_bus_read_boardinfo unimplemented");
70	}
71
72	static void
73	bhnd_bus_null_child_added(device_t dev, device_t child)
74	{
75	}
76
77	static device_t
78	bhnd_bus_null_find_hostb_device(device_t dev)
79	{
80		panic("bhnd_bus_find_hostb_device unimplemented");
81	}
82
83	static bool
84	bhnd_bus_null_is_hw_disabled(device_t dev, device_t child)
85	{
86		panic("bhnd_bus_is_hw_disabled unimplemented");
87	}
88
89	static int
90	bhnd_bus_null_get_probe_order(device_t dev, device_t child)
91	{
92		panic("bhnd_bus_get_probe_order unimplemented");
93	}
94
95	static int
96	bhnd_bus_null_get_port_rid(device_t dev, device_t child,
97	    bhnd_port_type port_type, u_int port, u_int region)
98	{
99		return (-1);
100	}
101
102	static int
103	bhnd_bus_null_decode_port_rid(device_t dev, device_t child, int type,
104	    int rid, bhnd_port_type *port_type, u_int *port, u_int *region)
105	{
106		return (ENOENT);
107	}
108
109	static int
110	bhnd_bus_null_get_region_addr(device_t dev, device_t child,
111	    bhnd_port_type type, u_int port, u_int region, bhnd_addr_t *addr,
112	    bhnd_size_t *size)
113	{
114		return (ENOENT);
115	}
116
117	static int
118	bhnd_bus_null_get_nvram_var(device_t dev, device_t child,
119	    const char *name, void *buf, size_t *size)
120	{
121		return (ENODEV);
122	}
123
124}
125
126/**
127 * Return the active host bridge core for the bhnd bus, if any.
128 *
129 * @param dev The bhnd bus device.
130 *
131 * @retval device_t if a hostb device exists
132 * @retval NULL if no hostb device is found.
133 */
134METHOD device_t find_hostb_device {
135	device_t dev;
136} DEFAULT bhnd_bus_null_find_hostb_device;
137
138/**
139 * Return true if the hardware components required by @p child are unpopulated
140 * or otherwise unusable.
141 *
142 * In some cases, enumerated devices may have pins that are left floating, or
143 * the hardware may otherwise be non-functional; this method allows a parent
144 * device to explicitly specify if a successfully enumerated @p child should
145 * be disabled.
146 *
147 * @param dev The device whose child is being examined.
148 * @param child The child device.
149 */
150METHOD bool is_hw_disabled {
151	device_t dev;
152	device_t child;
153} DEFAULT bhnd_bus_null_is_hw_disabled;
154
155/**
156 * Return the probe (and attach) order for @p child.
157 *
158 * All devices on the bhnd(4) bus will be probed, attached, or resumed in
159 * ascending order; they will be suspended, shutdown, and detached in
160 * descending order.
161 *
162 * The following device methods will be dispatched in ascending probe order
163 * by the bus:
164 *
165 * - DEVICE_PROBE()
166 * - DEVICE_ATTACH()
167 * - DEVICE_RESUME()
168 *
169 * The following device methods will be dispatched in descending probe order
170 * by the bus:
171 *
172 * - DEVICE_SHUTDOWN()
173 * - DEVICE_DETACH()
174 * - DEVICE_SUSPEND()
175 *
176 * @param dev The device whose child is being examined.
177 * @param child The child device.
178 *
179 * Refer to BHND_PROBE_* and BHND_PROBE_ORDER_* for the standard set of
180 * priorities.
181 */
182METHOD int get_probe_order {
183	device_t dev;
184	device_t child;
185} DEFAULT bhnd_bus_null_get_probe_order;
186
187/**
188 * Return the BHND chip identification for the parent bus.
189 *
190 * @param dev The device whose child is being examined.
191 * @param child The child device.
192 */
193METHOD const struct bhnd_chipid * get_chipid {
194	device_t dev;
195	device_t child;
196} DEFAULT bhnd_bus_null_get_chipid;
197
198/**
199 * Return the BHND attachment type of the parent bus.
200 *
201 * @param dev The device whose child is being examined.
202 * @param child The child device.
203 *
204 * @retval BHND_ATTACH_ADAPTER if the bus is resident on a bridged adapter,
205 * such as a WiFi chipset.
206 * @retval BHND_ATTACH_NATIVE if the bus provides hardware services (clock,
207 * CPU, etc) to a directly attached native host.
208 */
209METHOD bhnd_attach_type get_attach_type {
210	device_t dev;
211	device_t child;
212} DEFAULT bhnd_bus_null_get_attach_type;
213
214/**
215 * Attempt to read the BHND board identification from the parent bus.
216 *
217 * This relies on NVRAM access, and will fail if a valid NVRAM device cannot
218 * be found, or is not yet attached.
219 *
220 * @param dev The parent of @p child.
221 * @param child The bhnd device requesting board info.
222 * @param[out] info On success, will be populated with the bhnd(4) device's
223 * board information.
224 *
225 * @retval 0 success
226 * @retval ENODEV	No valid NVRAM source could be found.
227 * @retval non-zero	If reading @p name otherwise fails, a regular unix
228 *			error code will be returned.
229 */
230METHOD int read_board_info {
231	device_t dev;
232	device_t child;
233	struct bhnd_board_info *info;
234} DEFAULT bhnd_bus_null_read_board_info;
235
236/**
237 * Allocate and zero-initialize a buffer suitably sized and aligned for a
238 * bhnd_devinfo structure.
239 *
240 * @param dev The bhnd bus device.
241 *
242 * @retval non-NULL	success
243 * @retval NULL		allocation failed
244 */
245METHOD struct bhnd_devinfo * alloc_devinfo {
246	device_t dev;
247};
248
249/**
250 * Release memory previously allocated for @p devinfo.
251 *
252 * @param dev The bhnd bus device.
253 * @param dinfo A devinfo buffer previously allocated via
254 * BHND_BUS_ALLOC_DEVINFO().
255 */
256METHOD void free_devinfo {
257	device_t dev;
258	struct bhnd_devinfo *dinfo;
259};
260
261/**
262 * Notify a bhnd bus that a child was added.
263 *
264 * Called at the end of BUS_ADD_CHILD() to allow the concrete bhnd(4)
265 * driver instance to initialize any additional driver-specific state for the
266 * child.
267 *
268 * @param dev The bhnd bus whose child is being added.
269 * @param child The child added to @p dev.
270 */
271METHOD void child_added {
272	device_t dev;
273	device_t child;
274} DEFAULT bhnd_bus_null_child_added;
275
276/**
277 * Reset the device's hardware core.
278 *
279 * @param dev The parent of @p child.
280 * @param child The device to be reset.
281 * @param flags Device-specific core flags to be supplied on reset.
282 *
283 * @retval 0 success
284 * @retval non-zero error
285 */
286METHOD int reset_core {
287	device_t dev;
288	device_t child;
289	uint16_t flags;
290}
291
292/**
293 * Suspend a device hardware core.
294 *
295 * @param dev The parent of @p child.
296 * @param child The device to be reset.
297 *
298 * @retval 0 success
299 * @retval non-zero error
300 */
301METHOD int suspend_core {
302	device_t dev;
303	device_t child;
304}
305
306/**
307 * Allocate a bhnd resource.
308 *
309 * This method's semantics are functionally identical to the bus API of the same
310 * name; refer to BUS_ALLOC_RESOURCE for complete documentation.
311 */
312METHOD struct bhnd_resource * alloc_resource {
313	device_t dev;
314	device_t child;
315	int type;
316	int *rid;
317	rman_res_t start;
318	rman_res_t end;
319	rman_res_t count;
320	u_int flags;
321} DEFAULT bhnd_bus_generic_alloc_resource;
322
323/**
324 * Release a bhnd resource.
325 *
326 * This method's semantics are functionally identical to the bus API of the same
327 * name; refer to BUS_RELEASE_RESOURCE for complete documentation.
328 */
329METHOD int release_resource {
330	device_t dev;
331	device_t child;
332	int type;
333	int rid;
334	struct bhnd_resource *res;
335} DEFAULT bhnd_bus_generic_release_resource;
336
337/**
338 * Activate a bhnd resource.
339 *
340 * This method's semantics are functionally identical to the bus API of the same
341 * name; refer to BUS_ACTIVATE_RESOURCE for complete documentation.
342 */
343METHOD int activate_resource {
344	device_t dev;
345        device_t child;
346	int type;
347        int rid;
348        struct bhnd_resource *r;
349} DEFAULT bhnd_bus_generic_activate_resource;
350
351/**
352 * Deactivate a bhnd resource.
353 *
354 * This method's semantics are functionally identical to the bus API of the same
355 * name; refer to BUS_DEACTIVATE_RESOURCE for complete documentation.
356 */
357METHOD int deactivate_resource {
358        device_t dev;
359        device_t child;
360        int type;
361	int rid;
362        struct bhnd_resource *r;
363} DEFAULT bhnd_bus_generic_deactivate_resource;
364
365/**
366 * Return true if @p region_num is a valid region on @p port_num of
367 * @p type attached to @p child.
368 *
369 * @param dev The device whose child is being examined.
370 * @param child The child device.
371 * @param type The port type being queried.
372 * @param port_num The port number being queried.
373 * @param region_num The region number being queried.
374 */
375METHOD bool is_region_valid {
376	device_t dev;
377	device_t child;
378	bhnd_port_type type;
379	u_int port_num;
380	u_int region_num;
381};
382
383/**
384 * Return the number of ports of type @p type attached to @p child.
385 *
386 * @param dev The device whose child is being examined.
387 * @param child The child device.
388 * @param type The port type being queried.
389 */
390METHOD u_int get_port_count {
391	device_t dev;
392	device_t child;
393	bhnd_port_type type;
394};
395
396/**
397 * Return the number of memory regions mapped to @p child @p port of
398 * type @p type.
399 *
400 * @param dev The device whose child is being examined.
401 * @param child The child device.
402 * @param port The port number being queried.
403 * @param type The port type being queried.
404 */
405METHOD u_int get_region_count {
406	device_t dev;
407	device_t child;
408	bhnd_port_type type;
409	u_int port;
410};
411
412/**
413 * Return the SYS_RES_MEMORY resource-ID for a port/region pair attached to
414 * @p child.
415 *
416 * @param dev The bus device.
417 * @param child The bhnd child.
418 * @param port_type The port type.
419 * @param port_num The index of the child interconnect port.
420 * @param region_num The index of the port-mapped address region.
421 *
422 * @retval -1 No such port/region found.
423 */
424METHOD int get_port_rid {
425	device_t dev;
426	device_t child;
427	bhnd_port_type port_type;
428	u_int port_num;
429	u_int region_num;
430} DEFAULT bhnd_bus_null_get_port_rid;
431
432
433/**
434 * Decode a port / region pair on @p child defined by @p type and @p rid.
435 *
436 * @param dev The bus device.
437 * @param child The bhnd child.
438 * @param type The resource type.
439 * @param rid The resource ID.
440 * @param[out] port_type The port's type.
441 * @param[out] port The port identifier.
442 * @param[out] region The identifier of the memory region on @p port.
443 *
444 * @retval 0 success
445 * @retval non-zero No matching type/rid found.
446 */
447METHOD int decode_port_rid {
448	device_t dev;
449	device_t child;
450	int type;
451	int rid;
452	bhnd_port_type *port_type;
453	u_int *port;
454	u_int *region;
455} DEFAULT bhnd_bus_null_decode_port_rid;
456
457/**
458 * Get the address and size of @p region on @p port.
459 *
460 * @param dev The bus device.
461 * @param child The bhnd child.
462 * @param port_type The port type.
463 * @param port The port identifier.
464 * @param region The identifier of the memory region on @p port.
465 * @param[out] region_addr The region's base address.
466 * @param[out] region_size The region's size.
467 *
468 * @retval 0 success
469 * @retval non-zero No matching port/region found.
470 */
471METHOD int get_region_addr {
472	device_t dev;
473	device_t child;
474	bhnd_port_type port_type;
475	u_int port;
476	u_int region;
477	bhnd_addr_t *region_addr;
478	bhnd_size_t *region_size;
479} DEFAULT bhnd_bus_null_get_region_addr;
480
481/**
482 * Read an NVRAM variable.
483 *
484 * It is the responsibility of the bus to delegate this request to
485 * the appropriate NVRAM child device, or to a parent bus implementation.
486 *
487 * @param		dev	The bus device.
488 * @param		child	The requesting device.
489 * @param		name	The NVRAM variable name.
490 * @param[out]		buf	On success, the requested value will be written
491 *				to this buffer. This argment may be NULL if
492 *				the value is not desired.
493 * @param[in,out]	size	The capacity of @p buf. On success, will be set
494 *				to the actual size of the requested value.
495 *
496 * @retval 0		success
497 * @retval ENOENT	The requested variable was not found.
498 * @retval ENOMEM	If @p buf is non-NULL and a buffer of @p size is too
499 *			small to hold the requested value.
500 * @retval ENODEV	No valid NVRAM source could be found.
501 * @retval non-zero	If reading @p name otherwise fails, a regular unix
502 *			error code will be returned.
503 */
504METHOD int get_nvram_var {
505	device_t	 dev;
506	device_t	 child;
507	const char	*name;
508	void		*buf;
509	size_t		*size;
510} DEFAULT bhnd_bus_null_get_nvram_var;
511
512
513/** An implementation of bus_read_1() compatible with bhnd_resource */
514METHOD uint8_t read_1 {
515	device_t dev;
516	device_t child;
517	struct bhnd_resource *r;
518	bus_size_t offset;
519}
520
521/** An implementation of bus_read_2() compatible with bhnd_resource */
522METHOD uint16_t read_2 {
523	device_t dev;
524	device_t child;
525	struct bhnd_resource *r;
526	bus_size_t offset;
527}
528
529/** An implementation of bus_read_4() compatible with bhnd_resource */
530METHOD uint32_t read_4 {
531	device_t dev;
532	device_t child;
533	struct bhnd_resource *r;
534	bus_size_t offset;
535}
536
537/** An implementation of bus_write_1() compatible with bhnd_resource */
538METHOD void write_1 {
539	device_t dev;
540	device_t child;
541	struct bhnd_resource *r;
542	bus_size_t offset;
543	uint8_t value;
544}
545
546/** An implementation of bus_write_2() compatible with bhnd_resource */
547METHOD void write_2 {
548	device_t dev;
549	device_t child;
550	struct bhnd_resource *r;
551	bus_size_t offset;
552	uint16_t value;
553}
554
555/** An implementation of bus_write_4() compatible with bhnd_resource */
556METHOD void write_4 {
557	device_t dev;
558	device_t child;
559	struct bhnd_resource *r;
560	bus_size_t offset;
561	uint32_t value;
562}
563
564/** An implementation of bus_read_stream_1() compatible with bhnd_resource */
565METHOD uint8_t read_stream_1 {
566	device_t dev;
567	device_t child;
568	struct bhnd_resource *r;
569	bus_size_t offset;
570}
571
572/** An implementation of bus_read_stream_2() compatible with bhnd_resource */
573METHOD uint16_t read_stream_2 {
574	device_t dev;
575	device_t child;
576	struct bhnd_resource *r;
577	bus_size_t offset;
578}
579
580/** An implementation of bus_read_stream_4() compatible with bhnd_resource */
581METHOD uint32_t read_stream_4 {
582	device_t dev;
583	device_t child;
584	struct bhnd_resource *r;
585	bus_size_t offset;
586}
587
588/** An implementation of bus_write_stream_1() compatible with bhnd_resource */
589METHOD void write_stream_1 {
590	device_t dev;
591	device_t child;
592	struct bhnd_resource *r;
593	bus_size_t offset;
594	uint8_t value;
595}
596
597/** An implementation of bus_write_stream_2() compatible with bhnd_resource */
598METHOD void write_stream_2 {
599	device_t dev;
600	device_t child;
601	struct bhnd_resource *r;
602	bus_size_t offset;
603	uint16_t value;
604}
605
606/** An implementation of bus_write_stream_4() compatible with bhnd_resource */
607METHOD void write_stream_4 {
608	device_t dev;
609	device_t child;
610	struct bhnd_resource *r;
611	bus_size_t offset;
612	uint32_t value;
613}
614
615/** An implementation of bus_read_multi_1() compatible with bhnd_resource */
616METHOD void read_multi_1 {
617	device_t dev;
618	device_t child;
619	struct bhnd_resource *r;
620	bus_size_t offset;
621	uint8_t *datap;
622	bus_size_t count;
623}
624
625/** An implementation of bus_read_multi_2() compatible with bhnd_resource */
626METHOD void read_multi_2 {
627	device_t dev;
628	device_t child;
629	struct bhnd_resource *r;
630	bus_size_t offset;
631	uint16_t *datap;
632	bus_size_t count;
633}
634
635/** An implementation of bus_read_multi_4() compatible with bhnd_resource */
636METHOD void read_multi_4 {
637	device_t dev;
638	device_t child;
639	struct bhnd_resource *r;
640	bus_size_t offset;
641	uint32_t *datap;
642	bus_size_t count;
643}
644
645/** An implementation of bus_write_multi_1() compatible with bhnd_resource */
646METHOD void write_multi_1 {
647	device_t dev;
648	device_t child;
649	struct bhnd_resource *r;
650	bus_size_t offset;
651	uint8_t *datap;
652	bus_size_t count;
653}
654
655/** An implementation of bus_write_multi_2() compatible with bhnd_resource */
656METHOD void write_multi_2 {
657	device_t dev;
658	device_t child;
659	struct bhnd_resource *r;
660	bus_size_t offset;
661	uint16_t *datap;
662	bus_size_t count;
663}
664
665/** An implementation of bus_write_multi_4() compatible with bhnd_resource */
666METHOD void write_multi_4 {
667	device_t dev;
668	device_t child;
669	struct bhnd_resource *r;
670	bus_size_t offset;
671	uint32_t *datap;
672	bus_size_t count;
673}
674
675/** An implementation of bus_read_multi_stream_1() compatible
676 *  bhnd_resource */
677METHOD void read_multi_stream_1 {
678	device_t dev;
679	device_t child;
680	struct bhnd_resource *r;
681	bus_size_t offset;
682	uint8_t *datap;
683	bus_size_t count;
684}
685
686/** An implementation of bus_read_multi_stream_2() compatible
687 *  bhnd_resource */
688METHOD void read_multi_stream_2 {
689	device_t dev;
690	device_t child;
691	struct bhnd_resource *r;
692	bus_size_t offset;
693	uint16_t *datap;
694	bus_size_t count;
695}
696
697/** An implementation of bus_read_multi_stream_4() compatible
698 *  bhnd_resource */
699METHOD void read_multi_stream_4 {
700	device_t dev;
701	device_t child;
702	struct bhnd_resource *r;
703	bus_size_t offset;
704	uint32_t *datap;
705	bus_size_t count;
706}
707
708/** An implementation of bus_write_multi_stream_1() compatible
709 *  bhnd_resource */
710METHOD void write_multi_stream_1 {
711	device_t dev;
712	device_t child;
713	struct bhnd_resource *r;
714	bus_size_t offset;
715	uint8_t *datap;
716	bus_size_t count;
717}
718
719/** An implementation of bus_write_multi_stream_2() compatible with
720 *  bhnd_resource */
721METHOD void write_multi_stream_2 {
722	device_t dev;
723	device_t child;
724	struct bhnd_resource *r;
725	bus_size_t offset;
726	uint16_t *datap;
727	bus_size_t count;
728}
729
730/** An implementation of bus_write_multi_stream_4() compatible with
731 *  bhnd_resource */
732METHOD void write_multi_stream_4 {
733	device_t dev;
734	device_t child;
735	struct bhnd_resource *r;
736	bus_size_t offset;
737	uint32_t *datap;
738	bus_size_t count;
739}
740
741/** An implementation of bus_set_multi_1() compatible with bhnd_resource */
742METHOD void set_multi_1 {
743	device_t dev;
744	device_t child;
745	struct bhnd_resource *r;
746	bus_size_t offset;
747	uint8_t value;
748	bus_size_t count;
749}
750
751/** An implementation of bus_set_multi_2() compatible with bhnd_resource */
752METHOD void set_multi_2 {
753	device_t dev;
754	device_t child;
755	struct bhnd_resource *r;
756	bus_size_t offset;
757	uint16_t value;
758	bus_size_t count;
759}
760
761/** An implementation of bus_set_multi_4() compatible with bhnd_resource */
762METHOD void set_multi_4 {
763	device_t dev;
764	device_t child;
765	struct bhnd_resource *r;
766	bus_size_t offset;
767	uint32_t value;
768	bus_size_t count;
769}
770
771/** An implementation of bus_set_region_1() compatible with bhnd_resource */
772METHOD void set_region_1 {
773	device_t dev;
774	device_t child;
775	struct bhnd_resource *r;
776	bus_size_t offset;
777	uint8_t value;
778	bus_size_t count;
779}
780
781/** An implementation of bus_set_region_2() compatible with bhnd_resource */
782METHOD void set_region_2 {
783	device_t dev;
784	device_t child;
785	struct bhnd_resource *r;
786	bus_size_t offset;
787	uint16_t value;
788	bus_size_t count;
789}
790
791/** An implementation of bus_set_region_4() compatible with bhnd_resource */
792METHOD void set_region_4 {
793	device_t dev;
794	device_t child;
795	struct bhnd_resource *r;
796	bus_size_t offset;
797	uint32_t value;
798	bus_size_t count;
799}
800
801/** An implementation of bus_read_region_1() compatible with bhnd_resource */
802METHOD void read_region_1 {
803	device_t dev;
804	device_t child;
805	struct bhnd_resource *r;
806	bus_size_t offset;
807	uint8_t *datap;
808	bus_size_t count;
809}
810
811/** An implementation of bus_read_region_2() compatible with bhnd_resource */
812METHOD void read_region_2 {
813	device_t dev;
814	device_t child;
815	struct bhnd_resource *r;
816	bus_size_t offset;
817	uint16_t *datap;
818	bus_size_t count;
819}
820
821/** An implementation of bus_read_region_4() compatible with bhnd_resource */
822METHOD void read_region_4 {
823	device_t dev;
824	device_t child;
825	struct bhnd_resource *r;
826	bus_size_t offset;
827	uint32_t *datap;
828	bus_size_t count;
829}
830
831/** An implementation of bus_read_region_stream_1() compatible with
832  * bhnd_resource */
833METHOD void read_region_stream_1 {
834	device_t dev;
835	device_t child;
836	struct bhnd_resource *r;
837	bus_size_t offset;
838	uint8_t *datap;
839	bus_size_t count;
840}
841
842/** An implementation of bus_read_region_stream_2() compatible with
843  * bhnd_resource */
844METHOD void read_region_stream_2 {
845	device_t dev;
846	device_t child;
847	struct bhnd_resource *r;
848	bus_size_t offset;
849	uint16_t *datap;
850	bus_size_t count;
851}
852
853/** An implementation of bus_read_region_stream_4() compatible with
854  * bhnd_resource */
855METHOD void read_region_stream_4 {
856	device_t dev;
857	device_t child;
858	struct bhnd_resource *r;
859	bus_size_t offset;
860	uint32_t *datap;
861	bus_size_t count;
862}
863
864/** An implementation of bus_write_region_1() compatible with bhnd_resource */
865METHOD void write_region_1 {
866	device_t dev;
867	device_t child;
868	struct bhnd_resource *r;
869	bus_size_t offset;
870	uint8_t *datap;
871	bus_size_t count;
872}
873
874/** An implementation of bus_write_region_2() compatible with bhnd_resource */
875METHOD void write_region_2 {
876	device_t dev;
877	device_t child;
878	struct bhnd_resource *r;
879	bus_size_t offset;
880	uint16_t *datap;
881	bus_size_t count;
882}
883
884/** An implementation of bus_write_region_4() compatible with bhnd_resource */
885METHOD void write_region_4 {
886	device_t dev;
887	device_t child;
888	struct bhnd_resource *r;
889	bus_size_t offset;
890	uint32_t *datap;
891	bus_size_t count;
892}
893
894/** An implementation of bus_write_region_stream_1() compatible with
895  * bhnd_resource */
896METHOD void write_region_stream_1 {
897	device_t dev;
898	device_t child;
899	struct bhnd_resource *r;
900	bus_size_t offset;
901	uint8_t *datap;
902	bus_size_t count;
903}
904
905/** An implementation of bus_write_region_stream_2() compatible with
906  * bhnd_resource */
907METHOD void write_region_stream_2 {
908	device_t dev;
909	device_t child;
910	struct bhnd_resource *r;
911	bus_size_t offset;
912	uint16_t *datap;
913	bus_size_t count;
914}
915
916/** An implementation of bus_write_region_stream_4() compatible with
917  * bhnd_resource */
918METHOD void write_region_stream_4 {
919	device_t dev;
920	device_t child;
921	struct bhnd_resource *r;
922	bus_size_t offset;
923	uint32_t *datap;
924	bus_size_t count;
925}
926
927/** An implementation of bus_barrier() compatible with bhnd_resource */
928METHOD void barrier {
929	device_t dev;
930	device_t child;
931	struct bhnd_resource *r;
932	bus_size_t offset;
933	bus_size_t length;
934	int flags;
935}
936