1/** @file
2  Generic ARM implementation of DmaLib.h
3
4  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
5
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#include <Uefi.h>
17#include <Library/DebugLib.h>
18#include <Library/DmaLib.h>
19#include <Library/MemoryAllocationLib.h>
20
21
22
23/**
24  Provides the DMA controller-specific addresses needed to access system memory.
25
26  Operation is relative to the DMA bus master.
27
28  @param  Operation             Indicates if the bus master is going to read or write to system memory.
29  @param  HostAddress           The system memory address to map to the DMA controller.
30  @param  NumberOfBytes         On input the number of bytes to map. On output the number of bytes
31                                that were mapped.
32  @param  DeviceAddress         The resulting map address for the bus master controller to use to
33                                access the hosts HostAddress.
34  @param  Mapping               A resulting value to pass to Unmap().
35
36  @retval EFI_SUCCESS           The range was mapped for the returned NumberOfBytes.
37  @retval EFI_UNSUPPORTED       The HostAddress cannot be mapped as a common buffer.
38  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
39  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
40  @retval EFI_DEVICE_ERROR      The system hardware could not map the requested address.
41
42**/
43EFI_STATUS
44EFIAPI
45DmaMap (
46  IN     DMA_MAP_OPERATION              Operation,
47  IN     VOID                           *HostAddress,
48  IN OUT UINTN                          *NumberOfBytes,
49  OUT    PHYSICAL_ADDRESS               *DeviceAddress,
50  OUT    VOID                           **Mapping
51  )
52{
53  *DeviceAddress = (PHYSICAL_ADDRESS)(UINTN)HostAddress;
54  *Mapping = NULL;
55  return EFI_SUCCESS;
56}
57
58
59/**
60  Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer()
61  operation and releases any corresponding resources.
62
63  @param  Mapping               The mapping value returned from DmaMap*().
64
65  @retval EFI_SUCCESS           The range was unmapped.
66  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
67
68**/
69EFI_STATUS
70EFIAPI
71DmaUnmap (
72  IN  VOID                         *Mapping
73  )
74{
75  return EFI_SUCCESS;
76}
77
78/**
79  Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.
80  mapping.
81
82  @param  MemoryType            The type of memory to allocate, EfiBootServicesData or
83                                EfiRuntimeServicesData.
84  @param  Pages                 The number of pages to allocate.
85  @param  HostAddress           A pointer to store the base system memory address of the
86                                allocated range.
87
88                                @retval EFI_SUCCESS           The requested memory pages were allocated.
89  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
90                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
91  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
92  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
93
94**/
95EFI_STATUS
96EFIAPI
97DmaAllocateBuffer (
98  IN  EFI_MEMORY_TYPE              MemoryType,
99  IN  UINTN                        Pages,
100  OUT VOID                         **HostAddress
101  )
102{
103  if (HostAddress == NULL) {
104    return EFI_INVALID_PARAMETER;
105  }
106
107  //
108  // The only valid memory types are EfiBootServicesData and EfiRuntimeServicesData
109  //
110  // We used uncached memory to keep coherency
111  //
112  if (MemoryType == EfiBootServicesData) {
113    *HostAddress = AllocatePages (Pages);
114  } else if (MemoryType != EfiRuntimeServicesData) {
115    *HostAddress = AllocateRuntimePages (Pages);
116  } else {
117    return EFI_INVALID_PARAMETER;
118  }
119
120  return EFI_SUCCESS;
121}
122
123
124/**
125  Frees memory that was allocated with DmaAllocateBuffer().
126
127  @param  Pages                 The number of pages to free.
128  @param  HostAddress           The base system memory address of the allocated range.
129
130  @retval EFI_SUCCESS           The requested memory pages were freed.
131  @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages
132                                was not allocated with DmaAllocateBuffer().
133
134**/
135EFI_STATUS
136EFIAPI
137DmaFreeBuffer (
138  IN  UINTN                        Pages,
139  IN  VOID                         *HostAddress
140  )
141{
142  if (HostAddress == NULL) {
143     return EFI_INVALID_PARAMETER;
144  }
145
146  FreePages (HostAddress, Pages);
147  return EFI_SUCCESS;
148}
149
150