1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2000 Michael Smith
5 * Copyright (c) 2000 BSDi
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _DEVINFO_H_INCLUDED
31#define _DEVINFO_H_INCLUDED
32
33#include <sys/types.h>
34#include <sys/bus.h>
35
36typedef __uintptr_t	devinfo_handle_t;
37#define DEVINFO_ROOT_DEVICE	((devinfo_handle_t)0)
38
39typedef enum device_state devinfo_state_t;
40
41struct devinfo_dev {
42	devinfo_handle_t	dd_handle;	/* device handle */
43	devinfo_handle_t	dd_parent;	/* parent handle */
44
45	char			*dd_name;	/* name of device */
46	char			*dd_desc;	/* device description */
47	char			*dd_drivername;	/* name of attached driver*/
48	char			*dd_pnpinfo;	/* pnp info from parent bus */
49	char			*dd_location;	/* Where bus thinks dev at */
50	uint32_t		dd_devflags;	/* API flags */
51	uint16_t		dd_flags;	/* internal dev flags */
52	devinfo_state_t		dd_state;	/* attachment state of dev */
53};
54
55struct devinfo_rman {
56	devinfo_handle_t	dm_handle;	/* resource manager handle */
57
58	rman_res_t		dm_start;	/* resource start */
59	rman_res_t		dm_size;	/* resource size */
60
61	char			*dm_desc;	/* resource description */
62};
63
64struct devinfo_res {
65	devinfo_handle_t	dr_handle;	/* resource handle */
66	devinfo_handle_t	dr_rman;	/* resource manager handle */
67	devinfo_handle_t	dr_device;	/* owning device */
68
69	rman_res_t		dr_start;	/* region start */
70	rman_res_t		dr_size;	/* region size */
71	/* XXX add flags */
72};
73
74__BEGIN_DECLS
75
76/*
77 * Acquire a coherent copy of the kernel's device and resource tables.
78 * This must return success (zero) before any other interfaces will
79 * function.  Sets errno on failure.
80 */
81extern int	devinfo_init(void);
82
83/*
84 * Release the storage associated with the internal copy of the device
85 * and resource tables. devinfo_init must be called before any attempt
86 * is made to use any other interfaces.
87 */
88extern void	devinfo_free(void);
89
90/*
91 * Find a device/resource/resource manager by its handle.
92 */
93extern struct devinfo_dev
94	*devinfo_handle_to_device(devinfo_handle_t handle);
95extern struct devinfo_res
96	*devinfo_handle_to_resource(devinfo_handle_t handle);
97extern struct devinfo_rman
98	*devinfo_handle_to_rman(devinfo_handle_t handle);
99
100/*
101 * Iterate over the children of a device, calling (fn) on each.  If
102 * (fn) returns nonzero, abort the scan and return.
103 */
104extern int
105	devinfo_foreach_device_child(struct devinfo_dev *parent,
106	    int (* fn)(struct devinfo_dev *child, void *arg),
107	    void *arg);
108
109/*
110 * Iterate over all the resources owned by a device, calling (fn) on each.
111 * If (fn) returns nonzero, abort the scan and return.
112 */
113extern int
114	devinfo_foreach_device_resource(struct devinfo_dev *dev,
115	    int (* fn)(struct devinfo_dev *dev,
116	    struct devinfo_res *res, void *arg),
117	    void *arg);
118
119/*
120 * Iterate over all the resources owned by a resource manager, calling (fn)
121 * on each.  If (fn) returns nonzero, abort the scan and return.
122 */
123extern int
124	devinfo_foreach_rman_resource(struct devinfo_rman *rman,
125	    int (* fn)(struct devinfo_res *res, void *arg),
126	    void *arg);
127
128/*
129 * Iterate over all the resource managers, calling (fn) on each.  If (fn)
130 * returns nonzero, abort the scan and return.
131 */
132extern int
133	devinfo_foreach_rman(int (* fn)(struct devinfo_rman *rman, void *arg),
134	    void *arg);
135
136__END_DECLS
137
138#endif /* ! _DEVINFO_H_INCLUDED */
139