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