1/* 2 * Copyright 2004-2008, Haiku Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT license. 4 */ 5#ifndef _DEVICE_MANAGER_H 6#define _DEVICE_MANAGER_H 7 8 9#include <TypeConstants.h> 10#include <Drivers.h> 11#include <module.h> 12 13 14/* type of I/O resource */ 15enum { 16 B_IO_MEMORY = 1, 17 B_IO_PORT = 2, 18 B_ISA_DMA_CHANNEL = 3 19}; 20 21 22/* I/O resource description */ 23typedef struct { 24 uint32 type; 25 /* type of I/O resource */ 26 27 uint32 base; 28 /* I/O memory: first physical address (32 bit) 29 * I/O port: first port address (16 bit) 30 * ISA DMA channel: channel number (0-7) 31 */ 32 33 uint32 length; 34 /* I/O memory: size of address range (32 bit) 35 * I/O port: size of port range (16 bit) 36 * ISA DMA channel: must be 1 37 */ 38} io_resource; 39 40/* attribute of a device node */ 41typedef struct { 42 const char *name; 43 type_code type; /* for supported types, see value */ 44 union { 45 uint8 ui8; /* B_UINT8_TYPE */ 46 uint16 ui16; /* B_UINT16_TYPE */ 47 uint32 ui32; /* B_UINT32_TYPE */ 48 uint64 ui64; /* B_UINT64_TYPE */ 49 const char *string; /* B_STRING_TYPE */ 50 struct { /* B_RAW_TYPE */ 51 const void *data; 52 size_t length; 53 } raw; 54 } value; 55} device_attr; 56 57 58typedef struct device_node device_node; 59typedef struct driver_module_info driver_module_info; 60 61 62/* interface of the device manager */ 63 64typedef struct device_manager_info { 65 module_info info; 66 67 status_t (*rescan_node)(device_node *node); 68 69 status_t (*register_node)(device_node *parent, const char *moduleName, 70 const device_attr *attrs, const io_resource *ioResources, 71 device_node **_node); 72 status_t (*unregister_node)(device_node *node); 73 74 status_t (*get_driver)(device_node *node, driver_module_info **_module, 75 void **_cookie); 76 77 device_node *(*get_root_node)(); 78 status_t (*get_next_child_node)(device_node *parent, 79 const device_attr *attrs, device_node **node); 80 device_node *(*get_parent_node)(device_node *node); 81 void (*put_node)(device_node *node); 82 83 status_t (*publish_device)(device_node *node, const char *path, 84 const char *deviceModuleName); 85 status_t (*unpublish_device)(device_node *node, const char *path); 86 87#if 0 88 status_t (*acquire_io_resources)(io_resource *resources); 89 status_t (*release_io_resources)(const io_resource *resources); 90 91 int32 (*create_id)(const char *generator); 92 status_t (*free_id)(const char *generator, uint32 id); 93#endif 94 95 status_t (*get_attr_uint8)(const device_node *node, const char *name, 96 uint8 *value, bool recursive); 97 status_t (*get_attr_uint16)(const device_node *node, const char *name, 98 uint16 *value, bool recursive); 99 status_t (*get_attr_uint32)(const device_node *node, const char *name, 100 uint32 *value, bool recursive); 101 status_t (*get_attr_uint64)(const device_node *node, const char *name, 102 uint64 *value, bool recursive); 103 status_t (*get_attr_string)(const device_node *node, const char *name, 104 const char **_value, bool recursive); 105 status_t (*get_attr_raw)(const device_node *node, const char *name, 106 const void **_data, size_t *_size, bool recursive); 107 108 status_t (*get_next_attr)(device_node *node, device_attr **_attr); 109} device_manager_info; 110 111 112#define B_DEVICE_MANAGER_MODULE_NAME "system/device_manager/v1" 113 114 115/* interface of device driver */ 116 117struct driver_module_info { 118 module_info info; 119 120 float (*supports_device)(device_node *parent); 121 status_t (*register_device)(device_node *parent); 122 123 status_t (*init_driver)(device_node *node, void **_driverCookie); 124 void (*uninit_driver)(void *driverCookie); 125 status_t (*register_child_devices)(void *driverCookie); 126 status_t (*rescan_child_devices)(void *driverCookie); 127 128 void (*device_removed)(void *driverCookie); 129 status_t (*suspend)(void *driverCookie, int32 state); 130 status_t (*resume)(void *driverCookie); 131}; 132 133 134/* standard device node attributes */ 135 136#define B_DEVICE_PRETTY_NAME "device/pretty name" /* string */ 137#define B_DEVICE_MAPPING "device/mapping" /* string */ 138#define B_DEVICE_BUS "device/bus" /* string */ 139#define B_DEVICE_FIXED_CHILD "device/fixed child" /* string */ 140#define B_DEVICE_FLAGS "device/flags" /* uint32 */ 141 142#define B_DEVICE_VENDOR_ID "device/vendor" /* uint16 */ 143#define B_DEVICE_ID "device/id" /* uint16 */ 144#define B_DEVICE_TYPE "device/type" 145 /* uint16, PCI base class */ 146#define B_DEVICE_SUB_TYPE "device/subtype" 147 /* uint16, PCI sub type */ 148#define B_DEVICE_INTERFACE "device/interface" 149 /* uint16, PCI class API */ 150 151#define B_DEVICE_UNIQUE_ID "device/unique id" /* string */ 152 153/* device flags */ 154#define B_FIND_CHILD_ON_DEMAND 0x01 155#define B_FIND_MULTIPLE_CHILDREN 0x02 156#define B_KEEP_DRIVER_LOADED 0x04 157 158 159/* interface of device */ 160 161typedef struct io_request io_request; 162 163struct device_module_info { 164 module_info info; 165 166 status_t (*init_device)(void *driverCookie, void **_deviceCookie); 167 void (*uninit_device)(void *deviceCookie); 168 void (*device_removed)(void *deviceCookie); 169 170 status_t (*device_open)(void *deviceCookie, int openMode, void **_cookie); 171 status_t (*device_close)(void *cookie); 172 status_t (*device_free)(void *cookie); 173 status_t (*device_read)(void *cookie, off_t pos, void *buffer, 174 size_t *_length); 175 status_t (*device_write)(void *cookie, off_t pos, const void *buffer, 176 size_t *_length); 177 status_t (*device_ioctl)(void *cookie, int32 op, void *buffer, 178 size_t length); 179 status_t (*device_io)(void *cookie, io_request *request); 180}; 181 182extern struct device_manager_info *gDeviceManager; 183 184#endif /* _DEVICE_MANAGER_H */ 185