On Tue, May 10, 2016 at 12:58:08PM +0200, Ard Biesheuvel wrote: > On 9 May 2016 at 22:17, Leif Lindholm <[email protected]> wrote: > > On Mon, May 09, 2016 at 06:44:42PM +0200, Ard Biesheuvel wrote: > >> 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. > > > > Yeah, that was kind of my meaning: > > The only way it could happen would be through > > * memory corruption > > * intentional manipulation of the structure > > both of which would make it hard to guarantee that the data had been > > "committed to the target system memory". > > > > Indeed. So an ASSERT () is appropriate here, but I guess you were > looking for an equivalent in RELEASE builds? In that case, > EFI_INVALID_PARAMETER seems more appropriate
Yeah - so could we have both? If so, just change and push. > > Anyway, it's not a hard requirement, more of a discussion point. > > > > Reviewed-by: Leif Lindholm <[email protected]> _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

