1/** @file
2  I/O Library. This file has compiler specifics for ICC as there
3  is no ANSI C standard for doing IO.
4
5  Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
6  This program and the accompanying materials are
7  licensed and made available under the terms and conditions of the BSD License
8  which accompanies this distribution.  The full text of the license may be found at
9  http://opensource.org/licenses/bsd-license.php.
10
11  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#include "BaseIoLibIntrinsicInternal.h"
17
18/**
19  Reads an 8-bit I/O port.
20
21  Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
22  This function must guarantee that all I/O read and write operations are
23  serialized.
24
25  If 8-bit I/O port operations are not supported, then ASSERT().
26
27  @param  Port  The I/O port to read.
28
29  @return The value read.
30
31**/
32UINT8
33EFIAPI
34IoRead8 (
35  IN      UINTN                     Port
36  )
37{
38  UINT8   Data;
39
40  __asm {
41    mov dx, word ptr [Port]
42    in  al, dx
43
44    mov Data, al
45  }
46  return Data;
47}
48
49/**
50  Writes an 8-bit I/O port.
51
52  Writes the 8-bit I/O port specified by Port with the value specified by Value
53  and returns Value. This function must guarantee that all I/O read and write
54  operations are serialized.
55
56  If 8-bit I/O port operations are not supported, then ASSERT().
57
58  @param  Port  The I/O port to write.
59  @param  Value The value to write to the I/O port.
60
61  @return The value written the I/O port.
62
63**/
64UINT8
65EFIAPI
66IoWrite8 (
67  IN      UINTN                     Port,
68  IN      UINT8                     Value
69  )
70{
71  __asm {
72    mov al, byte ptr [Value]
73    mov dx, word ptr [Port]
74    out dx, al
75  }
76  return Value;
77}
78
79/**
80  Reads a 16-bit I/O port.
81
82  Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
83  This function must guarantee that all I/O read and write operations are
84  serialized.
85
86  If 16-bit I/O port operations are not supported, then ASSERT().
87  If Port is not aligned on a 16-bit boundary, then ASSERT().
88
89  @param  Port  The I/O port to read.
90
91  @return The value read.
92
93**/
94UINT16
95EFIAPI
96IoRead16 (
97  IN      UINTN                     Port
98  )
99{
100  UINT16  Data;
101
102  ASSERT ((Port & 1) == 0);
103
104  __asm {
105    mov dx, word ptr [Port]
106    in  ax, dx
107    mov word ptr [Data], ax
108  }
109
110  return Data;
111}
112
113/**
114  Writes a 16-bit I/O port.
115
116  Writes the 16-bit I/O port specified by Port with the value specified by Value
117  and returns Value. This function must guarantee that all I/O read and write
118  operations are serialized.
119
120  If 16-bit I/O port operations are not supported, then ASSERT().
121  If Port is not aligned on a 16-bit boundary, then ASSERT().
122
123  @param  Port  The I/O port to write.
124  @param  Value The value to write to the I/O port.
125
126  @return The value written the I/O port.
127
128**/
129UINT16
130EFIAPI
131IoWrite16 (
132  IN      UINTN                     Port,
133  IN      UINT16                    Value
134  )
135{
136  ASSERT ((Port & 1) == 0);
137
138  __asm {
139    mov ax, word ptr [Value]
140    mov dx, word ptr [Port]
141    out dx, ax
142  }
143
144  return Value;
145}
146
147/**
148  Reads a 32-bit I/O port.
149
150  Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
151  This function must guarantee that all I/O read and write operations are
152  serialized.
153
154  If 32-bit I/O port operations are not supported, then ASSERT().
155  If Port is not aligned on a 32-bit boundary, then ASSERT().
156
157  @param  Port  The I/O port to read.
158
159  @return The value read.
160
161**/
162UINT32
163EFIAPI
164IoRead32 (
165  IN      UINTN                     Port
166  )
167{
168  UINT32 Data;
169
170  ASSERT ((Port & 3) == 0);
171
172  __asm {
173    mov dx, word ptr [Port]
174    in  eax, dx
175    mov dword ptr [Data], eax
176  }
177
178  return Data;
179}
180
181/**
182  Writes a 32-bit I/O port.
183
184  Writes the 32-bit I/O port specified by Port with the value specified by Value
185  and returns Value. This function must guarantee that all I/O read and write
186  operations are serialized.
187
188  If 32-bit I/O port operations are not supported, then ASSERT().
189  If Port is not aligned on a 32-bit boundary, then ASSERT().
190
191  @param  Port  The I/O port to write.
192  @param  Value The value to write to the I/O port.
193
194  @return The value written the I/O port.
195
196**/
197UINT32
198EFIAPI
199IoWrite32 (
200  IN      UINTN                     Port,
201  IN      UINT32                    Value
202  )
203{
204  ASSERT ((Port & 3) == 0);
205
206  __asm {
207    mov eax, dword ptr [Value]
208    mov dx, word ptr [Port]
209    out dx, eax
210  }
211
212  return Value;
213}
214
215