• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   I/O Library MMIO Buffer Functions.
3 
4   Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13   Module Name:  IoLibMmioBuffer.c
14 
15 **/
16 
17 
18 #include "DxeCpuIoLibInternal.h"
19 
20 /**
21   Copy data from MMIO region to system memory by using 8-bit access.
22 
23   Copy data from MMIO region specified by starting address StartAddress
24   to system memory specified by Buffer by using 8-bit access. The total
25   number of byte to be copied is specified by Length. Buffer is returned.
26 
27   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
28   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
29 
30 
31   @param  StartAddress    Starting address for the MMIO region to be copied from.
32   @param  Length          Size in bytes of the copy.
33   @param  Buffer          Pointer to a system memory buffer receiving the data read.
34 
35   @return Buffer
36 
37 **/
38 UINT8 *
39 EFIAPI
MmioReadBuffer8(IN UINTN StartAddress,IN UINTN Length,OUT UINT8 * Buffer)40 MmioReadBuffer8 (
41   IN  UINTN       StartAddress,
42   IN  UINTN       Length,
43   OUT UINT8       *Buffer
44   )
45 {
46   UINT8   *ReturnBuffer;
47 
48   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
49   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
50 
51   ReturnBuffer = Buffer;
52 
53   while (Length-- > 0) {
54     *(Buffer++) = MmioRead8 (StartAddress++);
55   }
56 
57   return ReturnBuffer;
58 }
59 
60 /**
61   Copy data from MMIO region to system memory by using 16-bit access.
62 
63   Copy data from MMIO region specified by starting address StartAddress
64   to system memory specified by Buffer by using 16-bit access. The total
65   number of byte to be copied is specified by Length. Buffer is returned.
66 
67   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
68 
69   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
70   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
71 
72   If Length is not aligned on a 16-bit boundary, then ASSERT().
73 
74   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
75 
76   @param  StartAddress    Starting address for the MMIO region to be copied from.
77   @param  Length          Size in bytes of the copy.
78   @param  Buffer          Pointer to a system memory buffer receiving the data read.
79 
80   @return Buffer
81 
82 **/
83 UINT16 *
84 EFIAPI
MmioReadBuffer16(IN UINTN StartAddress,IN UINTN Length,OUT UINT16 * Buffer)85 MmioReadBuffer16 (
86   IN  UINTN       StartAddress,
87   IN  UINTN       Length,
88   OUT UINT16      *Buffer
89   )
90 {
91   UINT16    *ReturnBuffer;
92 
93   ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);
94 
95   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
96   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
97 
98   ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);
99   ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);
100 
101   ReturnBuffer = Buffer;
102 
103   while (Length > 0) {
104     *(Buffer++) = MmioRead16 (StartAddress);
105     StartAddress += sizeof (UINT16);
106     Length -= sizeof (UINT16);
107   }
108 
109   return ReturnBuffer;
110 }
111 
112 /**
113   Copy data from MMIO region to system memory by using 32-bit access.
114 
115   Copy data from MMIO region specified by starting address StartAddress
116   to system memory specified by Buffer by using 32-bit access. The total
117   number of byte to be copied is specified by Length. Buffer is returned.
118 
119   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
120 
121   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
122   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
123 
124   If Length is not aligned on a 32-bit boundary, then ASSERT().
125   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
126 
127   @param  StartAddress    Starting address for the MMIO region to be copied from.
128   @param  Length          Size in bytes of the copy.
129   @param  Buffer          Pointer to a system memory buffer receiving the data read.
130 
131   @return Buffer
132 
133 **/
134 UINT32 *
135 EFIAPI
MmioReadBuffer32(IN UINTN StartAddress,IN UINTN Length,OUT UINT32 * Buffer)136 MmioReadBuffer32 (
137   IN  UINTN       StartAddress,
138   IN  UINTN       Length,
139   OUT UINT32      *Buffer
140   )
141 {
142   UINT32    *ReturnBuffer;
143 
144   ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);
145 
146   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
147   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
148 
149   ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);
150   ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);
151 
152   ReturnBuffer = Buffer;
153 
154   while (Length > 0) {
155     *(Buffer++) = MmioRead32 (StartAddress);
156     StartAddress += sizeof (UINT32);
157     Length -= sizeof (UINT32);
158   }
159 
160   return ReturnBuffer;
161 }
162 
163 /**
164   Copy data from MMIO region to system memory by using 64-bit access.
165 
166   Copy data from MMIO region specified by starting address StartAddress
167   to system memory specified by Buffer by using 64-bit access. The total
168   number of byte to be copied is specified by Length. Buffer is returned.
169 
170   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
171 
172   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
173   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
174 
175   If Length is not aligned on a 64-bit boundary, then ASSERT().
176 
177   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
178 
179   @param  StartAddress    Starting address for the MMIO region to be copied from.
180   @param  Length          Size in bytes of the copy.
181   @param  Buffer          Pointer to a system memory buffer receiving the data read.
182 
183   @return Buffer
184 
185 **/
186 UINT64 *
187 EFIAPI
MmioReadBuffer64(IN UINTN StartAddress,IN UINTN Length,OUT UINT64 * Buffer)188 MmioReadBuffer64 (
189   IN  UINTN       StartAddress,
190   IN  UINTN       Length,
191   OUT UINT64      *Buffer
192   )
193 {
194   UINT64    *ReturnBuffer;
195 
196   ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);
197 
198   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
199   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
200 
201   ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);
202   ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);
203 
204   ReturnBuffer = Buffer;
205 
206   while (Length > 0) {
207     *(Buffer++) = MmioRead64 (StartAddress);
208     StartAddress += sizeof (UINT64);
209     Length -= sizeof (UINT64);
210   }
211 
212   return ReturnBuffer;
213 }
214 
215 
216 /**
217   Copy data from system memory to MMIO region by using 8-bit access.
218 
219   Copy data from system memory specified by Buffer to MMIO region specified
220   by starting address StartAddress by using 8-bit access. The total number
221   of byte to be copied is specified by Length. Buffer is returned.
222 
223   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
224   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
225 
226 
227   @param  StartAddress    Starting address for the MMIO region to be copied to.
228   @param  Length     Size in bytes of the copy.
229   @param  Buffer          Pointer to a system memory buffer containing the data to write.
230 
231   @return Buffer
232 
233 **/
234 UINT8 *
235 EFIAPI
MmioWriteBuffer8(IN UINTN StartAddress,IN UINTN Length,IN CONST UINT8 * Buffer)236 MmioWriteBuffer8 (
237   IN  UINTN         StartAddress,
238   IN  UINTN         Length,
239   IN  CONST UINT8   *Buffer
240   )
241 {
242   VOID* ReturnBuffer;
243 
244   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
245   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
246 
247   ReturnBuffer = (UINT8 *) Buffer;
248 
249   while (Length-- > 0) {
250      MmioWrite8 (StartAddress++, *(Buffer++));
251   }
252 
253   return ReturnBuffer;
254 
255 }
256 
257 /**
258   Copy data from system memory to MMIO region by using 16-bit access.
259 
260   Copy data from system memory specified by Buffer to MMIO region specified
261   by starting address StartAddress by using 16-bit access. The total number
262   of byte to be copied is specified by Length. Buffer is returned.
263 
264   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
265 
266   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
267   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
268 
269   If Length is not aligned on a 16-bit boundary, then ASSERT().
270 
271   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
272 
273   @param  StartAddress    Starting address for the MMIO region to be copied to.
274   @param  Length     Size in bytes of the copy.
275   @param  Buffer          Pointer to a system memory buffer containing the data to write.
276 
277   @return Buffer
278 
279 **/
280 UINT16 *
281 EFIAPI
MmioWriteBuffer16(IN UINTN StartAddress,IN UINTN Length,IN CONST UINT16 * Buffer)282 MmioWriteBuffer16 (
283   IN  UINTN        StartAddress,
284   IN  UINTN        Length,
285   IN  CONST UINT16 *Buffer
286   )
287 {
288   UINT16    *ReturnBuffer;
289 
290   ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);
291 
292   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
293   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
294 
295   ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);
296   ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);
297 
298   ReturnBuffer = (UINT16 *) Buffer;
299 
300   while (Length > 0) {
301     MmioWrite16 (StartAddress, *(Buffer++));
302 
303     StartAddress += sizeof (UINT16);
304     Length -= sizeof (UINT16);
305   }
306 
307   return ReturnBuffer;
308 }
309 
310 
311 /**
312   Copy data from system memory to MMIO region by using 32-bit access.
313 
314   Copy data from system memory specified by Buffer to MMIO region specified
315   by starting address StartAddress by using 32-bit access. The total number
316   of byte to be copied is specified by Length. Buffer is returned.
317 
318   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
319 
320   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
321   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
322 
323   If Length is not aligned on a 32-bit boundary, then ASSERT().
324 
325   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
326 
327   @param  StartAddress    Starting address for the MMIO region to be copied to.
328   @param  Length     Size in bytes of the copy.
329   @param  Buffer          Pointer to a system memory buffer containing the data to write.
330 
331   @return Buffer
332 
333 **/
334 UINT32 *
335 EFIAPI
MmioWriteBuffer32(IN UINTN StartAddress,IN UINTN Length,IN CONST UINT32 * Buffer)336 MmioWriteBuffer32 (
337   IN  UINTN        StartAddress,
338   IN  UINTN        Length,
339   IN  CONST UINT32 *Buffer
340   )
341 {
342   UINT32    *ReturnBuffer;
343 
344   ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);
345 
346   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
347   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
348 
349   ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);
350   ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);
351 
352   ReturnBuffer = (UINT32 *) Buffer;
353 
354   while (Length > 0) {
355     MmioWrite32 (StartAddress, *(Buffer++));
356 
357     StartAddress += sizeof (UINT32);
358     Length -= sizeof (UINT32);
359   }
360 
361   return ReturnBuffer;
362 }
363 
364 /**
365   Copy data from system memory to MMIO region by using 64-bit access.
366 
367   Copy data from system memory specified by Buffer to MMIO region specified
368   by starting address StartAddress by using 64-bit access. The total number
369   of byte to be copied is specified by Length. Buffer is returned.
370 
371   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
372 
373   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
374   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
375 
376   If Length is not aligned on a 64-bit boundary, then ASSERT().
377 
378   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
379 
380   @param  StartAddress    Starting address for the MMIO region to be copied to.
381   @param  Length     Size in bytes of the copy.
382   @param  Buffer          Pointer to a system memory buffer containing the data to write.
383 
384   @return Buffer
385 
386 **/
387 UINT64 *
388 EFIAPI
MmioWriteBuffer64(IN UINTN StartAddress,IN UINTN Length,IN CONST UINT64 * Buffer)389 MmioWriteBuffer64 (
390   IN  UINTN        StartAddress,
391   IN  UINTN        Length,
392   IN  CONST UINT64 *Buffer
393   )
394 {
395   UINT64    *ReturnBuffer;
396 
397   ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);
398 
399   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));
400   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));
401 
402   ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);
403   ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);
404 
405   ReturnBuffer = (UINT64 *) Buffer;
406 
407   while (Length > 0) {
408     MmioWrite64 (StartAddress, *(Buffer++));
409 
410     StartAddress += sizeof (UINT64);
411     Length -= sizeof (UINT64);
412   }
413 
414   return ReturnBuffer;
415 }
416 
417