From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756892AbcHVXuB (ORCPT ); Mon, 22 Aug 2016 19:50:01 -0400 Received: from mail-by2nam03on0048.outbound.protection.outlook.com ([104.47.42.48]:45664 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754221AbcHVXtv (ORCPT ); Mon, 22 Aug 2016 19:49:51 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Subject: [RFC PATCH v1 12/28] x86: DMA support for SEV memory encryption From: Brijesh Singh To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Date: Mon, 22 Aug 2016 19:26:02 -0400 Message-ID: <147190836254.9523.17071309814378405604.stgit@brijesh-build-machine> In-Reply-To: <147190820782.9523.4967724730957229273.stgit@brijesh-build-machine> References: <147190820782.9523.4967724730957229273.stgit@brijesh-build-machine> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BY2PR21CA0003.namprd21.prod.outlook.com (10.162.74.141) To BY2PR12MB0663.namprd12.prod.outlook.com (10.163.113.152) X-MS-Office365-Filtering-Correlation-Id: 82708357-803b-4255-2c4e-08d3cae3b196 X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0663;2:fF0CV2VnB3rYQqnFkoTbaNsI9Drl/giuZpE3h/B6KXPKblP+wsX/H0jDCMveExqQ3+MiaHs2uR/Cm/qIAvyIZA3/sYmjGpga105Dox9jf4F445kkbIWVzSKlPZX10zGNmNHzsDyXS4evileAY7QfEAtIcUs8albo2WcMh4y/nDyzXbPNpuxE5/J1bvkfjYHG;3:NMKRa8BZcGxw2Gwn3Z+lGVxgA+CJ6ssrr7ajdmf52VjxMA/SfivFUKmdUflJWuTLPkte1W5WfS5mLX7BlTY8imy8kscZCR3lZrbscC/ifEKZYpZW1m3c2ejrmKr+MR6a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR12MB0663; X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0663;25:RWGRQIUeZGQ+gXboWP29K7pDWiXGD6r3lV6jJBiuLl+MeXohMov8VWQ58FwFuxetguAc2NwTsyVp4G9HCjoK0ntd2yYtNiTNoJrbvAtrMTDPMLwV9A9n3wLr/iFSUAy42Y5iG1uHc8WEU+j7v075Mmnkvd9cwowHnFNaiyuX7etGIc4q7U6RM0pnYlG3+AherkDtDLdkQgyYVFo1CpAgqBmDLafNk+57Z6b464RvYycYZjVYSHZJTNWXppnmU2DZl/NRA4dkxI4WhWSlfiOahspMMdR4nqmcbeb0RpTZfw3tJjByBte/SXANQXCRhd3zibWe7iKO0MnrPLrlGUbQXw6QlIllrY6j+00RKCsOB0Udlke1gazxBYOT2iPx99st9/EET9I7qfPCOXZsfquFTTlbt+ltWTD9HQdzXoKWQ34rHBj2WLyFrgMS0DXja7MhFRwkkuyqCzotY5G/MbQvsAKFB3QH/vDasLEVtKpMKAsYL4eyZm+bLeCleRrvG45fS2hrwKbsrJNNUDv647OXR/TyI+3cCn+WxCJSg3s8XOOUE9fudqWPEhkus/Y005EXNGGHJeDWSu3XyPH/Z2oK9wK+KxHwzqLdbPyZKHw2ZWBsBsHjdQVd3FX7HVNfDNjaleyVjBGX0RRoGd9O5Bt5pqGSAl5hf+0aiwgixHuH4r1xAkf75hwmd2sJCrvR8hTIC4ArB7FCy67WZCVn1fQpbw==;31:pPC6s/OH+7FKoP63orEc/Bc4t1lh5saYnOZygZ0GDio8cyx2/2xDdlgeODlIgWcr6WJNSwtGvB5oUcn4hFM8caZxwh2A+Sk7wmHnuN9bS0KPQgek5IL+r7FPVh7Q/qPbNwG447+hIzMMPwmifZND79qTXCTgeLcmqbyLMGdl9H9DheeJ5Ve0BIOYWpUINqaGiofDJVBxHb1E+uFRlmPZ5LgOc8gEK+rlV6s0lA1viZo= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0663;20:nacEXMe41UhjGNFWEMLkIASWIBsRiKBhIVvdlmKS1FfTwzb3o4WgFNxzweZexrBzCnxY+FKY0FVntw0q7GU7/xzbcKdflD004zqt7X0MCtbbn/tcLZXeUe/nY5K0i5fDzk8VOvjnKHuDjTzuyknn2bqfeNEsUuoosoGq4JQ6xHoiJUmZvlDovTeYB72FRerFtd2LObCK9PE9pDX6ehjwxpxYVUNLLPokPPF6PsFZNhGHOCiilONS38ka0940K2slit2B9zSbLGnnjS5fth1wm01aZnhLV4dSgj9YXPgR9OVEyIW4W78cofsMJoJbXOf4V/AZ8YWOcGef8vUWbO5ImA1ZjV1slwZtNwg4dATie8FGNzPh5cqhA6DJ7YEiDtYxDzPcE11yEl+nSnnLT+ZxbS8iA5bNpGxHiSUSaz0CLHgFQlviCIhZbU75FxCArEvdbRmre9Qa5Q4AVlAp+haXYXUU/m0H3VJtEZIYpHnHjsJlTT+nMph3TdJoryVdMhk1;4:DvmFH96kMtpz4ZNeht5qIQqETZLwwe5xiHPTiamjVAVWMKJffjw/ihFajkf36CP2vjxlvk/UtQto6oUBOszDLPErJJF1w45KUviEO5BQHb5QkTo1EBkyBOdlgnlYvfAVEff11EXVvQWlpxJ4K2ne9kKbnBFMe0+4CdnyoQM/+D+zs4OEM89Y63BSPCujD0r1cdiaoeGaEwZP9emN+O9EVgrd5qRbevSqwrp7Ey5Te0H3/PdDXRCO8imwOaOc0RPGArRNAs2v/Kivh0ohL85I5Ey4Qv2PtJ3GHM+LjvMJ4uUFKJv03/iGqMfU/Sp2UTwhtJ6nCYU7DUN7X26/a774GJnBx//PYvSfOBisGRt11iH8Qk0x67oYA9kVWyVVaZZdNtTljf7bVcVtSTU9vtusfhwpZZMjxBHY09NH7Y1r/R5KQvlRfm1vRcibpq9v8Q2n X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:BY2PR12MB0663;BCL:0;PCL:0;RULEID:;SRVR:BY2PR12MB0663; X-Forefront-PRVS: 00429279BA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(7916002)(189002)(199003)(33646002)(7416002)(92566002)(50466002)(77096005)(42186005)(7406005)(230700001)(19580395003)(101416001)(83506001)(19580405001)(2950100001)(9686002)(76176999)(54356999)(81156014)(4001350100001)(586003)(106356001)(50986999)(86362001)(47776003)(81166006)(305945005)(105586002)(97736004)(5001770100001)(7846002)(229853001)(23676002)(189998001)(8676002)(2906002)(7736002)(3846002)(2201001)(6116002)(33716001)(66066001)(103116003)(107886002)(68736007)(5660300001)(921003)(217873001)(83996005)(2101003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR12MB0663;H:[127.0.1.1];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTJQUjEyTUIwNjYzOzIzOjRTdTBxSlpzSVQ5TEVQZmNBWUJtQTE4cE84?= =?utf-8?B?eGtQSURYK05KUE82RDhTdkRvODRiZzZhVnkzY0IvT3hNVVZtSytkcWh4ZlEv?= =?utf-8?B?cFJ5YzVZMG9yT1dqYklHN3Jvd1hhWEk2bUh1SHlaWjVnQUxkckNEam5qNUVE?= =?utf-8?B?ZkF6YWdBeFhLaDdnaTc1WXFMSEYvSTM4dmYrYXdZbnAzbmxJblY3aEVEVy9l?= =?utf-8?B?RURCS0pRQUhIRnRTNHludHg3TFlZRXJyQ2sxM3c5MkpYNWFGSXc0ZmlLYVlI?= =?utf-8?B?RHc0TTNvcUdDaEJhYzFTT0FVQUZtcHlSOXdGbTlRK1VOeGxpczNWaTBkNDlZ?= =?utf-8?B?VkVIWnExTGFYR2lpWHZvaFltNmloSWZOc1JxR2tQN0psWkFWM2ZWMU9yWUF1?= =?utf-8?B?QTlYdHFLeTRNYURxalNIZjR5bXpJYmxMbHp0L2trUTMvVHk3ZWRacWQ4RnRs?= =?utf-8?B?Yjkya2dVSm5XUVk2ci9lcE90aU5GeWw5TXBpak1MWDNjVEs1VFdaNGhZYlVi?= =?utf-8?B?bjBxcEY5d0FROHNQSFRuSjh3SFhJNUZIUEM0ZHlkb2FBK05iZjBzN1NWTUlY?= =?utf-8?B?ZW5WdVBudlFXNGQySEl0SitZd2N0dEdqMmo0S1lGWEsxYm1vY2Q0d2ROUmYz?= =?utf-8?B?akl3ZDVLV2FaT2lLenBMaE9kMFJ2SW1PbjEvOFhWNkZOcGFxU29WQVl2SEto?= =?utf-8?B?K25Ibjk2R1dZcWVBc3IvZGRLU1RYdnFyK3F0VDR1aEt6eEFMYTN5bWNDcENC?= =?utf-8?B?UUl4WTZidGt4RUtIbXhRMzFSV0Jwa3lBQW1TZkN1ZVp0cmZncG1LZzdsSUI2?= =?utf-8?B?WWFHVXFSaXRBZHUxKyt0ZnhhTjVzZHgwbmFmYW03YWFtdXVEWWlLL01lbmpo?= =?utf-8?B?WTlWZWJ0K0c3aVRrc0JFTnU0K0k4ZW8vWlhLWWZ3T0I5Ry9YZ0RwYVNDcnRX?= =?utf-8?B?NGk3VEc1WTlFemQ3RWw4Mk9KYWhYV3FIOHR3ODdZeEt2OE4zYW8rSEVXQXl0?= =?utf-8?B?NWpjN2oyZUVBdzh1SjN5S25oWFR4c3ErT1hPL2JFenlCM0QvL0QwZytlOFRJ?= =?utf-8?B?c1BOeFgxdFN1NWc3ZHREeDByYWxLc1RpVmM1Tm9RMVNHZG1qQkV6VE1xc0gx?= =?utf-8?B?eEhUQld5d0MxckNFSTU2US82ZFNFZDZ1am8zYUxsZTRWenZsRlhqdktEbmFY?= =?utf-8?B?aHpYWW1idzJUWnluVE1ZOHZEY08rRmM5Z2ZNdUFUK3FpTkZQYTBQbWRkanZR?= =?utf-8?B?YUNoR0pRZFFVV0ZNK2NmSEQvMFhSOEU5LzlmMWJhdU9BNzNqeFFrN0Y3TWsv?= =?utf-8?B?QkExRktGamZGTjNaVVArRkpncEU1VWhQWE5HMlhRQ3pVc1RnazcxVGZNN1Rh?= =?utf-8?B?QS9NcUt2NWZhK1JJa3RwNnJwa08wRUtJQS9MZDFqVTNvU2FqOGpkTERuazlO?= =?utf-8?B?d0k4NmJqSnhMdW9xSEhIVEQrWjdybFdBalFqbk4yelhoSjUrdGh5a1NxbDJa?= =?utf-8?B?V09SSWxqbUY3Y0Y4ZS9MNlprZ3NZMWQ1SGxxR1ZOQmtYVVY1VlI2dUwzcWZr?= =?utf-8?B?clNHbHZTUSt0QTgzblJQTEtzZ1VReUx0NldiWGxVT2h6SmM1Tk1lQTdFcnN4?= =?utf-8?B?NkhmV1ViV1ZFT2V0cFE1OVkxZ3VIdHAvTndyTS9oeTBuZERzRkdOVUxPdGQr?= =?utf-8?B?K3BOYkVORTFZZTk5aHh2M0NCaCtramE5VE1aNEI2MHdTZmNEeXUrTFhpZkZK?= =?utf-8?B?c05tS0ZmeDNuOTVCWTd0Q2tkMmVPYXB0S3UrNnBpNlRwNTRNUFU1aU1WY1Vh?= =?utf-8?Q?1mhkVJu9B/KYd?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0663;6:/Dij3yludKr1izY0K8hcv6WEdUWk05zAIIYJkk/O+eCw8hyX8BYx86CI6NPQju6J9l9sySvsnoO3eZClgXHcbXYnmCDpY4x2MmyB/fmkZTPS0efK3o/htq6PpFTTvNqh16qExZBj46pg321MnqEWyuwT+c3CIoFxv/dN9G1mjxH+sENMD+zv9XbVTE/qUiq0XuHG6QB1pobhcTv3WqIFVzmIURRmACTveGjqOL2/YqsbNMFS93mJa4kw3qMTDkkr+bZXXHtPjTmh9CL7F8NltUMfz+7D/s8+/ZbLnw3X63yy2yLw+YwV7295pRi8QCGGYKbBqCmEXpEtltHeWNGSTA==;5:xbM2pD7eEGnnHrSGXoIU5eKdOyC3AjndAo6I2hYOE/jnej3bKqsDBbuCtTXr8iP96A3U1VimnEcRVpr0vR8XbTHJM44inhCvXRhaWW5DmCwWmAi/RDPZNAeBHfvKL4lB/TMtqC6gcCr1M5BrovD5Zg==;24:MQ96JWwIU+88943r6yfjbt+cvnmm+mIZsvHEIYCqpmir5LqIfDbFXh9TtqvvhVTv17Ty3g+RcYsUisiDbaXBwMkkqs1fqfG8ZktiqHDFzmk=;7:PzqYJqlZz+vcxCf/N1qlWOd1x+H7yitW6JECNEAdrx0TMqB0I+PY3Kunui236XT0v904A5kbkq8LS7WlALapKN6VOdm+xE1xrcGSrWDUpHVN1HSFhPcgxAnztky7rTmQnpMKxkuMoT8qCcNJqn5T8udzx9GvNVhqMkq7mhFaQ3H0E6nTtBquI2QgF7/79NnyGfWOPoXmxFnA6NuI3yQ1lnuQ1oIKHCZYSqBi08BJTF71nyqWPU5ZhhZ7Fxb4dawQ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0663;20:Lle8cZ+fFrEHUwLa6jsPV8rMs59vZBh+MIz5E1reIHkGB8MOEfR5tZtClKn684hElYeVl9U7lrHbbveM0XUs+c7/TsMu8mTGKH34O84zca6/sWn4SXUHA/Dmb0Ddrg2wCfhIpnYqA6/TQ4TLpSjeKfg/lhPa/dHc9aiYajLtTY7MZX5i5ryt76LjBFNmaqUmLUz26CskHrbdz0iWysJ+O47d/8mBWXGpzTvRthDjuUkC8MWnfOT6XdYHOxivhu7o;23:LgGf788n/kXT4pCzUXjU0vnu/8dUmTC8m6mfW/i72M7e3oWaz5bkmBee/hKMUp1zQRlQAg56Owjnyq8HAhMSJBSTBtWjhaKxxr/L1UYrCAcdULhC8Mnfw470nVrFYEZH6uQ7fej3wFgwFU/WYeCM+VRX+v6I6Wmfd1mSfGb7ewJPQGBSXamdkrcLCS8qUjTh X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Aug 2016 23:26:05.2679 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR12MB0663 X-OriginatorOrg: amd.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tom Lendacky DMA access to memory mapped as encrypted while SEV is active can not be encrypted during device write or decrypted during device read. In order for DMA to properly work when SEV is active, the swiotlb bounce buffers must be used. Signed-off-by: Tom Lendacky --- arch/x86/mm/mem_encrypt.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c index 1154353..ce6e3ea 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -173,8 +173,52 @@ void __init sme_early_init(void) /* Update the protection map with memory encryption mask */ for (i = 0; i < ARRAY_SIZE(protection_map); i++) protection_map[i] = __pgprot(pgprot_val(protection_map[i]) | sme_me_mask); + + if (sev_active) + swiotlb_force = 1; } +static void *sme_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, + gfp_t gfp, unsigned long attrs) +{ + void *vaddr; + + vaddr = x86_swiotlb_alloc_coherent(dev, size, dma_handle, gfp, attrs); + if (!vaddr) + return NULL; + + /* Clear the SME encryption bit for DMA use */ + sme_set_mem_dec(vaddr, size); + + /* Remove the encryption bit from the DMA address */ + *dma_handle &= ~sme_me_mask; + + return vaddr; +} + +static void sme_free(struct device *dev, size_t size, void *vaddr, + dma_addr_t dma_handle, unsigned long attrs) +{ + /* Set the SME encryption bit for re-use as encrypted */ + sme_set_mem_enc(vaddr, size); + + x86_swiotlb_free_coherent(dev, size, vaddr, dma_handle, attrs); +} + +static struct dma_map_ops sme_dma_ops = { + .alloc = sme_alloc, + .free = sme_free, + .map_page = swiotlb_map_page, + .unmap_page = swiotlb_unmap_page, + .map_sg = swiotlb_map_sg_attrs, + .unmap_sg = swiotlb_unmap_sg_attrs, + .sync_single_for_cpu = swiotlb_sync_single_for_cpu, + .sync_single_for_device = swiotlb_sync_single_for_device, + .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, + .sync_sg_for_device = swiotlb_sync_sg_for_device, + .mapping_error = swiotlb_dma_mapping_error, +}; + /* Architecture __weak replacement functions */ void __init mem_encrypt_init(void) { @@ -184,6 +228,10 @@ void __init mem_encrypt_init(void) /* Make SWIOTLB use an unencrypted DMA area */ swiotlb_clear_encryption(); + /* Use SEV DMA operations if SEV is active */ + if (sev_active) + dma_ops = &sme_dma_ops; + pr_info("memory encryption active\n"); }