source: mainline/uspace/drv/char/sun4v-con/main.c

Last change on this file was 6404aca, checked in by Jakub Jermar <jakub@…>, 7 years ago

Disambiguate doxygroup genarch*

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright (c) 2017 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/**
30 * @addtogroup uspace_drv_sun4v_con
31 * @file Sun4v console driver
32 * @{
33 */
34
35#include <ddf/driver.h>
36#include <ddf/log.h>
37#include <device/hw_res_parsed.h>
38#include <errno.h>
39#include <stdio.h>
40
41#include "sun4v-con.h"
42
43#define NAME "sun4v-con"
44
45static errno_t sun4v_con_dev_add(ddf_dev_t *dev);
46static errno_t sun4v_con_dev_remove(ddf_dev_t *dev);
47static errno_t sun4v_con_dev_gone(ddf_dev_t *dev);
48static errno_t sun4v_con_fun_online(ddf_fun_t *fun);
49static errno_t sun4v_con_fun_offline(ddf_fun_t *fun);
50
51static driver_ops_t driver_ops = {
52 .dev_add = sun4v_con_dev_add,
53 .dev_remove = sun4v_con_dev_remove,
54 .dev_gone = sun4v_con_dev_gone,
55 .fun_online = sun4v_con_fun_online,
56 .fun_offline = sun4v_con_fun_offline
57};
58
59static driver_t sun4v_con_driver = {
60 .name = NAME,
61 .driver_ops = &driver_ops
62};
63
64static errno_t sun4v_con_get_res(ddf_dev_t *dev, sun4v_con_res_t *res)
65{
66 async_sess_t *parent_sess;
67 hw_res_list_parsed_t hw_res;
68 errno_t rc;
69
70 parent_sess = ddf_dev_parent_sess_get(dev);
71 if (parent_sess == NULL)
72 return ENOMEM;
73
74 hw_res_list_parsed_init(&hw_res);
75 rc = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
76 if (rc != EOK)
77 return rc;
78
79 if (hw_res.mem_ranges.count != 2) {
80 rc = EINVAL;
81 goto error;
82 }
83
84 res->in_base = RNGABS(hw_res.mem_ranges.ranges[0]);
85 res->out_base = RNGABS(hw_res.mem_ranges.ranges[1]);
86 return EOK;
87error:
88 hw_res_list_parsed_clean(&hw_res);
89 return rc;
90}
91
92static errno_t sun4v_con_dev_add(ddf_dev_t *dev)
93{
94 sun4v_con_t *sun4v_con;
95 sun4v_con_res_t res;
96 errno_t rc;
97
98 ddf_msg(LVL_DEBUG, "sun4v_con_dev_add(%p)", dev);
99 sun4v_con = ddf_dev_data_alloc(dev, sizeof(sun4v_con_t));
100 if (sun4v_con == NULL) {
101 ddf_msg(LVL_ERROR, "Failed allocating soft state.");
102 return ENOMEM;
103 }
104
105 sun4v_con->dev = dev;
106
107 rc = sun4v_con_get_res(dev, &res);
108 if (rc != EOK) {
109 ddf_msg(LVL_ERROR, "Failed getting hardware resource list.\n");
110 return EIO;
111 }
112
113 return sun4v_con_add(sun4v_con, &res);
114}
115
116static errno_t sun4v_con_dev_remove(ddf_dev_t *dev)
117{
118 sun4v_con_t *sun4v_con = (sun4v_con_t *)ddf_dev_data_get(dev);
119
120 ddf_msg(LVL_DEBUG, "sun4v_con_dev_remove(%p)", dev);
121
122 return sun4v_con_remove(sun4v_con);
123}
124
125static errno_t sun4v_con_dev_gone(ddf_dev_t *dev)
126{
127 sun4v_con_t *sun4v_con = (sun4v_con_t *)ddf_dev_data_get(dev);
128
129 ddf_msg(LVL_DEBUG, "sun4v_con_dev_gone(%p)", dev);
130
131 return sun4v_con_gone(sun4v_con);
132}
133
134static errno_t sun4v_con_fun_online(ddf_fun_t *fun)
135{
136 ddf_msg(LVL_DEBUG, "sun4v_con_fun_online()");
137 return ddf_fun_online(fun);
138}
139
140static errno_t sun4v_con_fun_offline(ddf_fun_t *fun)
141{
142 ddf_msg(LVL_DEBUG, "sun4v_con_fun_offline()");
143 return ddf_fun_offline(fun);
144}
145
146int main(int argc, char *argv[])
147{
148 printf(NAME ": Sun4v console driver\n");
149 ddf_log_init(NAME);
150 return ddf_driver_main(&sun4v_con_driver);
151}
152
153/** @}
154 */
Note: See TracBrowser for help on using the repository browser.