Files
android_kernel_xiaomi_sm8450/arch/arm64/include/asm/dma-mapping-noalias.h
Robin Murphy 3c75a6fb7f ANDROID: arm64: Work around Cortex-A510 erratum 2454944
Cortex-A510 erratum 2454944 may cause clean cache lines to be
erroneously written back to memory, breaking the assumptions we rely on
for non-coherent DMA. Try to mitigate this by implementing special DMA
ops that do their best to avoid cacheable aliases via a combination of
bounce-buffering and manipulating the linear map directly, to minimise
the chance of DMA-mapped pages being speculated back into caches.

The other main concern is initial entry, where cache lines covering the
kernel image might potentially become affected between being cleaned by
the bootloader and the kernel being called, which might require additional
cache maintenance from the bootloader to be safe in that regard too.
Cortex-A510 supports S2FWB, so KVM should be unaffected.

For the workaround to be applied, it needs to be explicitly requested
through dedicated arm64_noalias_setup_dma_ops callback.

Bug: 223346425
(cherry picked from commit 683efc5fc6eeb653caf85c33a2fb92a33c8faa75
 https://git.gitlab.arm.com/linux-arm/linux-rm.git arm64/2454944-dev)
Change-Id: If76b97dc39c278edb80f9b750129975ab2ac563e
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
[BM: Stripping-down the original solution by removing support for
     cpu capabilities and ammending relevant bits, with the final
     version being reduced to dedicated DMA ops with dependencies on
     rodata_full being enabled (CONFIG_RODATA_FULL_DEFAULT_ENABLED),
     swiotlb late init and disabling lazy tlb flushing.
     Also, as a consequence, reducing debugging support.]
Signed-off-by: Beata Michalska <beata.michalska@arm.com>
2023-02-09 18:53:48 +00:00

16 lines
375 B
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2022-2023 ARM Ltd.
*/
#ifndef __ASM_DMA_MAPPING_NOALIAS_H
#define __ASM_DMA_MAPPING_NOALIAS_H
#ifdef CONFIG_ARM64_ERRATUM_2454944
void arm64_noalias_setup_dma_ops(struct device *dev);
#else
static inline void arm64_noalias_setup_dma_ops(struct device *dev)
{
}
#endif
#endif /* __ASM_DMA_MAPPING_NOALIAS_H */