IRQ: Kaluga start driver with IRQ caps.
[barrelfish] / lib / int_route / client / client.c
1 /**
2  * \file
3  * \brief Contains helper functions for clients of the interrupt routing service
4  */
5
6 /*
7  * Copyright (c) 2009, 2010, 2012, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
13  */
14 #include <stdio.h>
15 #include <string.h>
16
17 #include <barrelfish/barrelfish.h>
18 #include <barrelfish/nameservice_client.h>
19 #include <skb/skb.h> // read list
20 #include <int_route/int_route_client.h>
21 #include <int_route/int_route_debug.h>
22
23 #include <if/int_route_service_defs.h>
24 #include <if/int_route_service_rpcclient_defs.h>
25
26 static struct int_route_state {
27     bool request_done;
28     struct int_route_rpc_client * client;
29     struct int_route_service_binding * binding;
30     struct int_route_service_rpc_client rpc_client;
31
32 } int_route_state_st;
33
34
35 static struct int_route_state * get_int_route_state(void){
36     return &int_route_state_st;
37 }
38
39 static void bind_cb(void *st, errval_t binderr, struct int_route_service_binding *b) {
40     assert(err_is_ok(binderr));
41     errval_t err;
42     int_route_state_st.binding = b;
43     int_route_state_st.request_done = true;
44
45     err = int_route_service_rpc_client_init(&(int_route_state_st.rpc_client), b);
46     assert(err_is_ok(err));
47 }
48
49 //errval_t int_route_add_controller(int bus, int dev, int fun,
50 //        int_route_service_controller_type_t type) {
51 //    struct int_route_service_binding * b = get_int_route_state()->binding;
52 //    assert(b != null);
53 //    // int_route_service_pci_address_t addr, int_route_service_controller_type_t type
54 //    int_route_service_pci_address_t addr = {.bus = bus, .device = device, .fun = fun}
55 //    b->rx_vtbl.add_controller_call(b, addr, type);
56 //}
57 //
58 //
59 //errval_t int_route_route(struct capref intin, struct capref dest){
60 //    errval_t err;
61 //    struct int_route_service_binding * b = get_int_route_state()->binding;
62 //    assert(b != null);
63 //    return b->tx_vtbl.route_call(b, NULL, intin, dest);
64 //}
65
66 errval_t int_route_client_route(struct capref intsrc, struct capref intdest){
67     assert(int_route_state_st.request_done);
68     struct int_route_service_rpc_client * cl = &int_route_state_st.rpc_client;
69     errval_t msgerr, err;
70     msgerr = cl->vtbl.route(cl, intsrc, intdest, &err);
71     if(err_is_fail(msgerr)){
72         return msgerr;
73     }
74     return err;
75 }
76
77 errval_t int_route_client_connect(void){
78     errval_t err;
79     iref_t iref;
80     struct int_route_state *state = get_int_route_state();
81
82     /* check if the RPC client already has been initialized */
83     if (state->binding != NULL) {
84         return SYS_ERR_OK;
85     }
86
87     err = nameservice_blocking_lookup("int_route_service", &iref);
88     if (err_is_fail(err)) {
89         return err;
90     }
91
92     state->request_done = false;
93     err = int_route_service_bind(iref, bind_cb, NULL, get_default_waitset(),
94                    IDC_BIND_FLAGS_DEFAULT);
95     if (err_is_fail(err)) {
96         return err_push(err, FLOUNDER_ERR_BIND);
97     }
98
99     /* XXX: wait for connection to complete */
100     while (!state->request_done) {
101         messages_wait_and_handle_next();
102     }
103
104     return SYS_ERR_OK;
105 }