162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Memory Encryption Support Common Code 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2016 Advanced Micro Devices, Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Tom Lendacky <thomas.lendacky@amd.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/dma-direct.h> 1162306a36Sopenharmony_ci#include <linux/dma-mapping.h> 1262306a36Sopenharmony_ci#include <linux/swiotlb.h> 1362306a36Sopenharmony_ci#include <linux/cc_platform.h> 1462306a36Sopenharmony_ci#include <linux/mem_encrypt.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */ 1762306a36Sopenharmony_cibool force_dma_unencrypted(struct device *dev) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci /* 2062306a36Sopenharmony_ci * For SEV, all DMA must be to unencrypted addresses. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) 2362306a36Sopenharmony_ci return true; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci /* 2662306a36Sopenharmony_ci * For SME, all DMA must be to unencrypted addresses if the 2762306a36Sopenharmony_ci * device does not support DMA to addresses that include the 2862306a36Sopenharmony_ci * encryption mask. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { 3162306a36Sopenharmony_ci u64 dma_enc_mask = DMA_BIT_MASK(__ffs64(sme_me_mask)); 3262306a36Sopenharmony_ci u64 dma_dev_mask = min_not_zero(dev->coherent_dma_mask, 3362306a36Sopenharmony_ci dev->bus_dma_limit); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (dma_dev_mask <= dma_enc_mask) 3662306a36Sopenharmony_ci return true; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return false; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic void print_mem_encrypt_feature_info(void) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci pr_info("Memory Encryption Features active:"); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST)) { 4762306a36Sopenharmony_ci pr_cont(" Intel TDX\n"); 4862306a36Sopenharmony_ci return; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci pr_cont(" AMD"); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci /* Secure Memory Encryption */ 5462306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { 5562306a36Sopenharmony_ci /* 5662306a36Sopenharmony_ci * SME is mutually exclusive with any of the SEV 5762306a36Sopenharmony_ci * features below. 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_ci pr_cont(" SME\n"); 6062306a36Sopenharmony_ci return; 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /* Secure Encrypted Virtualization */ 6462306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) 6562306a36Sopenharmony_ci pr_cont(" SEV"); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* Encrypted Register State */ 6862306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) 6962306a36Sopenharmony_ci pr_cont(" SEV-ES"); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* Secure Nested Paging */ 7262306a36Sopenharmony_ci if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) 7362306a36Sopenharmony_ci pr_cont(" SEV-SNP"); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci pr_cont("\n"); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* Architecture __weak replacement functions */ 7962306a36Sopenharmony_civoid __init mem_encrypt_init(void) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci if (!cc_platform_has(CC_ATTR_MEM_ENCRYPT)) 8262306a36Sopenharmony_ci return; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* Call into SWIOTLB to update the SWIOTLB DMA buffers */ 8562306a36Sopenharmony_ci swiotlb_update_mem_attributes(); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci print_mem_encrypt_feature_info(); 8862306a36Sopenharmony_ci} 89