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