10010e23aSHasso Tepper /*- 20010e23aSHasso Tepper * Copyright (c) 2000 Michael Smith 30010e23aSHasso Tepper * Copyright (c) 2000 BSDi 40010e23aSHasso Tepper * All rights reserved. 50010e23aSHasso Tepper * 60010e23aSHasso Tepper * Redistribution and use in source and binary forms, with or without 70010e23aSHasso Tepper * modification, are permitted provided that the following conditions 80010e23aSHasso Tepper * are met: 90010e23aSHasso Tepper * 1. Redistributions of source code must retain the above copyright 100010e23aSHasso Tepper * notice, this list of conditions and the following disclaimer. 110010e23aSHasso Tepper * 2. Redistributions in binary form must reproduce the above copyright 120010e23aSHasso Tepper * notice, this list of conditions and the following disclaimer in the 130010e23aSHasso Tepper * documentation and/or other materials provided with the distribution. 140010e23aSHasso Tepper * 150010e23aSHasso Tepper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 160010e23aSHasso Tepper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 170010e23aSHasso Tepper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 180010e23aSHasso Tepper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 190010e23aSHasso Tepper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 200010e23aSHasso Tepper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 210010e23aSHasso Tepper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 220010e23aSHasso Tepper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 230010e23aSHasso Tepper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 240010e23aSHasso Tepper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 250010e23aSHasso Tepper * SUCH DAMAGE. 260010e23aSHasso Tepper * 270010e23aSHasso Tepper * $FreeBSD: src/lib/libdevinfo/devinfo.h,v 1.5 2005/08/31 14:57:39 rodrigc Exp $ 280010e23aSHasso Tepper */ 290010e23aSHasso Tepper 300010e23aSHasso Tepper #ifndef _DEVINFO_H_INCLUDED 310010e23aSHasso Tepper #define _DEVINFO_H_INCLUDED 320010e23aSHasso Tepper 330010e23aSHasso Tepper #include <sys/cdefs.h> 340010e23aSHasso Tepper #include <sys/types.h> 35*feaf0601SSascha Wildner #define _KERNEL_STRUCTURES /* for enum device_state */ 36*feaf0601SSascha Wildner #include <sys/bus.h> 370010e23aSHasso Tepper 380010e23aSHasso Tepper typedef __uintptr_t devinfo_handle_t; 390010e23aSHasso Tepper #define DEVINFO_ROOT_DEVICE ((devinfo_handle_t)0) 400010e23aSHasso Tepper 41*feaf0601SSascha Wildner typedef enum device_state devinfo_state_t; 420010e23aSHasso Tepper 430010e23aSHasso Tepper struct devinfo_dev { 440010e23aSHasso Tepper devinfo_handle_t dd_handle; /* device handle */ 450010e23aSHasso Tepper devinfo_handle_t dd_parent; /* parent handle */ 460010e23aSHasso Tepper 470010e23aSHasso Tepper char *dd_name; /* name of device */ 480010e23aSHasso Tepper char *dd_desc; /* device description */ 490010e23aSHasso Tepper char *dd_drivername; /* name of attached driver*/ 500010e23aSHasso Tepper char *dd_pnpinfo; /* pnp info from parent bus */ 510010e23aSHasso Tepper char *dd_location; /* Where bus thinks dev at */ 520010e23aSHasso Tepper uint32_t dd_devflags; /* API flags */ 530010e23aSHasso Tepper uint16_t dd_flags; /* internal dev flags */ 549f05f13fSImre Vadász #define DIF_ENABLED 0x0001 /* device should be probed/attached */ 559f05f13fSImre Vadász devinfo_state_t dd_state; /* attachement state of dev */ 560010e23aSHasso Tepper }; 570010e23aSHasso Tepper 580010e23aSHasso Tepper struct devinfo_rman { 590010e23aSHasso Tepper devinfo_handle_t dm_handle; /* resource manager handle */ 600010e23aSHasso Tepper 610010e23aSHasso Tepper unsigned long dm_start; /* resource start */ 620010e23aSHasso Tepper unsigned long dm_size; /* resource size */ 630010e23aSHasso Tepper 640010e23aSHasso Tepper char *dm_desc; /* resource description */ 650010e23aSHasso Tepper }; 660010e23aSHasso Tepper 670010e23aSHasso Tepper struct devinfo_res { 680010e23aSHasso Tepper devinfo_handle_t dr_handle; /* resource handle */ 690010e23aSHasso Tepper devinfo_handle_t dr_rman; /* resource manager handle */ 700010e23aSHasso Tepper devinfo_handle_t dr_device; /* owning device */ 710010e23aSHasso Tepper 720010e23aSHasso Tepper unsigned long dr_start; /* region start */ 730010e23aSHasso Tepper unsigned long dr_size; /* region size */ 740010e23aSHasso Tepper /* XXX add flags */ 750010e23aSHasso Tepper }; 760010e23aSHasso Tepper 770010e23aSHasso Tepper __BEGIN_DECLS 780010e23aSHasso Tepper 790010e23aSHasso Tepper /* 800010e23aSHasso Tepper * Acquire a coherent copy of the kernel's device and resource tables. 810010e23aSHasso Tepper * This must return success (zero) before any other interfaces will 820010e23aSHasso Tepper * function. Sets errno on failure. 830010e23aSHasso Tepper */ 840010e23aSHasso Tepper extern int devinfo_init(void); 850010e23aSHasso Tepper 860010e23aSHasso Tepper /* 870010e23aSHasso Tepper * Release the storage associated with the internal copy of the device 880010e23aSHasso Tepper * and resource tables. devinfo_init must be called before any attempt 890010e23aSHasso Tepper * is made to use any other interfaces. 900010e23aSHasso Tepper */ 910010e23aSHasso Tepper extern void devinfo_free(void); 920010e23aSHasso Tepper 930010e23aSHasso Tepper /* 940010e23aSHasso Tepper * Find a device/resource/resource manager by its handle. 950010e23aSHasso Tepper */ 960010e23aSHasso Tepper extern struct devinfo_dev 970010e23aSHasso Tepper *devinfo_handle_to_device(devinfo_handle_t handle); 980010e23aSHasso Tepper extern struct devinfo_res 990010e23aSHasso Tepper *devinfo_handle_to_resource(devinfo_handle_t handle); 1000010e23aSHasso Tepper extern struct devinfo_rman 1010010e23aSHasso Tepper *devinfo_handle_to_rman(devinfo_handle_t handle); 1020010e23aSHasso Tepper 1030010e23aSHasso Tepper /* 1040010e23aSHasso Tepper * Iterate over the children of a device, calling (fn) on each. If 1050010e23aSHasso Tepper * (fn) returns nonzero, abort the scan and return. 1060010e23aSHasso Tepper */ 1070010e23aSHasso Tepper extern int 1080010e23aSHasso Tepper devinfo_foreach_device_child(struct devinfo_dev *parent, 1090010e23aSHasso Tepper int (* fn)(struct devinfo_dev *child, void *arg), 1100010e23aSHasso Tepper void *arg); 1110010e23aSHasso Tepper 1120010e23aSHasso Tepper /* 1130010e23aSHasso Tepper * Iterate over all the resources owned by a device, calling (fn) on each. 1140010e23aSHasso Tepper * If (fn) returns nonzero, abort the scan and return. 1150010e23aSHasso Tepper */ 1160010e23aSHasso Tepper extern int 1170010e23aSHasso Tepper devinfo_foreach_device_resource(struct devinfo_dev *dev, 1180010e23aSHasso Tepper int (* fn)(struct devinfo_dev *dev, 1190010e23aSHasso Tepper struct devinfo_res *res, void *arg), 1200010e23aSHasso Tepper void *arg); 1210010e23aSHasso Tepper 1220010e23aSHasso Tepper /* 1230010e23aSHasso Tepper * Iterate over all the resources owned by a resource manager, calling (fn) 1240010e23aSHasso Tepper * on each. If (fn) returns nonzero, abort the scan and return. 1250010e23aSHasso Tepper */ 1260010e23aSHasso Tepper extern int 1270010e23aSHasso Tepper devinfo_foreach_rman_resource(struct devinfo_rman *rman, 1280010e23aSHasso Tepper int (* fn)(struct devinfo_res *res, void *arg), 1290010e23aSHasso Tepper void *arg); 1300010e23aSHasso Tepper 1310010e23aSHasso Tepper /* 1320010e23aSHasso Tepper * Iterate over all the resource managers, calling (fn) on each. If (fn) 1330010e23aSHasso Tepper * returns nonzero, abort the scan and return. 1340010e23aSHasso Tepper */ 1350010e23aSHasso Tepper extern int 1360010e23aSHasso Tepper devinfo_foreach_rman(int (* fn)(struct devinfo_rman *rman, void *arg), 1370010e23aSHasso Tepper void *arg); 1380010e23aSHasso Tepper 1390010e23aSHasso Tepper __END_DECLS 1400010e23aSHasso Tepper 1410010e23aSHasso Tepper #endif /* ! _DEVINFO_H_INCLUDED */ 142