From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751908AbdJXSlO (ORCPT ); Tue, 24 Oct 2017 14:41:14 -0400 Received: from mail-cys01nam02on0052.outbound.protection.outlook.com ([104.47.37.52]:23680 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751755AbdJXSlG (ORCPT ); Tue, 24 Oct 2017 14:41:06 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Gary.Hook@amd.com; Subject: Re: [Part2 PATCH v6 12/38] crypto: ccp: Add Platform Security Processor (PSP) device support To: Brijesh Singh , kvm@vger.kernel.org Cc: bp@alien8.de, Paolo Bonzini , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Borislav Petkov , Herbert Xu , Tom Lendacky , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org References: <20171020023413.122280-1-brijesh.singh@amd.com> <20171020023413.122280-13-brijesh.singh@amd.com> From: Gary R Hook Message-ID: <7f7f0308-e5d5-6a33-ee77-40fa753f943e@amd.com> Date: Tue, 24 Oct 2017 13:40:56 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <20171020023413.122280-13-brijesh.singh@amd.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BN6PR08CA0062.namprd08.prod.outlook.com (10.172.144.24) To MWHPR12MB1328.namprd12.prod.outlook.com (10.169.205.141) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6afe1954-0484-4c49-a556-08d51b0ec7af X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603199);SRVR:MWHPR12MB1328; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1328;3:fyRL0SFCIMcaILK9+FDHOmKqaCm30bSWLx8cz/mzsZwwCPf34sjXTO4ZMLlud/3GsnIPonECE8T1WKhtrFunakRHyKgRtQTft0aLx27thaXEEyzyGVEzIIPdcJbnHb0iR7629ykpkkTzIkJCXOiHqNlllYAJskLSb/QVD1PmNF9UoMkmX3l0VkIfF1Gh4kng0L/O/+J4WHZVy6vfGvfPzx8yoJnuCIezVtEMRHnZMOfQFi9lsZXrAEDNQuUW28f4;25:J1JzfBUJ1CufgKD9pypfT2HCAzH8CqjMbbEypouWAVVoNWkTt5ahsbu6V4dRogWf+7bZkn3ZukfjN8x+KfUX6TsXbSKHhSia2aox+B8nDzeQdnTWpuX8HLJKmMKq+4NDxa3Yx3bLbG9NC7GWlVhqBX+6GtgGreWn6mE7ZwELBufyPLgc9KVObaHToS5Yp213pqKQC0KyT4nHjZXexzjGXHKODAkal0nDovVZroE9Zs+PwXyCJcz3As5x+Op3/tzY8UG4+YQzFCnCBcs0dg0ir1NzyHi6NE16u+EL3Qy0fUPZgKeamFaiN2zvvK6/AOVyzQywS769b1A6yOA4etcAcw==;31:2vXIKWT21bdYAX+3YFC2IYKlx6xvVKDF4Bd1VBZmTAy729XKWufh97R6WhU5Qtsfcum67x+uZIsSa+li9QBA3htq8ysGtIsKAPMl5aGmiVvKIqy6OAvC3rDAxS9u0373d9M9WiRY+TOQY0fheukAB+7G6mARx/zo3RrbN8A00KKyci8ThHwv4o8bxDu2oXRcjNHXC3LpVuJ3pyaGdt6WBlk2sXCMTu/RO5fy5T0ckyQ= X-MS-TrafficTypeDiagnostic: MWHPR12MB1328: X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1328;20:tEXDl1oLxea/o1jMPhPSKp6OFFJJu5EHmC8ovfAQsajL94smi8dzyI2Pb7v/X+XUIHGNGrtjqLBjVb3mo42HGegM9YF4luxa6Mz2Gw7MdQZPBuIfEDPqUYBhsAij+kJG1T9iYa9tqqtEcUpFWNvHZ+SZkmbjjO74tkm5uCTQVuHtfjduxcSgBuOLj1uHXye+xIYlkcVituhtr5r6OWtI9wtbC9O9U2TM9jY87kyIPPhtg13Llf4zUi6UelTS8pOc2Wr3wiW2Lr7tkMnZS1k80HtnU8mswpEx7VVaPgLj07PQU9d5LQkB6ZHmLEB3ybPt55mgJFamPCasRf8wmOemjH3Q28Fjs8Nk7hB04vuJdNDKUQTELEnrOGtrQaZPj3gxBWOfziZtbVJyRGS8bV09NMWWHpxDyIZ1SVDBg1sxaN88JYT0Swk+GhdcgcGO4pPULdNZHpE0Be8C2LxiQtoimiIfoIIA84P5KZD1RQaj+tz9Ijjec5pdPzPd3DTMiryW;4:O/Cwq1gWr9RSRPenwz9QjhA8R3SUHIa3f0Wma+S75GmdOOqj+Y8i5DmvvF/AQvZm0zcM0rlcy5LDVZ/Nq5cmmRAdbFK02VE79KvkfmiIz/F+chomaJPSjX5LToF6J8Rg5Qq1Y5JsmM1rjQspoQ+IC7PMnw0ZI3+jGxVTRvag+vhIKU7DpyTk5rcSgzjf2sv+xEdV7B9nVZolG4HzFFo/rUqopsvGiSi0x4lyex/L5CHFb9PLxnpYdk+c6k9NFZjBijf8AHsRtsf3U+WNBALPv5ykKtFxryvykC2uJfxwKktlP7iAwVSdQmCFrCJAeKVaQMqdQwzft/BV+R5eRQVufVCSurAC6zbsSajMjXBsmP8= X-Exchange-Antispam-Report-Test: UriScan:(192374486261705)(9452136761055)(767451399110); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3231020)(3002001)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(6055026)(6041248)(20161123558100)(20161123564025)(20161123555025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MWHPR12MB1328;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:MWHPR12MB1328; X-Forefront-PRVS: 047001DADA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(6049001)(39860400002)(376002)(346002)(24454002)(189002)(199003)(65826007)(478600001)(229853002)(72206003)(5660300001)(189998001)(36756003)(53936002)(68736007)(6246003)(105586002)(81166006)(7736002)(65806001)(8676002)(106356001)(2870700001)(65956001)(305945005)(66066001)(47776003)(97736004)(53546010)(23676002)(81156014)(15650500001)(54356999)(4326008)(76176999)(64126003)(54906003)(3846002)(6116002)(8936002)(50466002)(2950100002)(316002)(50986999)(83506002)(6666003)(86362001)(2906002)(33646002)(6486002)(31696002)(16576012)(58126008)(31686004)(16526018)(90366009)(101416001)(77096006)(25786009)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1328;H:[10.236.19.127];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMzI4OzIzOmIxbFhZUUl0dnlSYXpQVjRUK25CK1JRcEZr?= =?utf-8?B?cjFkQllCcVllVjJkc2p5R2JOSkEwS2tHZEVFMnhSQXo4Q0VlSFVPNmN2UmE4?= =?utf-8?B?V3ZsWmdCOVBLakpOVGJmNHhoeDFNZ2ZWZ1lkVDFtbjhpYytWcjBKaGxkQW41?= =?utf-8?B?VUVGckdzUTRJN2hYdkh1NEFKeWFDa2t6K0llY3djc0JzSkRZVlJqaFpnVE90?= =?utf-8?B?S3VCTm43cVgwSTZaWEhBWTEwU0o5WjBjeHNoNlIyOHVtZWIrMlAxU0RQa3ZU?= =?utf-8?B?VEMzSklDd285em9meVk2eGdXY2g2SE8vY0FlNjhVczRHbitqVjREQW5VRVV2?= =?utf-8?B?ZklBajg1NWdpWlBMazhVWW5NQlNmU2d4a1dEaXZWQjhVZFMrTjk1ZFJPMVVv?= =?utf-8?B?S0hpYVgwRHlMTk5HUW1UMDE0UmNHUkRiY1dIbndobVFDTVVVZUdIeDU3MUI4?= =?utf-8?B?aDRBWjZxSE1jTnpWMVFCQ00yWkxzNGdXdnRzTFdaN3dWOVhGUU54MUlweGVL?= =?utf-8?B?Nm9HUjB5dGpZclZtRXk4L2NVVExRS1dvZi9BY3BSb2pqYjM0Q3diZzlnaEhr?= =?utf-8?B?TjdtT0FYY1lRT3lTQnY5N0ZyZ3FRRVdUWmt3ckZhTjlLbEpoOHBqR1RDQnJG?= =?utf-8?B?aUVEMUt4djloZmJmU1ErYXB1Yy9SNkVsUm1KaGE1RlQreHdLTEJKdVh4YUFq?= =?utf-8?B?M1FZWE1neVlNUzVodFR0NlhkUExZT2pOWkhCeEdiQlMxT013aHZvbTBxdXpT?= =?utf-8?B?OWJwcHd3cW5TWDVPQUVLNG9vWXVGQkkrWmlzRHNTRXByYWpBa0p6cEhSOFNN?= =?utf-8?B?b0dEQ05ESUhyR0RBTVBnN2l4NFBBRDRaZFduVFM3dGh6WjB1ai9rTjJnZzNl?= =?utf-8?B?L09Sa09IRVdqb0R6TXZna3oyeW5BN2NzV2ZndGM0THVHVUticWV1V0t0NkZT?= =?utf-8?B?bTZrUUJtUlRHK2s0ZkI4VzRqTW5JQXVZdmg0YTJabm9QbzloNjhFK0hKNEpD?= =?utf-8?B?ajh6N1Q1ZjVSelhiTy9neVNzMVVQNklMNmNyUmpEM3ZmN0k2eWpydHc0MTNv?= =?utf-8?B?Zi9XcXJ2b0dtVmJXWVhuY21lVzhQaXArakpqY0E5UU9CTXdxL3FVMXdrQTBN?= =?utf-8?B?Uitnb0dDbHBCL2U2NVNFdXJzMFBrdS9wRnNQN1l1and2K01LQXVnWVQ5Yndl?= =?utf-8?B?V2w3MXdlMnNSbGJpZ0JlYWhUQTF2eS9LZVJPTlRYU254QXZESi8vQTFwWDVD?= =?utf-8?B?cmRPLzZQNlpDVXlMSEM1Vmt0aFJnY2NGZnhmc3Fnc0NYSE1KekQxa3NNdDNu?= =?utf-8?B?VStmT0ZKcHVZZ2hWUHRJc3JublYwTzl0L2FNUVg4VzVHRUtjSDF2REFiL1RG?= =?utf-8?B?WXorQStwVmY3SXhsVldyOHZvREVFSUdpeW1ZYTd2RkpoUVRFbERDa3Z2ZG1w?= =?utf-8?B?aVRSajRHQlZUZ3Z2MWk0VFpVcDVYT3hhYTZmQ3FWMUYzN05UNDhmYncwV0Jn?= =?utf-8?B?cUluRTFVd2hCbU41V3V6L3FpdjNJaCs3ajVJK0N4cmpqdCtkV0Q4NWJMV1Bm?= =?utf-8?B?ZlM4UlhDRmVEU0Rvb3RwcUx6MmRzSWoveFV1dGI5RFZLQ2dHVDY4TEJ5RGZv?= =?utf-8?B?UGROMEt4RkpRVHJNcVkxMlhOSkpqdHplY0hzZUkrbDkrVWdPRXNZdHMrVkhH?= =?utf-8?B?dDZzTXc4KzV0dlJUVW0rTXAxQlNycnFBV0x6TVQ1d002TE82QWNFV0NBaElY?= =?utf-8?B?eXhOVU42V2h3MGNWcWZxeHZsbzVITnZ4YlR4WkNwb1FUYitZMkRJMC8wKzNo?= =?utf-8?B?QXBMYkhvMk9tRmRSK1pTZi81UHRiZEJwS2JoKzErOEdxZWtlbTB5U21CbWFy?= =?utf-8?B?NUNhM1NIWjgxc1pFMW5GZFJaSU96bGdReGhSV3RYY0l1dEp4SzFUMFpNQ0ht?= =?utf-8?B?Tmc1aGNzb2JnPT0=?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1328;6:LY7ohT4pFg1cvLm8rfSAyV7WgjPsDoUc5/TzYkXOQTehVpm1f1AmM8R4KFtPJZLjsetcDd8h77kaGGJLILan1eKytDK/OpMOzNGkj/KA1AFybbe8SX/gXpcdizR+8z4YpC58sKpWqUGpz3fAei5/QqsLotpxZrqjQWTX0YlhDpc12K4Awm82s5VTPkgnlfCDdwyEppfcwLmajs/htQfmpb9a1j6fLiw+7DmS3f1qP4sZ7eK9JQfPj8hL6zpvBKeZ1uK5zWENasq/iF5pGFCDc3AF7i5BUJOeDLhtwlZmJjhEY3epfoD2sG2brydokUi7RdpigI/nk4/sadXw74ZdyQ==;5:b/TylIzoujiUtdDhsl+H+dYP3rcDwhj27zB0qLH5HN7UnMJoo5sLYgUIzzDjEl3HImOmZNuderHsVjewt2A4U/8gn/4Drjyn1a/OeqZu1bR7aMZ2kV3e7AYlc+wHMZqqwE6S+olhmqLPs6cE6zYUJg==;24:BvIw0BTYbb6PaUUNX7uMDt6E/xOdTkGYSNXv400as2zsJlRJtOpuiCU3n2MFZHmRTjEdlyLV6/3KBLOyOP8+wU6l/pzyh7m4x4gDp0Ea1p0=;7:cACKptOcRshowfdCJLY4nUVmlNdm7di0NfkaEWfDnZCJWkd9zhDhpIHPeexcAsR4HLPmz+g1jrPhmTCtpe++IhhX0kft5f6Zv9bX4uk/6TEY6XrruQ7Ls0fXRgLJBfR89JHdyappIK2dRvhsyINEM61bKYYzhaKKLZHAp46OyM38mWaE6Q4e5UxJyzFlIVDimWvFIPnBlkF+Ppt8irrazOOrkhu05IZ2OmORyiSQzuo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1328;20:dXQ4jiQMiD1f6lh4pktRsLwsg5dsY2FpiPuRo4ox02IsW43t8t6r3iuiWd5Xc5EKDXnPU8bbWnrqurGLM7kfOutyRlR413J0Y3d6mft/6hIgWj2oXfy1iWaTIbOzV2NdwxCax6QNJw9K6RMhvQ8/SyXj5k9i0dV8ypRSCTeFqFBLUer0p2s1mBTiveWfnEezlYtAWlZgKxwfaM3RcnXuzDBNXP4jZMSh2ozWi/02FugclX5mGtUI/gwkCU87tH86 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Oct 2017 18:41:01.8181 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6afe1954-0484-4c49-a556-08d51b0ec7af X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1328 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/19/2017 09:33 PM, Brijesh Singh wrote: > The Platform Security Processor (PSP) is part of the AMD Secure > Processor (AMD-SP) functionality. The PSP is a dedicated processor > that provides support for key management commands in Secure Encrypted > Virtualization (SEV) mode, along with software-based Trusted Execution > Environment (TEE) to enable third-party trusted applications. > > Note that the key management functionality provided by the SEV firmware > can be used outside of the kvm-amd driver hence it doesn't need to > depend on CONFIG_KVM_AMD. > > Cc: Paolo Bonzini > Cc: "Radim Krčmář" > Cc: Borislav Petkov > Cc: Herbert Xu > Cc: Gary Hook > Cc: Tom Lendacky > Cc: linux-crypto@vger.kernel.org > Cc: kvm@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Improvements-by: Borislav Petkov > Signed-off-by: Brijesh Singh > Reviewed-by: Borislav Petkov Acked-by: Gary R Hook > --- > drivers/crypto/ccp/Kconfig | 11 +++++ > drivers/crypto/ccp/Makefile | 1 + > drivers/crypto/ccp/psp-dev.c | 105 +++++++++++++++++++++++++++++++++++++++++++ > drivers/crypto/ccp/psp-dev.h | 59 ++++++++++++++++++++++++ > drivers/crypto/ccp/sp-dev.c | 26 +++++++++++ > drivers/crypto/ccp/sp-dev.h | 24 +++++++++- > drivers/crypto/ccp/sp-pci.c | 52 +++++++++++++++++++++ > 7 files changed, 277 insertions(+), 1 deletion(-) > create mode 100644 drivers/crypto/ccp/psp-dev.c > create mode 100644 drivers/crypto/ccp/psp-dev.h > > diff --git a/drivers/crypto/ccp/Kconfig b/drivers/crypto/ccp/Kconfig > index 9c84f9838931..b9dfae47aefd 100644 > --- a/drivers/crypto/ccp/Kconfig > +++ b/drivers/crypto/ccp/Kconfig > @@ -33,3 +33,14 @@ config CRYPTO_DEV_CCP_CRYPTO > Support for using the cryptographic API with the AMD Cryptographic > Coprocessor. This module supports offload of SHA and AES algorithms. > If you choose 'M' here, this module will be called ccp_crypto. > + > +config CRYPTO_DEV_SP_PSP > + bool "Platform Security Processor (PSP) device" > + default y > + depends on CRYPTO_DEV_CCP_DD && X86_64 > + help > + Provide support for the AMD Platform Security Processor (PSP). > + The PSP is a dedicated processor that provides support for key > + management commands in Secure Encrypted Virtualization (SEV) mode, > + along with software-based Trusted Execution Environment (TEE) to > + enable third-party trusted applications. > diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile > index 57f8debfcfb3..008bae7e26ec 100644 > --- a/drivers/crypto/ccp/Makefile > +++ b/drivers/crypto/ccp/Makefile > @@ -7,6 +7,7 @@ ccp-$(CONFIG_CRYPTO_DEV_SP_CCP) += ccp-dev.o \ > ccp-dmaengine.o \ > ccp-debugfs.o > ccp-$(CONFIG_PCI) += sp-pci.o > +ccp-$(CONFIG_CRYPTO_DEV_SP_PSP) += psp-dev.o > > obj-$(CONFIG_CRYPTO_DEV_CCP_CRYPTO) += ccp-crypto.o > ccp-crypto-objs := ccp-crypto-main.o \ > diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c > new file mode 100644 > index 000000000000..b5789f878560 > --- /dev/null > +++ b/drivers/crypto/ccp/psp-dev.c > @@ -0,0 +1,105 @@ > +/* > + * AMD Platform Security Processor (PSP) interface > + * > + * Copyright (C) 2016-2017 Advanced Micro Devices, Inc. > + * > + * Author: Brijesh Singh > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "sp-dev.h" > +#include "psp-dev.h" > + > +static struct psp_device *psp_alloc_struct(struct sp_device *sp) > +{ > + struct device *dev = sp->dev; > + struct psp_device *psp; > + > + psp = devm_kzalloc(dev, sizeof(*psp), GFP_KERNEL); > + if (!psp) > + return NULL; > + > + psp->dev = dev; > + psp->sp = sp; > + > + snprintf(psp->name, sizeof(psp->name), "psp-%u", sp->ord); > + > + return psp; > +} > + > +static irqreturn_t psp_irq_handler(int irq, void *data) > +{ > + return IRQ_HANDLED; > +} > + > +int psp_dev_init(struct sp_device *sp) > +{ > + struct device *dev = sp->dev; > + struct psp_device *psp; > + int ret; > + > + ret = -ENOMEM; > + psp = psp_alloc_struct(sp); > + if (!psp) > + goto e_err; > + > + sp->psp_data = psp; > + > + psp->vdata = (struct psp_vdata *)sp->dev_vdata->psp_vdata; > + if (!psp->vdata) { > + ret = -ENODEV; > + dev_err(dev, "missing driver data\n"); > + goto e_err; > + } > + > + psp->io_regs = sp->io_map + psp->vdata->offset; > + > + /* Disable and clear interrupts until ready */ > + iowrite32(0, psp->io_regs + PSP_P2CMSG_INTEN); > + iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTSTS); > + > + /* Request an irq */ > + ret = sp_request_psp_irq(psp->sp, psp_irq_handler, psp->name, psp); > + if (ret) { > + dev_err(dev, "psp: unable to allocate an IRQ\n"); > + goto e_err; > + } > + > + if (sp->set_psp_master_device) > + sp->set_psp_master_device(sp); > + > + /* Enable interrupt */ > + iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTEN); > + > + return 0; > + > +e_err: > + sp->psp_data = NULL; > + > + dev_notice(dev, "psp initialization failed\n"); > + > + return ret; > +} > + > +void psp_dev_destroy(struct sp_device *sp) > +{ > + struct psp_device *psp = sp->psp_data; > + > + sp_free_psp_irq(sp, psp); > +} > diff --git a/drivers/crypto/ccp/psp-dev.h b/drivers/crypto/ccp/psp-dev.h > new file mode 100644 > index 000000000000..55b7808367c3 > --- /dev/null > +++ b/drivers/crypto/ccp/psp-dev.h > @@ -0,0 +1,59 @@ > +/* > + * AMD Platform Security Processor (PSP) interface driver > + * > + * Copyright (C) 2017 Advanced Micro Devices, Inc. > + * > + * Author: Brijesh Singh > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + */ > + > +#ifndef __PSP_DEV_H__ > +#define __PSP_DEV_H__ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "sp-dev.h" > + > +#define PSP_P2CMSG_INTEN 0x0110 > +#define PSP_P2CMSG_INTSTS 0x0114 > + > +#define PSP_C2PMSG_ATTR_0 0x0118 > +#define PSP_C2PMSG_ATTR_1 0x011c > +#define PSP_C2PMSG_ATTR_2 0x0120 > +#define PSP_C2PMSG_ATTR_3 0x0124 > +#define PSP_P2CMSG_ATTR_0 0x0128 > + > +#define PSP_CMDRESP_CMD_SHIFT 16 > +#define PSP_CMDRESP_IOC BIT(0) > +#define PSP_CMDRESP_RESP BIT(31) > +#define PSP_CMDRESP_ERR_MASK 0xffff > + > +#define MAX_PSP_NAME_LEN 16 > + > +struct psp_device { > + struct list_head entry; > + > + struct psp_vdata *vdata; > + char name[MAX_PSP_NAME_LEN]; > + > + struct device *dev; > + struct sp_device *sp; > + > + void __iomem *io_regs; > +}; > + > +#endif /* __PSP_DEV_H */ > diff --git a/drivers/crypto/ccp/sp-dev.c b/drivers/crypto/ccp/sp-dev.c > index bef387c8abfd..cf101c039c8f 100644 > --- a/drivers/crypto/ccp/sp-dev.c > +++ b/drivers/crypto/ccp/sp-dev.c > @@ -198,6 +198,8 @@ int sp_init(struct sp_device *sp) > if (sp->dev_vdata->ccp_vdata) > ccp_dev_init(sp); > > + if (sp->dev_vdata->psp_vdata) > + psp_dev_init(sp); > return 0; > } > > @@ -206,6 +208,9 @@ void sp_destroy(struct sp_device *sp) > if (sp->dev_vdata->ccp_vdata) > ccp_dev_destroy(sp); > > + if (sp->dev_vdata->psp_vdata) > + psp_dev_destroy(sp); > + > sp_del_device(sp); > } > > @@ -237,6 +242,27 @@ int sp_resume(struct sp_device *sp) > } > #endif > > +struct sp_device *sp_get_psp_master_device(void) > +{ > + struct sp_device *i, *ret = NULL; > + unsigned long flags; > + > + write_lock_irqsave(&sp_unit_lock, flags); > + if (list_empty(&sp_units)) > + goto unlock; > + > + list_for_each_entry(i, &sp_units, entry) { > + if (i->psp_data) > + break; > + } > + > + if (i->get_psp_master_device) > + ret = i->get_psp_master_device(); > +unlock: > + write_unlock_irqrestore(&sp_unit_lock, flags); > + return ret; > +} > + > static int __init sp_mod_init(void) > { > #ifdef CONFIG_X86 > diff --git a/drivers/crypto/ccp/sp-dev.h b/drivers/crypto/ccp/sp-dev.h > index 5ab486ade1ad..909cf3e436b4 100644 > --- a/drivers/crypto/ccp/sp-dev.h > +++ b/drivers/crypto/ccp/sp-dev.h > @@ -42,12 +42,17 @@ struct ccp_vdata { > const unsigned int offset; > const unsigned int rsamax; > }; > + > +struct psp_vdata { > + const unsigned int offset; > +}; > + > /* Structure to hold SP device data */ > struct sp_dev_vdata { > const unsigned int bar; > > const struct ccp_vdata *ccp_vdata; > - void *psp_vdata; > + const struct psp_vdata *psp_vdata; > }; > > struct sp_device { > @@ -68,6 +73,10 @@ struct sp_device { > /* DMA caching attribute support */ > unsigned int axcache; > > + /* get and set master device */ > + struct sp_device*(*get_psp_master_device)(void); > + void (*set_psp_master_device)(struct sp_device *); > + > bool irq_registered; > bool use_tasklet; > > @@ -103,6 +112,7 @@ void sp_free_ccp_irq(struct sp_device *sp, void *data); > int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler, > const char *name, void *data); > void sp_free_psp_irq(struct sp_device *sp, void *data); > +struct sp_device *sp_get_psp_master_device(void); > > #ifdef CONFIG_CRYPTO_DEV_SP_CCP > > @@ -130,4 +140,16 @@ static inline int ccp_dev_resume(struct sp_device *sp) > } > #endif /* CONFIG_CRYPTO_DEV_SP_CCP */ > > +#ifdef CONFIG_CRYPTO_DEV_SP_PSP > + > +int psp_dev_init(struct sp_device *sp); > +void psp_dev_destroy(struct sp_device *sp); > + > +#else /* !CONFIG_CRYPTO_DEV_SP_PSP */ > + > +static inline int psp_dev_init(struct sp_device *sp) { return 0; } > +static inline void psp_dev_destroy(struct sp_device *sp) { } > + > +#endif /* CONFIG_CRYPTO_DEV_SP_PSP */ > + > #endif > diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c > index 9859aa683a28..f5f43c50698a 100644 > --- a/drivers/crypto/ccp/sp-pci.c > +++ b/drivers/crypto/ccp/sp-pci.c > @@ -25,6 +25,7 @@ > #include > > #include "ccp-dev.h" > +#include "psp-dev.h" > > #define MSIX_VECTORS 2 > > @@ -32,6 +33,7 @@ struct sp_pci { > int msix_count; > struct msix_entry msix_entry[MSIX_VECTORS]; > }; > +static struct sp_device *sp_dev_master; > > static int sp_get_msix_irqs(struct sp_device *sp) > { > @@ -108,6 +110,45 @@ static void sp_free_irqs(struct sp_device *sp) > sp->psp_irq = 0; > } > > +static bool sp_pci_is_master(struct sp_device *sp) > +{ > + struct device *dev_cur, *dev_new; > + struct pci_dev *pdev_cur, *pdev_new; > + > + dev_new = sp->dev; > + dev_cur = sp_dev_master->dev; > + > + pdev_new = to_pci_dev(dev_new); > + pdev_cur = to_pci_dev(dev_cur); > + > + if (pdev_new->bus->number < pdev_cur->bus->number) > + return true; > + > + if (PCI_SLOT(pdev_new->devfn) < PCI_SLOT(pdev_cur->devfn)) > + return true; > + > + if (PCI_FUNC(pdev_new->devfn) < PCI_FUNC(pdev_cur->devfn)) > + return true; > + > + return false; > +} > + > +static void psp_set_master(struct sp_device *sp) > +{ > + if (!sp_dev_master) { > + sp_dev_master = sp; > + return; > + } > + > + if (sp_pci_is_master(sp)) > + sp_dev_master = sp; > +} > + > +static struct sp_device *psp_get_master(void) > +{ > + return sp_dev_master; > +} > + > static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) > { > struct sp_device *sp; > @@ -166,6 +207,8 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) > goto e_err; > > pci_set_master(pdev); > + sp->set_psp_master_device = psp_set_master; > + sp->get_psp_master_device = psp_get_master; > > ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48)); > if (ret) { > @@ -225,6 +268,12 @@ static int sp_pci_resume(struct pci_dev *pdev) > } > #endif > > +#ifdef CONFIG_CRYPTO_DEV_SP_PSP > +static const struct psp_vdata psp_entry = { > + .offset = 0x10500, > +}; > +#endif > + > static const struct sp_dev_vdata dev_vdata[] = { > { > .bar = 2, > @@ -237,6 +286,9 @@ static const struct sp_dev_vdata dev_vdata[] = { > #ifdef CONFIG_CRYPTO_DEV_SP_CCP > .ccp_vdata = &ccpv5a, > #endif > +#ifdef CONFIG_CRYPTO_DEV_SP_PSP > + .psp_vdata = &psp_entry > +#endif > }, > { > .bar = 2, >