Files
Centos-kernel-stream-9/include/linux/mem_encrypt.h
T
Jerry Snitselaar 7141d5718d dma: Introduce generic dma_addr_*crypted helpers
JIRA: https://issues.redhat.com/browse/RHEL-114131
Upstream-Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

commit b66e2ee7b6c8d45bbe4b6f6885ee27511506812c
Author: Suzuki K Poulose <suzuki.poulose@arm.com>
Date: Thu Feb 27 14:41:49 2025 +0000

    dma: Introduce generic dma_addr_*crypted helpers

    AMD SME added __sme_set/__sme_clr primitives to modify the DMA address for
    encrypted/decrypted traffic. However this doesn't fit in with other models,
    e.g., Arm CCA where the meanings are the opposite. i.e., "decrypted" traffic
    has a bit set and "encrypted" traffic has the top bit cleared.

    In preparation for adding the support for Arm CCA DMA conversions, convert the
    existing primitives to more generic ones that can be provided by the backends.
    i.e., add helpers to
     1. dma_addr_encrypted - Convert a DMA address to "encrypted" [ == __sme_set() ]
     2. dma_addr_unencrypted - Convert a DMA address to "decrypted" [ None exists today ]
     3. dma_addr_canonical - Clear any "encryption"/"decryption" bits from DMA
	address [ SME uses __sme_clr() ] and convert to a canonical DMA address.

    Since the original __sme_xxx helpers come from linux/mem_encrypt.h, use that
    as the home for the new definitions and provide dummy ones when none is provided
    by the architectures.

    With the above, phys_to_dma_unencrypted() uses the newly added dma_addr_unencrypted()
    helper and to make it a bit more easier to read and avoid double conversion,
    provide __phys_to_dma().

    Suggested-by: Robin Murphy <robin.murphy@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>
    Cc: Robin Murphy <robin.murphy@arm.com>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Reviewed-by: Robin Murphy <robin.murphy@arm.com>
    Reviewed-by: Gavin Shan <gshan@redhat.com>
    Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Fixes: 42be24a4178f ("arm64: Enable memory encrypt for Realms")
    Acked-by: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20250227144150.1667735-3-suzuki.poulose@arm.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>

(cherry picked from commit b66e2ee7b6c8d45bbe4b6f6885ee27511506812c)
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
2025-11-19 10:23:38 -07:00

60 lines
1.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* AMD Memory Encryption Support
*
* Copyright (C) 2016 Advanced Micro Devices, Inc.
*
* Author: Tom Lendacky <thomas.lendacky@amd.com>
*/
#ifndef __MEM_ENCRYPT_H__
#define __MEM_ENCRYPT_H__
#ifndef __ASSEMBLY__
#ifdef CONFIG_ARCH_HAS_MEM_ENCRYPT
#include <asm/mem_encrypt.h>
#endif /* CONFIG_ARCH_HAS_MEM_ENCRYPT */
#ifdef CONFIG_AMD_MEM_ENCRYPT
/*
* The __sme_set() and __sme_clr() macros are useful for adding or removing
* the encryption mask from a value (e.g. when dealing with pagetable
* entries).
*/
#define __sme_set(x) ((x) | sme_me_mask)
#define __sme_clr(x) ((x) & ~sme_me_mask)
#define dma_addr_encrypted(x) __sme_set(x)
#define dma_addr_canonical(x) __sme_clr(x)
#else
#define __sme_set(x) (x)
#define __sme_clr(x) (x)
#endif
/*
* dma_addr_encrypted() and dma_addr_unencrypted() are for converting a given DMA
* address to the respective type of addressing.
*
* dma_addr_canonical() is used to reverse any conversions for encrypted/decrypted
* back to the canonical address.
*/
#ifndef dma_addr_encrypted
#define dma_addr_encrypted(x) (x)
#endif
#ifndef dma_addr_unencrypted
#define dma_addr_unencrypted(x) (x)
#endif
#ifndef dma_addr_canonical
#define dma_addr_canonical(x) (x)
#endif
#endif /* __ASSEMBLY__ */
#endif /* __MEM_ENCRYPT_H__ */