source: mainline/uspace/drv/intctl/icp-ic/icp-ic.c@ 4122410

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

do not expose the call capability handler from the async framework

Keep the call capability handler encapsulated within the async framework
and do not expose it explicitly via its API. Use the pointer to
ipc_call_t as the sole object identifying an IPC call in the code that
uses the async framework.

This plugs a major leak in the abstraction and also simplifies both the
async framework (slightly) and all IPC servers.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*
2 * Copyright (c) 2014 Jiri Svoboda
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 icp-ic
30 * @{
31 */
32
33/**
34 * @file icp-ic.c
35 * @brief IntegratorCP interrupt controller driver
36 */
37
38#include <async.h>
39#include <bitops.h>
40#include <ddi.h>
41#include <ddf/log.h>
42#include <errno.h>
43#include <str_error.h>
44#include <ipc/irc.h>
45#include <stdint.h>
46
47#include "icp-ic.h"
48#include "icp-ic_hw.h"
49
50enum {
51 icpic_max_irq = 32
52};
53
54static errno_t icpic_enable_irq(icpic_t *icpic, sysarg_t irq)
55{
56 if (irq > icpic_max_irq)
57 return EINVAL;
58
59 ddf_msg(LVL_NOTE, "Enable IRQ %zu", irq);
60
61 pio_write_32(&icpic->regs->irq_enableset, BIT_V(uint32_t, irq));
62 return EOK;
63}
64
65/** Client connection handler.
66 *
67 * @param icall Call data of the request that opened the connection.
68 * @param arg Local argument.
69 *
70 */
71static void icpic_connection(ipc_call_t *icall, void *arg)
72{
73 ipc_call_t call;
74 icpic_t *icpic;
75
76 /*
77 * Answer the first IPC_M_CONNECT_ME_TO call.
78 */
79 async_answer_0(icall, EOK);
80
81 icpic = (icpic_t *) ddf_dev_data_get(ddf_fun_get_dev((ddf_fun_t *) arg));
82
83 while (true) {
84 async_get_call(&call);
85
86 if (!IPC_GET_IMETHOD(call)) {
87 /* The other side has hung up. */
88 async_answer_0(&call, EOK);
89 return;
90 }
91
92 switch (IPC_GET_IMETHOD(call)) {
93 case IRC_ENABLE_INTERRUPT:
94 async_answer_0(&call,
95 icpic_enable_irq(icpic, IPC_GET_ARG1(call)));
96 break;
97 case IRC_DISABLE_INTERRUPT:
98 /* XXX TODO */
99 async_answer_0(&call, EOK);
100 break;
101 case IRC_CLEAR_INTERRUPT:
102 /* Noop */
103 async_answer_0(&call, EOK);
104 break;
105 default:
106 async_answer_0(&call, EINVAL);
107 break;
108 }
109 }
110}
111
112/** Add icp-ic device. */
113errno_t icpic_add(icpic_t *icpic, icpic_res_t *res)
114{
115 ddf_fun_t *fun_a = NULL;
116 void *regs;
117 errno_t rc;
118
119 rc = pio_enable((void *)res->base, sizeof(icpic_regs_t), &regs);
120 if (rc != EOK) {
121 ddf_msg(LVL_ERROR, "Error enabling PIO");
122 goto error;
123 }
124
125 icpic->regs = (icpic_regs_t *)regs;
126
127 fun_a = ddf_fun_create(icpic->dev, fun_exposed, "a");
128 if (fun_a == NULL) {
129 ddf_msg(LVL_ERROR, "Failed creating function 'a'.");
130 rc = ENOMEM;
131 goto error;
132 }
133
134 ddf_fun_set_conn_handler(fun_a, icpic_connection);
135
136 rc = ddf_fun_bind(fun_a);
137 if (rc != EOK) {
138 ddf_msg(LVL_ERROR, "Failed binding function 'a': %s", str_error(rc));
139 goto error;
140 }
141
142 rc = ddf_fun_add_to_category(fun_a, "irc");
143 if (rc != EOK)
144 goto error;
145
146 return EOK;
147error:
148 if (fun_a != NULL)
149 ddf_fun_destroy(fun_a);
150 return rc;
151}
152
153/** Remove icp-ic device */
154errno_t icpic_remove(icpic_t *icpic)
155{
156 return ENOTSUP;
157}
158
159/** icp-ic device gone */
160errno_t icpic_gone(icpic_t *icpic)
161{
162 return ENOTSUP;
163}
164
165/**
166 * @}
167 */
Note: See TracBrowser for help on using the repository browser.