blob: a7af6ce52d45f37db70f6bbd00bd3b50c7ce1c65 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_LIB_DDK_INCLUDE_HW_INOUT_H_
#define SRC_LIB_DDK_INCLUDE_HW_INOUT_H_
#include <stdint.h>
#include <zircon/compiler.h>
__BEGIN_CDECLS
#if defined(__x86_64__) || defined(__i386__)
static inline uint8_t inp(uint16_t _port) {
uint8_t rv;
__asm__ __volatile__("inb %1, %0" : "=a"(rv) : "d"(_port));
return (rv);
}
static inline uint16_t inpw(uint16_t _port) {
uint16_t rv;
__asm__ __volatile__("inw %1, %0" : "=a"(rv) : "d"(_port));
return (rv);
}
static inline uint32_t inpd(uint16_t _port) {
uint32_t rv;
__asm__ __volatile__("inl %1, %0" : "=a"(rv) : "d"(_port));
return (rv);
}
static inline void outp(uint16_t _port, uint8_t _data) {
__asm__ __volatile__("outb %1, %0" : : "d"(_port), "a"(_data));
}
static inline void outpw(uint16_t _port, uint16_t _data) {
__asm__ __volatile__("outw %1, %0" : : "d"(_port), "a"(_data));
}
static inline void outpd(uint16_t _port, uint32_t _data) {
__asm__ __volatile__("outl %1, %0" : : "d"(_port), "a"(_data));
}
#else
static inline uint8_t inp(uint16_t _port) { return 0; }
static inline uint16_t inpw(uint16_t _port) { return 0; }
static inline uint32_t inpd(uint16_t _port) { return 0; }
static inline void outp(uint16_t _port, uint8_t _data) {}
static inline void outpw(uint16_t _port, uint16_t _data) {}
static inline void outpd(uint16_t _port, uint32_t _data) {}
#endif
__END_CDECLS
#endif // SRC_LIB_DDK_INCLUDE_HW_INOUT_H_