1 /** @file
2   I/O library for non I/O read and write access (memory map I/O read and
3   write only) architecture, such as ARM and RISC-V processor.
4 
5   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
6   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
7   Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
8   Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
9 
10   SPDX-License-Identifier: BSD-2-Clause-Patent
11 
12 **/
13 
14 
15 //
16 // Include common header file for this module.
17 //
18 #include "BaseIoLibIntrinsicInternal.h"
19 
20 /**
21   Reads an 8-bit I/O port.
22 
23   Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
24   This function must guarantee that all I/O read and write operations are
25   serialized.
26 
27   If 8-bit I/O port operations are not supported, then ASSERT().
28 
29   @param  Port  The I/O port to read.
30 
31   @return The value read.
32 
33 **/
34 UINT8
35 EFIAPI
36 IoRead8 (
37   IN      UINTN                     Port
38   )
39 {
40   ASSERT (FALSE);
41   return 0;
42 }
43 
44 /**
45   Writes an 8-bit I/O port.
46 
47   Writes the 8-bit I/O port specified by Port with the value specified by Value
48   and returns Value. This function must guarantee that all I/O read and write
49   operations are serialized.
50 
51   If 8-bit I/O port operations are not supported, then ASSERT().
52 
53   @param  Port  The I/O port to write.
54   @param  Value The value to write to the I/O port.
55 
56   @return The value written the I/O port.
57 
58 **/
59 UINT8
60 EFIAPI
61 IoWrite8 (
62   IN      UINTN                     Port,
63   IN      UINT8                     Value
64   )
65 {
66   ASSERT (FALSE);
67   return Value;
68 }
69 
70 /**
71   Reads a 16-bit I/O port.
72 
73   Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
74   This function must guarantee that all I/O read and write operations are
75   serialized.
76 
77   If 16-bit I/O port operations are not supported, then ASSERT().
78 
79   @param  Port  The I/O port to read.
80 
81   @return The value read.
82 
83 **/
84 UINT16
85 EFIAPI
86 IoRead16 (
87   IN      UINTN                     Port
88   )
89 {
90   ASSERT (FALSE);
91   return 0;
92 }
93 
94 /**
95   Writes a 16-bit I/O port.
96 
97   Writes the 16-bit I/O port specified by Port with the value specified by Value
98   and returns Value. This function must guarantee that all I/O read and write
99   operations are serialized.
100 
101   If 16-bit I/O port operations are not supported, then ASSERT().
102 
103   @param  Port  The I/O port to write.
104   @param  Value The value to write to the I/O port.
105 
106   @return The value written the I/O port.
107 
108 **/
109 UINT16
110 EFIAPI
111 IoWrite16 (
112   IN      UINTN                     Port,
113   IN      UINT16                    Value
114   )
115 {
116   ASSERT (FALSE);
117   return Value;
118 }
119 
120 /**
121   Reads a 32-bit I/O port.
122 
123   Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
124   This function must guarantee that all I/O read and write operations are
125   serialized.
126 
127   If 32-bit I/O port operations are not supported, then ASSERT().
128 
129   @param  Port  The I/O port to read.
130 
131   @return The value read.
132 
133 **/
134 UINT32
135 EFIAPI
136 IoRead32 (
137   IN      UINTN                     Port
138   )
139 {
140   ASSERT (FALSE);
141   return 0;
142 }
143 
144 /**
145   Writes a 32-bit I/O port.
146 
147   Writes the 32-bit I/O port specified by Port with the value specified by Value
148   and returns Value. This function must guarantee that all I/O read and write
149   operations are serialized.
150 
151   If 32-bit I/O port operations are not supported, then ASSERT().
152 
153   @param  Port  The I/O port to write.
154   @param  Value The value to write to the I/O port.
155 
156   @return The value written the I/O port.
157 
158 **/
159 UINT32
160 EFIAPI
161 IoWrite32 (
162   IN      UINTN                     Port,
163   IN      UINT32                    Value
164   )
165 {
166   ASSERT (FALSE);
167   return Value;
168 }
169 
170 /**
171   Reads a 64-bit I/O port.
172 
173   Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.
174   This function must guarantee that all I/O read and write operations are
175   serialized.
176 
177   If 64-bit I/O port operations are not supported, then ASSERT().
178   If Port is not aligned on a 64-bit boundary, then ASSERT().
179 
180   @param  Port  The I/O port to read.
181 
182   @return The value read.
183 
184 **/
185 UINT64
186 EFIAPI
187 IoRead64 (
188   IN      UINTN                     Port
189   )
190 {
191   ASSERT (FALSE);
192   return 0;
193 }
194 
195 /**
196   Writes a 64-bit I/O port.
197 
198   Writes the 64-bit I/O port specified by Port with the value specified by Value
199   and returns Value. This function must guarantee that all I/O read and write
200   operations are serialized.
201 
202   If 64-bit I/O port operations are not supported, then ASSERT().
203   If Port is not aligned on a 64-bit boundary, then ASSERT().
204 
205   @param  Port  The I/O port to write.
206   @param  Value The value to write to the I/O port.
207 
208   @return The value written to the I/O port.
209 
210 **/
211 UINT64
212 EFIAPI
213 IoWrite64 (
214   IN      UINTN                     Port,
215   IN      UINT64                    Value
216   )
217 {
218   ASSERT (FALSE);
219   return 0;
220 }
221 
222 /**
223   Reads an 8-bit I/O port fifo into a block of memory.
224 
225   Reads the 8-bit I/O fifo port specified by Port.
226   The port is read Count times, and the read data is
227   stored in the provided Buffer.
228 
229   This function must guarantee that all I/O read and write operations are
230   serialized.
231 
232   If 8-bit I/O port operations are not supported, then ASSERT().
233 
234   @param  Port    The I/O port to read.
235   @param  Count   The number of times to read I/O port.
236   @param  Buffer  The buffer to store the read data into.
237 
238 **/
239 VOID
240 EFIAPI
241 IoReadFifo8 (
242   IN      UINTN                     Port,
243   IN      UINTN                     Count,
244   OUT     VOID                      *Buffer
245   )
246 {
247   ASSERT (FALSE);
248 }
249 
250 /**
251   Writes a block of memory into an 8-bit I/O port fifo.
252 
253   Writes the 8-bit I/O fifo port specified by Port.
254   The port is written Count times, and the write data is
255   retrieved from the provided Buffer.
256 
257   This function must guarantee that all I/O write and write operations are
258   serialized.
259 
260   If 8-bit I/O port operations are not supported, then ASSERT().
261 
262   @param  Port    The I/O port to write.
263   @param  Count   The number of times to write I/O port.
264   @param  Buffer  The buffer to retrieve the write data from.
265 
266 **/
267 VOID
268 EFIAPI
269 IoWriteFifo8 (
270   IN      UINTN                     Port,
271   IN      UINTN                     Count,
272   IN      VOID                      *Buffer
273   )
274 {
275   ASSERT (FALSE);
276 }
277 
278 /**
279   Reads a 16-bit I/O port fifo into a block of memory.
280 
281   Reads the 16-bit I/O fifo port specified by Port.
282   The port is read Count times, and the read data is
283   stored in the provided Buffer.
284 
285   This function must guarantee that all I/O read and write operations are
286   serialized.
287 
288   If 16-bit I/O port operations are not supported, then ASSERT().
289 
290   @param  Port    The I/O port to read.
291   @param  Count   The number of times to read I/O port.
292   @param  Buffer  The buffer to store the read data into.
293 
294 **/
295 VOID
296 EFIAPI
297 IoReadFifo16 (
298   IN      UINTN                     Port,
299   IN      UINTN                     Count,
300   OUT     VOID                      *Buffer
301   )
302 {
303   ASSERT (FALSE);
304 }
305 
306 /**
307   Writes a block of memory into a 16-bit I/O port fifo.
308 
309   Writes the 16-bit I/O fifo port specified by Port.
310   The port is written Count times, and the write data is
311   retrieved from the provided Buffer.
312 
313   This function must guarantee that all I/O write and write operations are
314   serialized.
315 
316   If 16-bit I/O port operations are not supported, then ASSERT().
317 
318   @param  Port    The I/O port to write.
319   @param  Count   The number of times to write I/O port.
320   @param  Buffer  The buffer to retrieve the write data from.
321 
322 **/
323 VOID
324 EFIAPI
325 IoWriteFifo16 (
326   IN      UINTN                     Port,
327   IN      UINTN                     Count,
328   IN      VOID                      *Buffer
329   )
330 {
331   ASSERT (FALSE);
332 }
333 
334 /**
335   Reads a 32-bit I/O port fifo into a block of memory.
336 
337   Reads the 32-bit I/O fifo port specified by Port.
338   The port is read Count times, and the read data is
339   stored in the provided Buffer.
340 
341   This function must guarantee that all I/O read and write operations are
342   serialized.
343 
344   If 32-bit I/O port operations are not supported, then ASSERT().
345 
346   @param  Port    The I/O port to read.
347   @param  Count   The number of times to read I/O port.
348   @param  Buffer  The buffer to store the read data into.
349 
350 **/
351 VOID
352 EFIAPI
353 IoReadFifo32 (
354   IN      UINTN                     Port,
355   IN      UINTN                     Count,
356   OUT     VOID                      *Buffer
357   )
358 {
359   ASSERT (FALSE);
360 }
361 
362 /**
363   Writes a block of memory into a 32-bit I/O port fifo.
364 
365   Writes the 32-bit I/O fifo port specified by Port.
366   The port is written Count times, and the write data is
367   retrieved from the provided Buffer.
368 
369   This function must guarantee that all I/O write and write operations are
370   serialized.
371 
372   If 32-bit I/O port operations are not supported, then ASSERT().
373 
374   @param  Port    The I/O port to write.
375   @param  Count   The number of times to write I/O port.
376   @param  Buffer  The buffer to retrieve the write data from.
377 
378 **/
379 VOID
380 EFIAPI
381 IoWriteFifo32 (
382   IN      UINTN                     Port,
383   IN      UINTN                     Count,
384   IN      VOID                      *Buffer
385   )
386 {
387   ASSERT (FALSE);
388 }
389 
390 /**
391   Reads an 8-bit MMIO register.
392 
393   Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
394   returned. This function must guarantee that all MMIO read and write
395   operations are serialized.
396 
397   If 8-bit MMIO register operations are not supported, then ASSERT().
398 
399   @param  Address The MMIO register to read.
400 
401   @return The value read.
402 
403 **/
404 UINT8
405 EFIAPI
406 MmioRead8 (
407   IN      UINTN                     Address
408   )
409 {
410   UINT8                             Value;
411 
412   Value = *(volatile UINT8*)Address;
413   return Value;
414 }
415 
416 /**
417   Writes an 8-bit MMIO register.
418 
419   Writes the 8-bit MMIO register specified by Address with the value specified
420   by Value and returns Value. This function must guarantee that all MMIO read
421   and write operations are serialized.
422 
423   If 8-bit MMIO register operations are not supported, then ASSERT().
424 
425   @param  Address The MMIO register to write.
426   @param  Value   The value to write to the MMIO register.
427 
428 **/
429 UINT8
430 EFIAPI
431 MmioWrite8 (
432   IN      UINTN                     Address,
433   IN      UINT8                     Value
434   )
435 {
436   *(volatile UINT8*)Address = Value;
437   return Value;
438 }
439 
440 /**
441   Reads a 16-bit MMIO register.
442 
443   Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
444   returned. This function must guarantee that all MMIO read and write
445   operations are serialized.
446 
447   If 16-bit MMIO register operations are not supported, then ASSERT().
448 
449   @param  Address The MMIO register to read.
450 
451   @return The value read.
452 
453 **/
454 UINT16
455 EFIAPI
456 MmioRead16 (
457   IN      UINTN                     Address
458   )
459 {
460   UINT16                            Value;
461 
462   ASSERT ((Address & 1) == 0);
463   Value = *(volatile UINT16*)Address;
464   return Value;
465 }
466 
467 /**
468   Writes a 16-bit MMIO register.
469 
470   Writes the 16-bit MMIO register specified by Address with the value specified
471   by Value and returns Value. This function must guarantee that all MMIO read
472   and write operations are serialized.
473 
474   If 16-bit MMIO register operations are not supported, then ASSERT().
475 
476   @param  Address The MMIO register to write.
477   @param  Value   The value to write to the MMIO register.
478 
479 **/
480 UINT16
481 EFIAPI
482 MmioWrite16 (
483   IN      UINTN                     Address,
484   IN      UINT16                    Value
485   )
486 {
487   ASSERT ((Address & 1) == 0);
488   *(volatile UINT16*)Address = Value;
489   return Value;
490 }
491 
492 /**
493   Reads a 32-bit MMIO register.
494 
495   Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
496   returned. This function must guarantee that all MMIO read and write
497   operations are serialized.
498 
499   If 32-bit MMIO register operations are not supported, then ASSERT().
500 
501   @param  Address The MMIO register to read.
502 
503   @return The value read.
504 
505 **/
506 UINT32
507 EFIAPI
508 MmioRead32 (
509   IN      UINTN                     Address
510   )
511 {
512   UINT32                            Value;
513 
514   ASSERT ((Address & 3) == 0);
515   Value = *(volatile UINT32*)Address;
516   return Value;
517 }
518 
519 /**
520   Writes a 32-bit MMIO register.
521 
522   Writes the 32-bit MMIO register specified by Address with the value specified
523   by Value and returns Value. This function must guarantee that all MMIO read
524   and write operations are serialized.
525 
526   If 32-bit MMIO register operations are not supported, then ASSERT().
527 
528   @param  Address The MMIO register to write.
529   @param  Value   The value to write to the MMIO register.
530 
531 **/
532 UINT32
533 EFIAPI
534 MmioWrite32 (
535   IN      UINTN                     Address,
536   IN      UINT32                    Value
537   )
538 {
539   ASSERT ((Address & 3) == 0);
540   *(volatile UINT32*)Address = Value;
541   return Value;
542 }
543 
544 /**
545   Reads a 64-bit MMIO register.
546 
547   Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
548   returned. This function must guarantee that all MMIO read and write
549   operations are serialized.
550 
551   If 64-bit MMIO register operations are not supported, then ASSERT().
552 
553   @param  Address The MMIO register to read.
554 
555   @return The value read.
556 
557 **/
558 UINT64
559 EFIAPI
560 MmioRead64 (
561   IN      UINTN                     Address
562   )
563 {
564   UINT64                            Value;
565 
566   ASSERT ((Address & 7) == 0);
567   Value = *(volatile UINT64*)Address;
568   return Value;
569 }
570 
571 /**
572   Writes a 64-bit MMIO register.
573 
574   Writes the 64-bit MMIO register specified by Address with the value specified
575   by Value and returns Value. This function must guarantee that all MMIO read
576   and write operations are serialized.
577 
578   If 64-bit MMIO register operations are not supported, then ASSERT().
579 
580   @param  Address The MMIO register to write.
581   @param  Value   The value to write to the MMIO register.
582 
583 **/
584 UINT64
585 EFIAPI
586 MmioWrite64 (
587   IN      UINTN                     Address,
588   IN      UINT64                    Value
589   )
590 {
591   ASSERT ((Address & 7) == 0);
592   *(volatile UINT64*)Address = Value;
593   return Value;
594 }
595 
596