On 9 May 2016 at 18:37, Leif Lindholm <[email protected]> wrote:
> On Tue, Apr 19, 2016 at 04:55:33PM +0200, Ard Biesheuvel wrote:
>> DmaMap () operations of type MapOperationBusMasterCommonBuffer should
>> return a mapping that is coherent between the CPU and the device. For
>> this reason, the API only allows DmaMap () to be called with this operation
>> type if the memory to be mapped was allocated by DmaAllocateBuffer (),
>> which in this implementation guarantees the coherency by using uncached
>> mappings on the CPU side.
>>
>> This means that, if we encounter a cached mapping in DmaMap () with this
>> operation type, the code is either broken, or someone is violating the
>> API, but simply proceeding with a double buffer makes no sense at all,
>> and can only cause problems.
>>
>> So instead, actively reject this operation type for cached memory mappings.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ard Biesheuvel <[email protected]>
>> ---
>>  ArmPkg/Library/ArmDmaLib/ArmDmaLib.c | 18 ++++++++++++++++--
>>  1 file changed, 16 insertions(+), 2 deletions(-)
>>
>> diff --git a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c 
>> b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
>> index 7f6598318a91..7e518ed3b83e 100644
>> --- a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
>> +++ b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
>> @@ -103,6 +103,18 @@ DmaMap (
>>      // If the mapped buffer is not an uncached buffer
>>      if ((GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) != 0) {
>>        //
>> +      // Operations of type MapOperationBusMasterCommonBuffer are only 
>> allowed
>> +      // on uncached buffers.
>> +      //
>> +      if (Operation == MapOperationBusMasterCommonBuffer) {
>> +        DEBUG ((EFI_D_ERROR,
>> +          "%a: Operation type 'MapOperationBusMasterCommonBuffer' is only 
>> supported\n"
>> +          "on memory regions that were allocated using DmaAllocateBuffer 
>> ()\n",
>> +          __FUNCTION__));
>> +        return EFI_UNSUPPORTED;
>> +      }
>> +
>> +      //
>>        // If the buffer does not fill entire cache lines we must double 
>> buffer into
>>        // uncached memory. Device (PCI) address becomes uncached page.
>>        //
>> @@ -112,7 +124,7 @@ DmaMap (
>>          return Status;
>>        }
>>
>> -      if ((Operation == MapOperationBusMasterRead) || (Operation == 
>> MapOperationBusMasterCommonBuffer)) {
>> +      if (Operation == MapOperationBusMasterRead) {
>>          CopyMem (Buffer, HostAddress, *NumberOfBytes);
>>        }
>>
>> @@ -168,7 +180,9 @@ DmaUnmap (
>>    Map = (MAP_INFO_INSTANCE *)Mapping;
>>
>>    if (Map->DoubleBuffer) {
>> -    if ((Map->Operation == MapOperationBusMasterWrite) || (Map->Operation 
>> == MapOperationBusMasterCommonBuffer)) {
>> +    ASSERT (Map->Operation != MapOperationBusMasterCommonBuffer);
>
> Would it be more correct to return EFI_DEVICE_ERROR if this
> condition became true?
>

I don't think so. We should never create double buffer mappings for
MapOperationBusMasterCommonBuffer operations, so in the unmap path, an
ASSERT () is appropriate, since the code is doing something *very* if
this ever occurs.
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to