Changeset 3843ecb in mainline
- Timestamp:
- 2010-04-09T13:54:06Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 892e4e1
- Parents:
- 3a5909f
- Location:
- uspace
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/device/hw_res.c
r3a5909f r3843ecb 37 37 #include <async.h> 38 38 #include <malloc.h> 39 40 39 41 40 bool get_hw_resources(int dev_phone, hw_resource_list_t *hw_resources) 42 41 { 43 42 ipcarg_t count = 0; 44 int rc = async_req_1_1(dev_phone, HW_RES_DEV_IFACE, GET_RESOURCE_LIST, &count);43 int rc = async_req_1_1(dev_phone, DEV_IFACE_ID(HW_RES_DEV_IFACE), GET_RESOURCE_LIST, &count); 45 44 hw_resources->count = count; 46 45 if (EOK != rc) { … … 66 65 bool enable_interrupt(int dev_phone) 67 66 { 68 int rc = async_req_1_0(dev_phone, HW_RES_DEV_IFACE, ENABLE_INTERRUPT);67 int rc = async_req_1_0(dev_phone, DEV_IFACE_ID(HW_RES_DEV_IFACE), ENABLE_INTERRUPT); 69 68 return rc == EOK; 70 69 } -
uspace/lib/libc/include/device/hw_res.h
r3a5909f r3843ecb 39 39 #include <bool.h> 40 40 41 /** HW resource (e.g. interrupt, memory register, i/o register etc.). */ 42 typedef struct hw_resource { 43 hw_res_type_t type; 44 union { 45 struct { 46 uint64_t address; 47 endianness_t endianness; 48 size_t size; 49 } mem_range; 50 struct { 51 uint64_t address; 52 endianness_t endianness; 53 size_t size; 54 } io_range; 55 struct { 56 int irq; 57 } interrupt; 58 } res; 59 } hw_resource_t; 60 61 typedef struct hw_resource_list { 62 size_t count; 63 hw_resource_t *resources; 64 } hw_resource_list_t; 65 66 static inline void clean_hw_resource_list(hw_resource_list_t *hw_res) 67 { 68 if(NULL != hw_res->resources) { 69 free(hw_res->resources); 70 hw_res->resources = NULL; 71 } 72 hw_res->count = 0; 73 } 74 41 75 42 76 bool get_hw_resources(int dev_phone, hw_resource_list_t *hw_resources); -
uspace/lib/libc/include/ipc/dev_iface.h
r3a5909f r3843ecb 35 35 #include <libarch/types.h> 36 36 37 #define DEV_IFACE_FIRST IPC_FIRST_USER_METHOD38 39 37 typedef enum { 40 HW_RES_DEV_IFACE = DEV_IFACE_FIRST,38 HW_RES_DEV_IFACE = 0, 41 39 // TODO add more interfaces 42 40 DEV_IFACE_MAX 43 } dev_inferface_id _t;41 } dev_inferface_idx_t; 44 42 43 #define DEV_IFACE_ID(idx) ((idx) + IPC_FIRST_USER_METHOD) 44 #define DEV_IFACE_IDX(id) ((id) - IPC_FIRST_USER_METHOD) 45 45 46 #define DEV_IFACE_COUNT (DEV_IFACE_MAX - DEV_IFACE_FIRST)46 #define DEV_IFACE_COUNT DEV_IFACE_MAX 47 47 48 49 // data types related to some interface - TODO move this to separate header files50 48 51 49 … … 69 67 } endianness_t; 70 68 71 /** HW resource (e.g. interrupt, memory register, i/o register etc.). */72 typedef struct hw_resource {73 hw_res_type_t type;74 union {75 struct {76 uint64_t address;77 endianness_t endianness;78 size_t size;79 } mem_range;80 struct {81 uint64_t address;82 endianness_t endianness;83 size_t size;84 } io_range;85 struct {86 int irq;87 } interrupt;88 } res;89 } hw_resource_t;90 91 typedef struct hw_resource_list {92 size_t count;93 hw_resource_t *resources;94 } hw_resource_list_t;95 96 static inline void clean_hw_resource_list(hw_resource_list_t *hw_res)97 {98 if(NULL != hw_res->resources) {99 free(hw_res->resources);100 hw_res->resources = NULL;101 }102 hw_res->count = 0;103 }104 105 69 #endif -
uspace/lib/libdrv/generic/dev_iface.c
r3a5909f r3843ecb 45 45 }; 46 46 47 remote_iface_t* get_remote_iface(dev_inferface_id_t id) 48 { 49 assert(is_valid_iface_id(id)); 50 51 int idx = get_iface_index(id); 47 remote_iface_t* get_remote_iface(int idx) 48 { 49 assert(is_valid_iface_idx(idx)); 52 50 return remote_ifaces.ifaces[idx]; 53 51 } -
uspace/lib/libdrv/generic/driver.c
r3a5909f r3843ecb 177 177 callid = async_get_call(&call); 178 178 ipcarg_t method = IPC_GET_METHOD(call); 179 int iface_idx; 180 179 181 switch (method) { 180 182 case IPC_M_PHONE_HUNGUP: … … 184 186 ipc_answer_0(callid, EOK); 185 187 return; 186 default: 187 188 if (!is_valid_iface_id(method)) { 188 default: 189 // convert ipc interface id to interface index 190 191 iface_idx = DEV_IFACE_IDX(method); 192 193 if (!is_valid_iface_idx(iface_idx)) { 189 194 // this is not device's interface 190 195 printf("%s: driver_connection_gen error - invalid interface id %x.", driver->name, method); … … 196 201 197 202 // get the device interface structure 198 void *iface = device_get_iface(dev, method);203 void *iface = device_get_iface(dev, iface_idx); 199 204 if (NULL == iface) { 200 205 printf("%s: driver_connection_gen error - ", driver->name); … … 205 210 206 211 // get the corresponding interface for remote request handling ("remote interface") 207 remote_iface_t* rem_iface = get_remote_iface( method);212 remote_iface_t* rem_iface = get_remote_iface(iface_idx); 208 213 assert(NULL != rem_iface); 209 214 -
uspace/lib/libdrv/include/driver.h
r3a5909f r3843ecb 39 39 #include <ipc/devman.h> 40 40 #include <ipc/dev_iface.h> 41 #include <device/hw_res.h> 41 42 #include <assert.h> 42 43 … … 59 60 } iface_dipatch_table_t; 60 61 61 static inline int get_iface_index(dev_inferface_id_t id) 62 63 static inline bool is_valid_iface_idx(int idx) 62 64 { 63 return id - DEV_IFACE_FIRST;65 return 0 <= idx && idx < DEV_IFACE_MAX; 64 66 } 65 67 66 static inline bool is_valid_iface_id(dev_inferface_id_t id) 67 { 68 return DEV_IFACE_FIRST <= id && id < DEV_IFACE_MAX; 69 } 68 remote_iface_t* get_remote_iface(int idx); 69 remote_iface_func_ptr_t get_remote_method(remote_iface_t *rem_iface, ipcarg_t iface_method_idx); 70 70 71 remote_iface_t* get_remote_iface(dev_inferface_id_t id); 72 remote_iface_func_ptr_t get_remote_method(remote_iface_t *rem_iface, ipcarg_t iface_method_idx); 71 72 // device class 73 74 /** Devices belonging to the same class should implement the same set of interfaces.*/ 75 typedef struct device_class { 76 /** Unique identification of the class. */ 77 int id; 78 /** The table of interfaces implemented by the device. */ 79 void *interfaces[DEV_IFACE_COUNT]; 80 } device_class_t; 73 81 74 82 … … 89 97 /** The device driver's data associated with this device.*/ 90 98 void *driver_data; 91 /** The table of interfaces exported by this device.*/92 void *interfaces[DEV_IFACE_COUNT];99 /** Device class consist of class id and table of interfaces supported by the device.*/ 100 device_class_t *class; 93 101 /** Pointer to the previous and next device in the list of devices handled by the driver */ 94 102 link_t link; … … 146 154 } 147 155 148 static inline void device_set_iface (device_t *dev, dev_inferface_id_t id, void *iface)156 static inline void * device_get_iface(device_t *dev, dev_inferface_idx_t idx) 149 157 { 150 assert(is_valid_iface_id (id));158 assert(is_valid_iface_idx(idx)); 151 159 152 int idx = get_iface_index(id); 153 dev->interfaces[idx] = iface; 154 } 155 156 static inline void * device_get_iface(device_t *dev, dev_inferface_id_t id) 157 { 158 assert(is_valid_iface_id(id)); 159 160 int idx = get_iface_index(id); 161 return dev->interfaces[idx]; 160 return dev->class->interfaces[idx]; 162 161 } 163 162 -
uspace/srv/devman/main.c
r3a5909f r3843ecb 121 121 } 122 122 123 /** 124 * Receive device match ID from the device's parent driver and add it to the list of devices match ids. 125 * 126 * @param match_ids the list of the device's match ids. 127 * 128 * @return 0 on success, negative error code otherwise. 129 */ 123 130 static int devman_receive_match_id(match_id_list_t *match_ids) { 124 131 … … 159 166 } 160 167 168 /** 169 * Receive device match IDs from the device's parent driver 170 * and add them to the list of devices match ids. 171 * 172 * @param match_count the number of device's match ids to be received. 173 * @param match_ids the list of the device's match ids. 174 * 175 * @return 0 on success, negative error code otherwise. 176 */ 161 177 static int devman_receive_match_ids(ipcarg_t match_count, match_id_list_t *match_ids) 162 178 { … … 171 187 } 172 188 173 static void devman_add_child(ipc_callid_t callid, ipc_call_t *call, driver_t *driver) 189 /** Handle child device registration. 190 * 191 * Child devices are registered by their parent's device driver. 192 */ 193 static void devman_add_child(ipc_callid_t callid, ipc_call_t *call) 174 194 { 175 195 // printf(NAME ": devman_add_child\n"); … … 211 231 } 212 232 233 /** 234 * Initialize driver which has registered itself as running and ready. 235 * 236 * The initialization is done in a separate fibril to avoid deadlocks 237 * (if the driver needed to be served by devman during the driver's initialization). 238 */ 213 239 static int init_running_drv(void *drv) 214 240 { … … 219 245 } 220 246 221 /** Function for handling connections to device manager. 222 * 247 /** Function for handling connections from a driver to the device manager. 223 248 */ 224 249 static void devman_connection_driver(ipc_callid_t iid, ipc_call_t *icall) … … 231 256 return; 232 257 258 // Initialize the driver as running (e.g. pass assigned devices to it) in a separate fibril; 259 // the separate fibril is used to enable the driver 260 // to use devman service during the driver's initialization. 233 261 fid_t fid = fibril_create(init_running_drv, driver); 234 262 if (fid == 0) { 235 263 printf(NAME ": Error creating fibril for the initialization of the newly registered running driver.\n"); 236 exit(1);264 return; 237 265 } 238 266 fibril_add_ready(fid); … … 254 282 continue; 255 283 case DEVMAN_ADD_CHILD_DEVICE: 256 devman_add_child(callid, &call , driver);284 devman_add_child(callid, &call); 257 285 break; 258 286 default: … … 299 327 300 328 if (driver->phone <= 0) { 301 printf(NAME ": devman_forward: cound not forward to driver %s (the driver's phone is %x).\n", driver->name, driver->phone); 329 printf(NAME ": devman_forward: cound not forward to driver %s ", driver->name); 330 printf("the driver's phone is %x).\n", driver->phone); 302 331 return; 303 332 } -
uspace/srv/drivers/pciintel/pci.c
r3a5909f r3843ecb 58 58 #define NAME "pciintel" 59 59 60 61 60 #define CONF_ADDR(bus, dev, fn, reg) ((1 << 31) | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3)) 61 62 63 static hw_resource_list_t * pciintel_get_child_resources(device_t *dev) 64 { 65 pci_dev_data_t *dev_data = (pci_dev_data_t *)dev->driver_data; 66 if (NULL == dev_data) { 67 return NULL; 68 } 69 return &dev_data->hw_resources; 70 } 71 72 static bool pciintel_enable_child_interrupt(device_t *dev) 73 { 74 // TODO 75 76 return false; 77 } 78 79 static resource_iface_t pciintel_child_res_iface = { 80 &pciintel_get_child_resources, 81 &pciintel_enable_child_interrupt 82 }; 83 84 static device_class_t pci_child_class; 62 85 63 86 … … 373 396 pci_read_interrupt(dev); 374 397 375 // TODO initialize device interfaces398 dev->class = &pci_child_class; 376 399 377 400 printf(NAME ": adding new child device %s.\n", dev->name); … … 464 487 } 465 488 489 static void pciintel_init() 490 { 491 pci_child_class.id = 0; // TODO 492 pci_child_class.interfaces[HW_RES_DEV_IFACE] = &pciintel_child_res_iface; 493 } 494 466 495 int main(int argc, char *argv[]) 467 496 { 468 printf(NAME ": HelenOS pci bus driver (intel method 1).\n"); 497 printf(NAME ": HelenOS pci bus driver (intel method 1).\n"); 498 pciintel_init(); 469 499 return driver_main(&pci_driver); 470 500 } -
uspace/srv/drivers/pciintel/pci.h
r3a5909f r3843ecb 110 110 } 111 111 112 static inline boolpci_clean_resource_list(device_t *dev)112 static inline void pci_clean_resource_list(device_t *dev) 113 113 { 114 114 pci_dev_data_t *dev_data = (pci_dev_data_t *)dev->driver_data; -
uspace/srv/drivers/rootia32/rootia32.c
r3a5909f r3843ecb 51 51 #include <ipc/dev_iface.h> 52 52 #include <resource.h> 53 #include <device/hw_res.h> 53 54 54 55 #define NAME "rootia32" … … 111 112 }; 112 113 114 // initialized in root_ia32_init() function 115 static device_class_t rootia32_child_class; 116 113 117 static bool rootia32_add_child( 114 118 device_t *parent, const char *name, const char *str_match_id, … … 136 140 add_match_id(&child->match_ids, match_id); 137 141 138 // add an interfaceto the device139 device_set_iface(child, HW_RES_DEV_IFACE, &child_res_iface);142 // set class to the device 143 child->class = &rootia32_child_class; 140 144 141 145 // register child device … … 181 185 } 182 186 187 static void root_ia32_init() { 188 // initialize child device class 189 rootia32_child_class.id = 0; // TODO 190 rootia32_child_class.interfaces[HW_RES_DEV_IFACE] = &child_res_iface; 191 } 192 183 193 int main(int argc, char *argv[]) 184 194 { 185 195 printf(NAME ": HelenOS root device driver\n"); 196 root_ia32_init(); 186 197 return driver_main(&rootia32_driver); 187 198 }
Note:
See TracChangeset
for help on using the changeset viewer.