1/**
2 * \file
3 * \brief Mackerel I/O port support
4 */
5
6/*
7 * Copyright (c) 2008, 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 LIBBARRELFISH_MACKEREL_IO_H
16#define LIBBARRELFISH_MACKEREL_IO_H
17
18typedef uint16_t mackerel_io_t;
19
20#if defined(IN_KERNEL)
21
22#include <x86.h>
23
24/*
25 * Reading from I/O space
26 */
27static inline uint8_t mackerel_read_io_8( mackerel_io_t base, int offset)
28{
29    volatile uint8_t result = inb(base+offset);
30    return result;
31}
32static inline uint16_t mackerel_read_io_16( mackerel_io_t base, int offset)
33{
34    return inw(base+offset);
35}
36static inline uint32_t mackerel_read_io_32( mackerel_io_t base, int offset)
37{
38    return ind(base+offset);
39}
40
41/*
42 * Writing to I/O space
43 */
44static inline void mackerel_write_io_8( mackerel_io_t base, int offset, volatile uint8_t v)
45{
46    outb(base+offset, v);
47}
48static inline void mackerel_write_io_16( mackerel_io_t base, int offset, uint16_t v)
49{
50    outw(base+offset, v);
51}
52static inline void mackerel_write_io_32( mackerel_io_t base, int offset, uint32_t v)
53{
54    outd(base+offset, v);
55}
56
57#else // defined(IN_KERNEL)
58
59#include <stdio.h>
60#include <stdint.h>
61#include <arch/x86/barrelfish/iocap_arch.h>
62
63/*
64 * Reading from I/O space
65 */
66static inline uint8_t mackerel_read_io_8( mackerel_io_t base, int offset)
67{
68    uint8_t val;
69    errval_t err = iocap_in8(cap_io, base+offset, &val);
70    if(err_is_fail(err)) {
71        USER_PANIC_ERR(err, "calling iocap_in8");
72    }
73    return err_is_ok(err) ? val : -1;
74}
75static inline uint16_t mackerel_read_io_16( mackerel_io_t base, int offset)
76{
77    uint16_t val;
78    errval_t err = iocap_in16(cap_io, base+offset, &val);
79    if(err_is_fail(err)) {
80        USER_PANIC_ERR(err, "calling iocap_in16");
81    }
82    return err_is_ok(err) ? val : -1;
83}
84static inline uint32_t mackerel_read_io_32( mackerel_io_t base, int offset)
85{
86    uint32_t val;
87    errval_t err = iocap_in32(cap_io, base+offset, &val);
88    if(err_is_fail(err)) {
89        USER_PANIC_ERR(err, "calling iocap_in32");
90    }
91    return err_is_ok(err) ? val : -1;
92}
93
94/*
95 * Writing to I/O space
96 */
97static inline void mackerel_write_io_8( mackerel_io_t base, int offset, uint8_t v)
98{
99    errval_t err = iocap_out8(cap_io, base+offset, v);
100    if(err_is_fail(err)) {
101        USER_PANIC_ERR(err, "calling iocap_out8");
102    }
103}
104static inline void mackerel_write_io_16( mackerel_io_t base, int offset, uint16_t v)
105{
106    errval_t err = iocap_out16(cap_io, base+offset, v);
107    if(err_is_fail(err)) {
108        USER_PANIC_ERR(err, "calling iocap_out16");
109    }
110}
111static inline void mackerel_write_io_32( mackerel_io_t base, int offset, uint32_t v)
112{
113    errval_t err = iocap_out32(cap_io, base+offset, v);
114    if(err_is_fail(err)) {
115        USER_PANIC_ERR(err, "calling iocap_out32");
116    }
117}
118#endif // IN_KERNEL
119
120#endif // LIBBARRELFISH_MACKEREL_IO_H
121
122