1// Copyright 2016 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <zircon/compiler.h> 8#include <stdint.h> 9 10__BEGIN_CDECLS; 11 12#if defined(__x86_64__) || defined(__i386__) 13static inline uint8_t inp(uint16_t _port) { 14 uint8_t rv; 15 __asm__ __volatile__("inb %1, %0" 16 : "=a"(rv) 17 : "d"(_port)); 18 return (rv); 19} 20 21static inline uint16_t inpw(uint16_t _port) { 22 uint16_t rv; 23 __asm__ __volatile__("inw %1, %0" 24 : "=a"(rv) 25 : "d"(_port)); 26 return (rv); 27} 28 29static inline uint32_t inpd(uint16_t _port) { 30 uint32_t rv; 31 __asm__ __volatile__("inl %1, %0" 32 : "=a"(rv) 33 : "d"(_port)); 34 return (rv); 35} 36 37static inline void outp(uint16_t _port, uint8_t _data) { 38 __asm__ __volatile__("outb %1, %0" 39 : 40 : "d"(_port), 41 "a"(_data)); 42} 43 44static inline void outpw(uint16_t _port, uint16_t _data) { 45 __asm__ __volatile__("outw %1, %0" 46 : 47 : "d"(_port), 48 "a"(_data)); 49} 50 51static inline void outpd(uint16_t _port, uint32_t _data) { 52 __asm__ __volatile__("outl %1, %0" 53 : 54 : "d"(_port), 55 "a"(_data)); 56} 57#else 58static inline uint8_t inp(uint16_t _port) { 59 return 0; 60} 61static inline uint16_t inpw(uint16_t _port) { 62 return 0; 63} 64static inline uint32_t inpd(uint16_t _port) { 65 return 0; 66} 67static inline void outp(uint16_t _port, uint8_t _data) {} 68static inline void outpw(uint16_t _port, uint16_t _data) {} 69static inline void outpd(uint16_t _port, uint32_t _data) {} 70#endif 71 72__END_CDECLS; 73