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