1 /** @file
2   I/O Library for ARM.
3 
4   Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
5   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
6   This program and the accompanying materials
7   are 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 
17 //
18 // Include common header file for this module.
19 //
20 #include "BaseIoLibIntrinsicInternal.h"
21 
22 /**
23   Reads an 8-bit I/O port.
24 
25   Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
26   This function must guarantee that all I/O read and write operations are
27   serialized.
28 
29   If 8-bit I/O port operations are not supported, then ASSERT().
30 
31   @param  Port  The I/O port to read.
32 
33   @return The value read.
34 
35 **/
36 UINT8
37 EFIAPI
IoRead8(IN UINTN Port)38 IoRead8 (
39   IN      UINTN                     Port
40   )
41 {
42   ASSERT (FALSE);
43   return 0;
44 }
45 
46 /**
47   Writes an 8-bit I/O port.
48 
49   Writes the 8-bit I/O port specified by Port with the value specified by Value
50   and returns Value. This function must guarantee that all I/O read and write
51   operations are serialized.
52 
53   If 8-bit I/O port operations are not supported, then ASSERT().
54 
55   @param  Port  The I/O port to write.
56   @param  Value The value to write to the I/O port.
57 
58   @return The value written the I/O port.
59 
60 **/
61 UINT8
62 EFIAPI
IoWrite8(IN UINTN Port,IN UINT8 Value)63 IoWrite8 (
64   IN      UINTN                     Port,
65   IN      UINT8                     Value
66   )
67 {
68   ASSERT (FALSE);
69   return Value;
70 }
71 
72 /**
73   Reads a 16-bit I/O port.
74 
75   Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
76   This function must guarantee that all I/O read and write operations are
77   serialized.
78 
79   If 16-bit I/O port operations are not supported, then ASSERT().
80 
81   @param  Port  The I/O port to read.
82 
83   @return The value read.
84 
85 **/
86 UINT16
87 EFIAPI
IoRead16(IN UINTN Port)88 IoRead16 (
89   IN      UINTN                     Port
90   )
91 {
92   ASSERT (FALSE);
93   return 0;
94 }
95 
96 /**
97   Writes a 16-bit I/O port.
98 
99   Writes the 16-bit I/O port specified by Port with the value specified by Value
100   and returns Value. This function must guarantee that all I/O read and write
101   operations are serialized.
102 
103   If 16-bit I/O port operations are not supported, then ASSERT().
104 
105   @param  Port  The I/O port to write.
106   @param  Value The value to write to the I/O port.
107 
108   @return The value written the I/O port.
109 
110 **/
111 UINT16
112 EFIAPI
IoWrite16(IN UINTN Port,IN UINT16 Value)113 IoWrite16 (
114   IN      UINTN                     Port,
115   IN      UINT16                    Value
116   )
117 {
118   ASSERT (FALSE);
119   return Value;
120 }
121 
122 /**
123   Reads a 32-bit I/O port.
124 
125   Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
126   This function must guarantee that all I/O read and write operations are
127   serialized.
128 
129   If 32-bit I/O port operations are not supported, then ASSERT().
130 
131   @param  Port  The I/O port to read.
132 
133   @return The value read.
134 
135 **/
136 UINT32
137 EFIAPI
IoRead32(IN UINTN Port)138 IoRead32 (
139   IN      UINTN                     Port
140   )
141 {
142   ASSERT (FALSE);
143   return 0;
144 }
145 
146 /**
147   Writes a 32-bit I/O port.
148 
149   Writes the 32-bit I/O port specified by Port with the value specified by Value
150   and returns Value. This function must guarantee that all I/O read and write
151   operations are serialized.
152 
153   If 32-bit I/O port operations are not supported, then ASSERT().
154 
155   @param  Port  The I/O port to write.
156   @param  Value The value to write to the I/O port.
157 
158   @return The value written the I/O port.
159 
160 **/
161 UINT32
162 EFIAPI
IoWrite32(IN UINTN Port,IN UINT32 Value)163 IoWrite32 (
164   IN      UINTN                     Port,
165   IN      UINT32                    Value
166   )
167 {
168   ASSERT (FALSE);
169   return Value;
170 }
171 
172 /**
173   Reads a 64-bit I/O port.
174 
175   Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.
176   This function must guarantee that all I/O read and write operations are
177   serialized.
178 
179   If 64-bit I/O port operations are not supported, then ASSERT().
180   If Port is not aligned on a 64-bit boundary, then ASSERT().
181 
182   @param  Port  The I/O port to read.
183 
184   @return The value read.
185 
186 **/
187 UINT64
188 EFIAPI
IoRead64(IN UINTN Port)189 IoRead64 (
190   IN      UINTN                     Port
191   )
192 {
193   ASSERT (FALSE);
194   return 0;
195 }
196 
197 /**
198   Writes a 64-bit I/O port.
199 
200   Writes the 64-bit I/O port specified by Port with the value specified by Value
201   and returns Value. This function must guarantee that all I/O read and write
202   operations are serialized.
203 
204   If 64-bit I/O port operations are not supported, then ASSERT().
205   If Port is not aligned on a 64-bit boundary, then ASSERT().
206 
207   @param  Port  The I/O port to write.
208   @param  Value The value to write to the I/O port.
209 
210   @return The value written to the I/O port.
211 
212 **/
213 UINT64
214 EFIAPI
IoWrite64(IN UINTN Port,IN UINT64 Value)215 IoWrite64 (
216   IN      UINTN                     Port,
217   IN      UINT64                    Value
218   )
219 {
220   ASSERT (FALSE);
221   return 0;
222 }
223 
224 
225 /**
226   Reads an 8-bit MMIO register.
227 
228   Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
229   returned. This function must guarantee that all MMIO read and write
230   operations are serialized.
231 
232   If 8-bit MMIO register operations are not supported, then ASSERT().
233 
234   @param  Address The MMIO register to read.
235 
236   @return The value read.
237 
238 **/
239 UINT8
240 EFIAPI
MmioRead8(IN UINTN Address)241 MmioRead8 (
242   IN      UINTN                     Address
243   )
244 {
245   UINT8                             Value;
246 
247   Value = *(volatile UINT8*)Address;
248   return Value;
249 }
250 
251 /**
252   Writes an 8-bit MMIO register.
253 
254   Writes the 8-bit MMIO register specified by Address with the value specified
255   by Value and returns Value. This function must guarantee that all MMIO read
256   and write operations are serialized.
257 
258   If 8-bit MMIO register operations are not supported, then ASSERT().
259 
260   @param  Address The MMIO register to write.
261   @param  Value   The value to write to the MMIO register.
262 
263 **/
264 UINT8
265 EFIAPI
MmioWrite8(IN UINTN Address,IN UINT8 Value)266 MmioWrite8 (
267   IN      UINTN                     Address,
268   IN      UINT8                     Value
269   )
270 {
271   *(volatile UINT8*)Address = Value;
272   return Value;
273 }
274 
275 /**
276   Reads a 16-bit MMIO register.
277 
278   Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
279   returned. This function must guarantee that all MMIO read and write
280   operations are serialized.
281 
282   If 16-bit MMIO register operations are not supported, then ASSERT().
283 
284   @param  Address The MMIO register to read.
285 
286   @return The value read.
287 
288 **/
289 UINT16
290 EFIAPI
MmioRead16(IN UINTN Address)291 MmioRead16 (
292   IN      UINTN                     Address
293   )
294 {
295   UINT16                            Value;
296 
297   ASSERT ((Address & 1) == 0);
298   Value = *(volatile UINT16*)Address;
299   return Value;
300 }
301 
302 /**
303   Writes a 16-bit MMIO register.
304 
305   Writes the 16-bit MMIO register specified by Address with the value specified
306   by Value and returns Value. This function must guarantee that all MMIO read
307   and write operations are serialized.
308 
309   If 16-bit MMIO register operations are not supported, then ASSERT().
310 
311   @param  Address The MMIO register to write.
312   @param  Value   The value to write to the MMIO register.
313 
314 **/
315 UINT16
316 EFIAPI
MmioWrite16(IN UINTN Address,IN UINT16 Value)317 MmioWrite16 (
318   IN      UINTN                     Address,
319   IN      UINT16                    Value
320   )
321 {
322   ASSERT ((Address & 1) == 0);
323   *(volatile UINT16*)Address = Value;
324   return Value;
325 }
326 
327 /**
328   Reads a 32-bit MMIO register.
329 
330   Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
331   returned. This function must guarantee that all MMIO read and write
332   operations are serialized.
333 
334   If 32-bit MMIO register operations are not supported, then ASSERT().
335 
336   @param  Address The MMIO register to read.
337 
338   @return The value read.
339 
340 **/
341 UINT32
342 EFIAPI
MmioRead32(IN UINTN Address)343 MmioRead32 (
344   IN      UINTN                     Address
345   )
346 {
347   UINT32                            Value;
348 
349   ASSERT ((Address & 3) == 0);
350   Value = *(volatile UINT32*)Address;
351   return Value;
352 }
353 
354 /**
355   Writes a 32-bit MMIO register.
356 
357   Writes the 32-bit MMIO register specified by Address with the value specified
358   by Value and returns Value. This function must guarantee that all MMIO read
359   and write operations are serialized.
360 
361   If 32-bit MMIO register operations are not supported, then ASSERT().
362 
363   @param  Address The MMIO register to write.
364   @param  Value   The value to write to the MMIO register.
365 
366 **/
367 UINT32
368 EFIAPI
MmioWrite32(IN UINTN Address,IN UINT32 Value)369 MmioWrite32 (
370   IN      UINTN                     Address,
371   IN      UINT32                    Value
372   )
373 {
374   ASSERT ((Address & 3) == 0);
375   *(volatile UINT32*)Address = Value;
376   return Value;
377 }
378 
379 /**
380   Reads a 64-bit MMIO register.
381 
382   Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
383   returned. This function must guarantee that all MMIO read and write
384   operations are serialized.
385 
386   If 64-bit MMIO register operations are not supported, then ASSERT().
387 
388   @param  Address The MMIO register to read.
389 
390   @return The value read.
391 
392 **/
393 UINT64
394 EFIAPI
MmioRead64(IN UINTN Address)395 MmioRead64 (
396   IN      UINTN                     Address
397   )
398 {
399   UINT64                            Value;
400 
401   ASSERT ((Address & 7) == 0);
402   Value = *(volatile UINT64*)Address;
403   return Value;
404 }
405 
406 /**
407   Writes a 64-bit MMIO register.
408 
409   Writes the 64-bit MMIO register specified by Address with the value specified
410   by Value and returns Value. This function must guarantee that all MMIO read
411   and write operations are serialized.
412 
413   If 64-bit MMIO register operations are not supported, then ASSERT().
414 
415   @param  Address The MMIO register to write.
416   @param  Value   The value to write to the MMIO register.
417 
418 **/
419 UINT64
420 EFIAPI
MmioWrite64(IN UINTN Address,IN UINT64 Value)421 MmioWrite64 (
422   IN      UINTN                     Address,
423   IN      UINT64                    Value
424   )
425 {
426   ASSERT ((Address & 7) == 0);
427   *(volatile UINT64*)Address = Value;
428   return Value;
429 }
430 
431