source: mainline/uspace/lib/c/include/ipc/devman.h@ 0b5a4131

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0b5a4131 was 0b5a4131, checked in by Jakub Jermar <jakub@…>, 15 years ago

Rename device_handle_t to devman_handle_t and make it explicitly clear that
device_handle_t is a handle understood by devman.

  • Property mode set to 100644
File size: 3.7 KB
Line 
1/*
2 * Copyright (c) 2010 Lenka Trochtova
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 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup devman
30 * @{
31 */
32
33#ifndef LIBC_IPC_DEVMAN_H_
34#define LIBC_IPC_DEVMAN_H_
35
36#include <adt/list.h>
37#include <ipc/ipc.h>
38#include <stdlib.h>
39#include <stdio.h>
40#include <str.h>
41
42#define DEVMAN_NAME_MAXLEN 256
43
44typedef ipcarg_t devman_handle_t;
45
46/** Ids of device models used for device-to-driver matching.
47 */
48typedef struct match_id {
49 /** Pointers to next and previous ids.
50 */
51 link_t link;
52 /** Id of device model.
53 */
54 const char *id;
55 /** Relevancy of device-to-driver match.
56 * The higher is the product of scores specified for the device by the bus driver and by the leaf driver,
57 * the more suitable is the leaf driver for handling the device.
58 */
59 unsigned int score;
60} match_id_t;
61
62/** List of ids for matching devices to drivers sorted
63 * according to match scores in descending order.
64 */
65typedef struct match_id_list {
66 link_t ids;
67} match_id_list_t;
68
69
70static inline match_id_t * create_match_id()
71{
72 match_id_t *id = malloc(sizeof(match_id_t));
73 memset(id, 0, sizeof(match_id_t));
74 return id;
75}
76
77static inline void delete_match_id(match_id_t *id)
78{
79 if (id) {
80 if (NULL != id->id) {
81 free(id->id);
82 }
83 free(id);
84 }
85}
86
87static inline void add_match_id(match_id_list_t *ids, match_id_t *id)
88{
89 match_id_t *mid = NULL;
90 link_t *link = ids->ids.next;
91
92 while (link != &ids->ids) {
93 mid = list_get_instance(link, match_id_t,link);
94 if (mid->score < id->score) {
95 break;
96 }
97 link = link->next;
98 }
99
100 list_insert_before(&id->link, link);
101}
102
103static inline void init_match_ids(match_id_list_t *id_list)
104{
105 list_initialize(&id_list->ids);
106}
107
108static inline void clean_match_ids(match_id_list_t *ids)
109{
110 link_t *link = NULL;
111 match_id_t *id;
112
113 while(!list_empty(&ids->ids)) {
114 link = ids->ids.next;
115 list_remove(link);
116 id = list_get_instance(link, match_id_t, link);
117 delete_match_id(id);
118 }
119}
120
121typedef enum {
122 DEVMAN_DRIVER = 1,
123 DEVMAN_CLIENT,
124 DEVMAN_CONNECT_TO_DEVICE,
125 DEVMAN_CONNECT_TO_PARENTS_DEVICE
126} devman_interface_t;
127
128typedef enum {
129 DEVMAN_DRIVER_REGISTER = IPC_FIRST_USER_METHOD,
130 DEVMAN_ADD_CHILD_DEVICE,
131 DEVMAN_ADD_MATCH_ID,
132 DEVMAN_ADD_DEVICE_TO_CLASS
133
134} driver_to_devman_t;
135
136typedef enum {
137 DRIVER_ADD_DEVICE = IPC_FIRST_USER_METHOD
138
139} devman_to_driver_t;
140
141typedef enum {
142 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD
143} client_to_devman_t;
144
145#endif
146
147/** @}
148 */
Note: See TracBrowser for help on using the repository browser.