1/**
2 * \file
3 * \brief High-level capability helpers
4 */
5
6/*
7 * Copyright (c) 2007, 2008, 2009, 2010, 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, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#ifndef CAPABILITIES_ARCH_X86_H
16#define CAPABILITIES_ARCH_X86_H
17
18/**
19 * \brief Invoke an IO capability to read a byte
20 *
21 * \param iocap IO capability
22 * \param port  IO port number
23 * \param data  Pointer to returned value
24 */
25static inline errval_t
26iocap_in8(struct capref iocap, uint16_t port, uint8_t *data)
27{
28    uint32_t tmp = 0;
29    errval_t err = invoke_iocap_in(iocap, IOCmd_Inb, port, &tmp);
30    if (err_is_ok(err)) {
31        *data = tmp;
32    }
33    return err;
34}
35
36/**
37 * \brief Invoke an IO capability to read a 16-bit value
38 *
39 * \param iocap IO capability
40 * \param port  IO port number
41 * \param data  Pointer to returned value
42 *
43 * \return Error code
44 */
45static inline errval_t
46iocap_in16(struct capref iocap, uint16_t port, uint16_t *data)
47{
48    uint32_t tmp = 0;
49    errval_t err = invoke_iocap_in(iocap, IOCmd_Inw, port, &tmp);
50    if (err_is_ok(err)) {
51        *data = tmp;
52    }
53    return err;
54}
55
56/**
57 * \brief Invoke an IO capability to read a 32-bit value
58 *
59 * \param iocap IO capability
60 * \param port  IO port number
61 * \param data  Pointer to returned value
62 */
63static inline errval_t
64iocap_in32(struct capref iocap, uint16_t port, uint32_t *data)
65{
66    return invoke_iocap_in(iocap, IOCmd_Ind, port, data);
67}
68
69/**
70 * \brief Invoke an IO capability to write a byte
71 *
72 * \param iocap IO capability
73 * \param port  IO port number
74 * \param data  Output data
75 */
76static inline errval_t
77iocap_out8(struct capref iocap, uint16_t port, uint8_t data)
78{
79    return invoke_iocap_out(iocap, IOCmd_Outb, port, data);
80}
81
82/**
83 * \brief Invoke an IO capability to write a 16-bit value
84 *
85 * \param iocap IO capability
86 * \param port  IO port number
87 * \param data  Output data
88 */
89static inline errval_t
90iocap_out16(struct capref iocap, uint16_t port, uint16_t data)
91{
92    return invoke_iocap_out(iocap, IOCmd_Outw, port, data);
93}
94
95/**
96 * \brief Invoke an IO capability to write a 32-bit value
97 *
98 * \param iocap IO capability
99 * \param port  IO port number
100 * \param data  Output data
101 */
102static inline errval_t
103iocap_out32(struct capref iocap, uint16_t port, uint32_t data)
104{
105    return invoke_iocap_out(iocap, IOCmd_Outd, port, data);
106}
107
108#endif
109