source: mainline/uspace/lib/c/include/ipc/devman.h@ 64d2b10

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 64d2b10 was 64d2b10, checked in by Martin Decky <martin@…>, 14 years ago

libc: do not intermix low-level IPC methods with async framework methods

  • 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 <ipc/common.h>
37#include <adt/list.h>
38#include <malloc.h>
39#include <mem.h>
40
41#define DEVMAN_NAME_MAXLEN 256
42
43typedef sysarg_t devman_handle_t;
44
45/** Ids of device models used for device-to-driver matching.
46 */
47typedef struct match_id {
48 /** Pointers to next and previous ids.
49 */
50 link_t link;
51 /** Id of device model.
52 */
53 const char *id;
54 /** Relevancy of device-to-driver match.
55 * The higher is the product of scores specified for the device by the bus driver and by the leaf driver,
56 * the more suitable is the leaf driver for handling the device.
57 */
58 unsigned int score;
59} match_id_t;
60
61/** List of ids for matching devices to drivers sorted
62 * according to match scores in descending order.
63 */
64typedef struct match_id_list {
65 link_t ids;
66} match_id_list_t;
67
68static inline match_id_t *create_match_id(void)
69{
70 match_id_t *id = malloc(sizeof(match_id_t));
71 memset(id, 0, sizeof(match_id_t));
72 return id;
73}
74
75static inline void delete_match_id(match_id_t *id)
76{
77 if (id) {
78 if (NULL != id->id) {
79 free(id->id);
80 }
81 free(id);
82 }
83}
84
85static inline void add_match_id(match_id_list_t *ids, match_id_t *id)
86{
87 match_id_t *mid = NULL;
88 link_t *link = ids->ids.next;
89
90 while (link != &ids->ids) {
91 mid = list_get_instance(link, match_id_t,link);
92 if (mid->score < id->score) {
93 break;
94 }
95 link = link->next;
96 }
97
98 list_insert_before(&id->link, link);
99}
100
101static inline void init_match_ids(match_id_list_t *id_list)
102{
103 list_initialize(&id_list->ids);
104}
105
106static inline void clean_match_ids(match_id_list_t *ids)
107{
108 link_t *link = NULL;
109 match_id_t *id;
110
111 while(!list_empty(&ids->ids)) {
112 link = ids->ids.next;
113 list_remove(link);
114 id = list_get_instance(link, match_id_t, link);
115 delete_match_id(id);
116 }
117}
118
119typedef enum {
120 DEVMAN_DRIVER = 1,
121 DEVMAN_CLIENT,
122 DEVMAN_CONNECT_TO_DEVICE,
123 DEVMAN_CONNECT_FROM_DEVMAP,
124 DEVMAN_CONNECT_TO_PARENTS_DEVICE
125} devman_interface_t;
126
127typedef enum {
128 DEVMAN_DRIVER_REGISTER = IPC_FIRST_USER_METHOD,
129 DEVMAN_ADD_CHILD_DEVICE,
130 DEVMAN_ADD_MATCH_ID,
131 DEVMAN_ADD_DEVICE_TO_CLASS
132
133} driver_to_devman_t;
134
135typedef enum {
136 DRIVER_ADD_DEVICE = IPC_FIRST_USER_METHOD
137
138} devman_to_driver_t;
139
140typedef enum {
141 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD
142} client_to_devman_t;
143
144#endif
145
146/** @}
147 */
Note: See TracBrowser for help on using the repository browser.