);\r
\r
\r
-#endif\r
+/**\r
+ Allocates pages that are suitable for an DmaMap() of type\r
+ MapOperationBusMasterCommonBuffer mapping, at the requested alignment.\r
+\r
+ @param MemoryType The type of memory to allocate, EfiBootServicesData or\r
+ EfiRuntimeServicesData.\r
+ @param Pages The number of pages to allocate.\r
+ @param Alignment Alignment in bytes of the base of the returned\r
+ buffer (must be a power of 2)\r
+ @param HostAddress A pointer to store the base system memory address of the\r
+ allocated range.\r
\r
+ @retval EFI_SUCCESS The requested memory pages were allocated.\r
+ @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are\r
+ MEMORY_WRITE_COMBINE and MEMORY_CACHED.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DmaAllocateAlignedBuffer (\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN UINTN Pages,\r
+ IN UINTN Alignment,\r
+ OUT VOID **HostAddress\r
+ );\r
+\r
+\r
+#endif\r
OUT VOID **HostAddress\r
)\r
{\r
- if (HostAddress == NULL) {\r
+ return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress);\r
+}\r
+\r
+\r
+/**\r
+ Allocates pages that are suitable for an DmaMap() of type\r
+ MapOperationBusMasterCommonBuffer mapping, at the requested alignment.\r
+\r
+ @param MemoryType The type of memory to allocate, EfiBootServicesData or\r
+ EfiRuntimeServicesData.\r
+ @param Pages The number of pages to allocate.\r
+ @param Alignment Alignment in bytes of the base of the returned\r
+ buffer (must be a power of 2)\r
+ @param HostAddress A pointer to store the base system memory address of the\r
+ allocated range.\r
+\r
+ @retval EFI_SUCCESS The requested memory pages were allocated.\r
+ @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are\r
+ MEMORY_WRITE_COMBINE and MEMORY_CACHED.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DmaAllocateAlignedBuffer (\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN UINTN Pages,\r
+ IN UINTN Alignment,\r
+ OUT VOID **HostAddress\r
+ )\r
+{\r
+ if (Alignment == 0) {\r
+ Alignment = EFI_PAGE_SIZE;\r
+ }\r
+\r
+ if (HostAddress == NULL ||\r
+ (Alignment & (Alignment - 1)) != 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// The only valid memory types are EfiBootServicesData and EfiRuntimeServicesData\r
//\r
- // We used uncached memory to keep coherency\r
- //\r
if (MemoryType == EfiBootServicesData) {\r
- *HostAddress = AllocatePages (Pages);\r
+ *HostAddress = AllocateAlignedPages (Pages, Alignment);\r
} else if (MemoryType != EfiRuntimeServicesData) {\r
- *HostAddress = AllocateRuntimePages (Pages);\r
+ *HostAddress = AllocateAlignedRuntimePages (Pages, Alignment);\r
} else {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (*HostAddress == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
return EFI_SUCCESS;\r
}\r
\r