From nobody Thu Sep 24 23:31:35 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012031.outbound.protection.outlook.com [40.107.209.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 834AD519E06; Fri, 18 Sep 2026 16:41:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.31 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749711; cv=fail; b=QYb8LDM87ipHctSu2tQwBuqY66tejZcelYhpcywMTJnVKe5dxoC07mAhrqvI1s9+coAp8eDYYu4ikIaM9MJ4RVw+dgm8mHjcFUMrnIVFzxMZ45QT6Vy50vdd3y13O3AcC3E2TYGcwYZzXp2rxXERYlRUv0PhLfPLG2k6jgkvZXI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749711; c=relaxed/simple; bh=NK5Jw5ZEdhSU6mORn/5tpxzrywaxyi3AoLZi5RCAADY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ps3GGGXmCjyeyUAvqhhWOXkFXQxRaMPxjPN7zsXUDOwbs3TvqIGApBvWrfrG7MmD0ZxUVYa9wB5aGeXThxjCIelVu+Rtdd9Z1pGYqjcMTaqz8yxmXVwE/ExFcpvk2TTCmxvStczF5ymDzGKkooPT1L3JpxiZV1MGRxBdbDO3gSU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Y82jZMo4; arc=fail smtp.client-ip=40.107.209.31 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Y82jZMo4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IgRoQAWKdLDRnptEM94YOTkzBF0j9Vyny7VzJVhsDoTaGyC6PrZA/j4jQaQXSLAX5RYWYhLDHsM/WM3BlYYKO5dV1Ro0Q3J8HXxP1bhgr7AO3i0qN4iDjw8HZsCmY+R3xUR/RdMWyfhFC+06xlhZNl8n/rQhK5FcAXkxdTF9cUHpDf5U/iut2kRrOlCJsJv365g8FJbPZq2xbWmsaCgeewtJQfW6TbrPLQ4yT5Xuy9u2WzxO6/iXKtNkxWsDIbeKbYy842pDItxO6eNcYaDHpbBzEtVb3t8lzN9n3BtCu8OzHkuy0Gen1jqXjT2aIvweQLW4wIjfJsPjrzq//my6lg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Fv0buWwAo/g+R6dCYWOlcMz+W11muRGyXpUOXytQozw=; b=MWDBgLbXVpoqeLU80IUpiiJZXhRuA2AVr2u7QJDjs1QNrJy9ZR+Gnr7+SndIyvv7a460Lx5bi7Ts9v0Oayau/tK/iYKukBxOBwLawHUrGjDzCcxbV5P32wE8IWdJEU60z+EXqEwRxCPh6ytvxBxRCzuI+1VzHqZd4BSRuwHMH486IdAcs+Ea4JgfcxbkbUo1+EayYO4eTCLc/R9mA0/SotT2ipdsauyZARuv5XTnkp748HdR8m/Lc0lXw+IagGs+xMyg9+/ZfGYUpRZwruPZ96L59ebBEN7wa05cAYW/drEDx/b2GhsVSDOOib6nYybWWqsPL2z4NZizD49P9FczmA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Fv0buWwAo/g+R6dCYWOlcMz+W11muRGyXpUOXytQozw=; b=Y82jZMo4UdNNqj4VAyAbNB/st7OuDupm8blCcWu96yUiRBg+/bE/DIwivErJphmygTWRihLqikAjnpRa8xwWS9Be3cJ5gRivRiOFhFkpcpfxNn3eAhcc2qIk1J9Rc/aunwLbjq4mGTwKlhnXAr8j0ke18rrqnk9JlR+VApPS06w= Received: from SJ0PR03CA0362.namprd03.prod.outlook.com (2603:10b6:a03:3a1::7) by CH2PR12MB9493.namprd12.prod.outlook.com (2603:10b6:610:27c::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Fri, 18 Sep 2026 16:41:29 +0000 Received: from SJ1PEPF00001CDE.namprd05.prod.outlook.com (2603:10b6:a03:3a1:cafe::40) by SJ0PR03CA0362.outlook.office365.com (2603:10b6:a03:3a1::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.13 via Frontend Transport; Fri, 18 Sep 2026 16:41:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDE.mail.protection.outlook.com (10.167.242.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:41:25 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:41:22 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 1/7] firmware_loader: Stop pinning modules on registration Date: Fri, 18 Sep 2026 16:40:55 +0000 Message-ID: <685e3707522394f212d62ff9f1bf64c5e0cb8a23.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDE:EE_|CH2PR12MB9493:EE_ X-MS-Office365-Filtering-Correlation-Id: 012081ca-812e-45a2-2ad9-08df15a3ae2e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|1800799024|23010399003|7416014|82310400026|56012099006|11063799006|10067099003|22082099003|18002099003|13003099007; X-Microsoft-Antispam-Message-Info: BOFpYC/+Xux21tl1kQWhC0w956oORXn/mCQ+yh/fMmddrq9ZU5n6BTn+pSKqSYp9qZNjpm8y946QZF1mUWM1WF4IG87AwiT07WtleDAbJmIKCAP09lJpDh0iAci8gcvWvdfqmpvwml9denAirQIqzU/s7KKyLRcr7Va3q7N1bfQlTECrPuvFTJXmgz832SndNsN9NFqZXyoJCninhSFRfZ8swNOk0JO6U2H1vbB+6cms1YsFpeqfCCzGa0+SxlYBRgGd8qxgOAWIxleyX+tiOqc9KhCbUOx+o+U0M6GuuR/WdWHfR0ifdtMB2a4syo4lT4gMBdXeqUGzfctMRZqEaP6wtOEABsF7GXLi/IYFWGLGmb092yo+uTd329IM59K7wsYmigwAKkhGULQnijoalRvJ1agXBvH2zkQK+vZxf16BJxMPkNg0R+U5UobPmvaSPBzeffakBaUoG/DGfcmHLqJyP2cJ8J/dYccrR1VoR2jj2NkuiBPMOodHmAUpruWA+4362lB924h2GxMAhMoyjPmnfIcGlpwGAs30K5CouKSNxYKKT9C+DNamsHnSRsnSIvY6DoDPh8xe3MUjL0zllHyfkAlODPRB4nbTYPqp4vxMYII738boGfnlww1Dc2NlGZ1VrShVS3wDP9Fd1jKJpQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(376014)(1800799024)(23010399003)(7416014)(82310400026)(56012099006)(11063799006)(10067099003)(22082099003)(18002099003)(13003099007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Cjp2QA+nIhe7InQymgHa3IJbklnTLzm+J1ur/75aCAwBVrlUVspmB++fVxSTEyyMeDviy4gG7ENG0h8YAWKq4TkRsQNCF6dGIOrpLeKOumQJlQq3V+7PL/FQ6X9HerHmE+0h/9s5BQ9xunrGQK/YmaQFqZ/zkvka3Xuk/k4x1vLTDI5NdqEuqYXw/6bl/b4q+wkA8pxm8UzVodbFakSJ2IQM0j4GvfZ9RMbyMdU7QV50dcXQ/frZ5L8ajPI6++4m9Ez2aRkOYKhkT7InNpAdss8SrQf/rknC94FkRwIzZbC7Lhp3QYV4TKPdSkN7KcTbjrLU2VAZstuLrfmYo0QuAUjzkOXdV6vM3J99GeFau0QTB0qKIxKVBFOpabVJZH8mOxZ5z5n+i4WrEL4kgbIBMaQY+lMMeVSOgh+hrg3ncuFDDgfRS/1rQ4/8EQ7U7qBH X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:41:25.4699 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 012081ca-812e-45a2-2ad9-08df15a3ae2e X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDE.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB9493 Content-Type: text/plain; charset="utf-8" From: Dan Williams The module reference counting can result in callers pinning themselves in a circular loop. The module reference counting is unnecessary. firmware_upload_unregister() must be able to guarantee that all ops are idle at return. All ops are either called from sysfs or the workqueue, so unregister sysfs to stop submissions, cancel any started transfers, flush cancelled transfers, and then release the device. This also solves a theoretical race of new submissions starting between flush_work() and device_unregister(). The module reference was not protecting against that race. Cc: Luis Chamberlain Cc: Russ Weight Cc: Danilo Krummrich Cc: Greg Kroah-Hartman Cc: "Rafael J. Wysocki" Reported-by: Chao Gao Tested-by: Chao Gao Closes: https://sashiko.dev/#/patchset/20260326084448.29947-1-chao.gao%40in= tel.com?patch=3D10705 Fixes: 97730bbb242c ("firmware_loader: Add firmware-upload support") Signed-off-by: Dan Williams Signed-off-by: Pratik R. Sampat --- drivers/base/firmware_loader/sysfs_upload.c | 31 ++++++++++----------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/drivers/base/firmware_loader/sysfs_upload.c b/drivers/base/fir= mware_loader/sysfs_upload.c index efc33294212f..6f2123538682 100644 --- a/drivers/base/firmware_loader/sysfs_upload.c +++ b/drivers/base/firmware_loader/sysfs_upload.c @@ -312,14 +312,9 @@ firmware_upload_register(struct module *module, struct= device *parent, return ERR_PTR(-EINVAL); } =20 - if (!try_module_get(module)) - return ERR_PTR(-EFAULT); - fw_upload =3D kzalloc_obj(*fw_upload); - if (!fw_upload) { - ret =3D -ENOMEM; - goto exit_module_put; - } + if (!fw_upload) + return ERR_PTR(-ENOMEM); =20 fw_upload_priv =3D kzalloc_obj(*fw_upload_priv); if (!fw_upload_priv) { @@ -361,7 +356,7 @@ firmware_upload_register(struct module *module, struct = device *parent, if (ret) { dev_err(fw_dev, "%s: device_register failed\n", __func__); put_device(fw_dev); - goto exit_module_put; + return ERR_PTR(ret); } =20 return fw_upload; @@ -372,9 +367,6 @@ firmware_upload_register(struct module *module, struct = device *parent, free_fw_upload: kfree(fw_upload); =20 -exit_module_put: - module_put(module); - return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(firmware_upload_register); @@ -386,23 +378,28 @@ EXPORT_SYMBOL_GPL(firmware_upload_register); void firmware_upload_unregister(struct fw_upload *fw_upload) { struct fw_sysfs *fw_sysfs =3D fw_upload->priv; + struct device *parent =3D fw_sysfs->dev.parent; struct fw_upload_priv *fw_upload_priv =3D fw_sysfs->fw_upload_priv; - struct module *module =3D fw_upload_priv->module; + + /* hold a parent reference while child is unregistered */ + get_device(parent); + + /* shutdown the sysfs interface to block new requests */ + device_del(&fw_sysfs->dev); =20 mutex_lock(&fw_upload_priv->lock); if (fw_upload_priv->progress =3D=3D FW_UPLOAD_PROG_IDLE) { mutex_unlock(&fw_upload_priv->lock); - goto unregister; + goto release; } =20 fw_upload_priv->ops->cancel(fw_upload); mutex_unlock(&fw_upload_priv->lock); =20 +release: /* Ensure lower-level device-driver is finished */ flush_work(&fw_upload_priv->work); - -unregister: - device_unregister(&fw_sysfs->dev); - module_put(module); + put_device(&fw_sysfs->dev); + put_device(parent); } EXPORT_SYMBOL_GPL(firmware_upload_unregister); --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010070.outbound.protection.outlook.com [52.101.61.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B1AF51AECA; Fri, 18 Sep 2026 16:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749770; cv=fail; b=WFmhvrpbLnWUmZjpXt3NTq5xqjZ4aG6vvaxlOmN/qYPvtWXQltUYhzjBvdi5XlLl0tqAW7yk6y/n9QvnSroxwl/4X4cFUJRzf90BLp2mOE967QPI3grE4VPprwtMevzGS/o3aMeam8MPeXHhXEtff3mNI4Cq4A4PUzhSC5NnZmE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749770; c=relaxed/simple; bh=vXDSKZelxNCKXKbYssSyB4TbWqvFFRO5sr9P11yiqrg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=E9m5QAk+dmQui3Ia4Zo+5wRRXIRyus1AkEu3A7Wa3rzHGR+q9ps49gUlpouJOKVUrkYRI9UKn2ZBo+vD6FsDhIZTJpo738JyVXhwHRjBVL1wjBLFRF+IV7Ti+Wp5NIO3h3BOvKy4ZZqW+zPNpk2DynN1DHiozWWu5PwVaenAdzU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=hYIIyXap; arc=fail smtp.client-ip=52.101.61.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="hYIIyXap" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xJIxJT5fsVEArywImBkR9sHrRn4iiEyeN86l5On2WPR/8GqrnmW+y+9xHjr403lLX/RwuAfSEQ7AjlVvml7gRarA8x2WFzNkeRNfmEylPKaWhabhx3rMHnFz4mTGG+GS3+kNOLNZSi915d1CeJxNALBHipXmOn/uCMQfzbRNWfJwNHoQDxXjYWEbhzedA/MS6+2CC8JDXTbJqCmZRl/NDIY4Q8DNfHgdpiJjRIaUaVvfzf/4V2EiaINji0FBi/I8nrX44+XEkqa6TxflpdPONZZgVW0yVxvAprYOYO2PfTujR7SvMc3P++e2LPN1evni4is/0i2pXYX9QeyluAu32g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bFh2VopaElzfTKLt8aBDjde45autjGvJbfnUGE/+gxU=; b=td7KeK/FCQnyAEGCZZciYSLeJs6ia+8vn/AhrQGzQSNcrK1M1Cd4RMB4k/orNDFuqJBJYoYLBsktj2cvXe4N8+j27eYNyElqAmmpmvzGqkDliqxw8FjwMPSsA4apGqOAfHTpq204AxSREQnmWi32nab2dtfaPMf6lbtpQZIftWSdTPBqvx4sydUAqNms3wfAlcpApkOZ0IlPdSx3o3sKpoObbFqRFBNrajDWNX1C/0B2O/bBIQVl8LJqTe3fBiaItymluXpQL3DSGoFrjxtT/lyoAvggr1NukEYx/fRsyOIZSn0eeS0ZHbeB6q8cKir7cfKGmgjnJZwIVJFIbav+LA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bFh2VopaElzfTKLt8aBDjde45autjGvJbfnUGE/+gxU=; b=hYIIyXapqaJYGTkvsAvPUjnEtjgEfkxjXs+/T8QGKTj0JBD4CkT5fCdC79M1p8pJZWJKwl9iyy+XgSRSMhWBhGs2eQOXB7MEFdrsQZgLRFIDIQghD/aF9EQQ+JXc0wqPUpaSy63ftIHFzg1ePRXhO1wTrXX+F+ErvEspXY4xNZo= Received: from CH2PR02CA0009.namprd02.prod.outlook.com (2603:10b6:610:4e::19) by PH6PR12MB844058.namprd12.prod.outlook.com (2603:10b6:510:3fd::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Fri, 18 Sep 2026 16:41:40 +0000 Received: from SJ1PEPF00001CDC.namprd05.prod.outlook.com (2603:10b6:610:4e:cafe::5a) by CH2PR02CA0009.outlook.office365.com (2603:10b6:610:4e::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.11 via Frontend Transport; Fri, 18 Sep 2026 16:41:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDC.mail.protection.outlook.com (10.167.242.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:41:39 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:41:38 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 2/7] firmware_loader: Stop pinning parent device per workqueue invocation Date: Fri, 18 Sep 2026 16:40:56 +0000 Message-ID: <2b524f6aa24ceabc0a4b1a91d2a86f88beaa24c0.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDC:EE_|PH6PR12MB844058:EE_ X-MS-Office365-Filtering-Correlation-Id: dbc9bfb1-5547-4c35-1bc6-08df15a3b6ce X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700016|23010399003|376014|7416014|56012099006|11063799006|10067099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: GLHxHcKkRQvF8fbTUsAQ0/hdtq5vN0NU0Uv4mIa9LFwCn7ZxiavBZCJq0zTStkfu3rNH7OdgqCbAihHSaWhgFDem2wkUQHCAiOoPPPICmnyCnoTQ7Puu/9B53mxWuYB8zXiy1NwRGsO0WtViu4wdXtjdnABsre+66qBO/wsWmwC0q4ckdQHJTJ44bMxaDYLQNThYzEngqa82RDTfiOJ2IZ/zMZsxkuCH/oChsxvv/Gsx68mE1m4VRCCPkmW6vCq+5sY8agEziDfjNxpEQlJXrTbtwPW6l2PnJYGf4WazcFUx/MP/ietVMOZbeTgMBJvDMBwFJ4nLt5+1mVvOmD6E9GXwU1uCD4ztytwL2SLgeyLgeB2j7+VkRHRb3qrKjZqLgZqPnx3IxnKMVJCprpliCuC26fkZ2gXe4D4dY3N2vKi1jeF+3wIllmy8nRU+uE7o+sJtRG7ytqRz2rMvzB4Et2npGi2/0X32jXYJpt2hKBlXzdnGOnPUBBT85pHgYS3ZPJ0tpyz0tgG5rxiYfWOzLyMZWdwoeYCyJ6E+7kE6A+fpxubPH79XjOICqTUX87MHUKk8g5P2URXeQAk+Yu3ZRoDjcbBb2ePndvrqRlf01Y0vJP5LxFoSYrXKgnyloqHHQm5TnnF178dfMYd1ieaHFLW0XA5vxsNCfHZPOQwFZkZwDzjR0VC4xAxP/VsWtS8VSDgHTD8uwefbgd7SgRVsVQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700016)(23010399003)(376014)(7416014)(56012099006)(11063799006)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Ild9RcIG4zWxv/KDZYRMd1xOye1kVdgCNJ8Zk8SM4Qm6AH/WmOEzniIV+7YiJRKej4kmzwwMAUfrLKZXjaZhqEEq296ULSVdTmtm+r1IVAdNDXxUc+yot0DMYdFLeyfwExTCGV2xlyJxLSqnuf2Za+74AdaIH8KWVnmTdrC4j52xl8WGYCM8UI++AzEYv7Y/wwFslhQcBJYlZ8+EEWS3GKAnHQMkVujFyduqdj88gwRazdF3bPtldr36g6WExwp1tN6tkpwxM5nC87J1T2WMWguYo3hhreYMz9KEKgpfaIN0y/HeQrtTG/8nUVDzbX7JurqgA7XtDQLTDpsL2hd+qoqKZjMRHtU3Y+ZAdUBu/8FbF28F4c91Do4/3R3V6EZXp/weOcNKNKNItIN3xK2AogSjn4OqGREJxsMGXq/dNQrdCVe3mSj088PF/ldgUWZX X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:41:39.9447 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dbc9bfb1-5547-4c35-1bc6-08df15a3b6ce X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDC.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH6PR12MB844058 Content-Type: text/plain; charset="utf-8" From: Dan Williams The device core pins parent devices while children are registered. As long as all usage of the parent device by the firmware_loader ends at firmware_upload_unregister(), no per queue_work() reference is needed. Now that firmware_upload_unregister() holds its own parent device reference over the child device_del() and flush_work() events, the per queue_work() reference can be deleted. Cc: Luis Chamberlain Cc: Russ Weight Cc: Danilo Krummrich Cc: Greg Kroah-Hartman Cc: "Rafael J. Wysocki" Cc: Chao Gao Signed-off-by: Dan Williams [chao.gao@intel.com: drop unused fw_dev in fw_upload_start()] Signed-off-by: Pratik R. Sampat --- drivers/base/firmware_loader/sysfs_upload.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/drivers/base/firmware_loader/sysfs_upload.c b/drivers/base/fir= mware_loader/sysfs_upload.c index 6f2123538682..890a242a7c20 100644 --- a/drivers/base/firmware_loader/sysfs_upload.c +++ b/drivers/base/firmware_loader/sysfs_upload.c @@ -176,7 +176,7 @@ static void fw_upload_main(struct work_struct *work) ret =3D fwlp->ops->prepare(fwl, fwlp->data, fwlp->remaining_size); if (ret !=3D FW_UPLOAD_ERR_NONE) { fw_upload_set_error(fwlp, ret); - goto putdev_exit; + goto out; } =20 fw_upload_update_progress(fwlp, FW_UPLOAD_PROG_TRANSFERRING); @@ -205,9 +205,7 @@ static void fw_upload_main(struct work_struct *work) if (fwlp->ops->cleanup) fwlp->ops->cleanup(fwl); =20 -putdev_exit: - put_device(fw_dev->parent); - +out: /* * Note: fwlp->remaining_size is left unmodified here to provide * additional information on errors. It will be reinitialized when @@ -228,7 +226,6 @@ static void fw_upload_main(struct work_struct *work) int fw_upload_start(struct fw_sysfs *fw_sysfs) { struct fw_priv *fw_priv =3D fw_sysfs->fw_priv; - struct device *fw_dev =3D &fw_sysfs->dev; struct fw_upload_priv *fwlp; =20 if (!fw_sysfs->fw_upload_priv) @@ -249,8 +246,6 @@ int fw_upload_start(struct fw_sysfs *fw_sysfs) return -EBUSY; } =20 - get_device(fw_dev->parent); /* released in fw_upload_main */ - fwlp->progress =3D FW_UPLOAD_PROG_RECEIVING; fwlp->err_code =3D 0; fwlp->remaining_size =3D fw_priv->size; --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012002.outbound.protection.outlook.com [40.93.195.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D70251A14A; Fri, 18 Sep 2026 16:42:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.2 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749733; cv=fail; b=apR4tqKFci/Zl3Jqkd5bxuyrcyTpFYZYXa0UKr5Pzy17E7urEDkmXu+xO9704Mh+0zASZvw9l7wSFm/62LaXEsUntqJDKNyTLR3JXTQPRfF2ONc7kw4wDHwY/SuWKDXK/KSrVF83FQAENKylaSF8nZU3R2LgexzdHZ10pZJ+Zfc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749733; c=relaxed/simple; bh=ZGtXSeAJZz/yOI1vr+67nkw+LNuTcLgWxze/8OmOf3c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JF2rn6TocYfCQSuMdDgO/bvbI19BdaXW0hV4HAOj1UZRi9WFBwB5jCozD9bZZ+RkTvNaSoeujMzdjyq2sekh4a+mzNm4ShihrMwpQEECyh+eGkj+8N4JHu3uqReiaQQp51m3n49G5kHupDic3qIyTPfs53Yj8+9MTc7bEsnCP9Q= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=X1JCmhbY; arc=fail smtp.client-ip=40.93.195.2 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="X1JCmhbY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oMYtPmcKLc8E7rMPQcKgeHWh1wB1frjUtqY/b0C2Y6HiPyiXXaT7DsE3xrpO2/UclahAlJ4YLODoEszZOC0zizZh+UZQt0jVOD3c3L4bT/KS8+IGZCAXTQ+G1ZSLQLhx953hljZK1oRwvqiz1gIUIpGCwIuA0Xyx+wIV6ZuOmrPyv+W5YqBvzGvV068+bTxINgTYs7xnNVGt1Ii1O7Y3AE56KaDsbXwPM3ASPH+GGTKXVsSQTq4n1NZBE7JWkOX4aIasUbrF8L+yp4nDvFlv/eR27399Cd3N56c3Gi3C4ejwAryNDdQ7HEPO+ppPSZqAL/pU7/NAUhzTg/0w1rOyqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4/BoV4hqRgwNw7odkh4jDkqTT6DGoZwDLnGcrR92Qn4=; b=FwlfncpJXN8oWig5lVNaAhWjhMewX6jZD1+evcPbcBZTKxsP9OcqTKrFYnvAU1fN4jGnazaS8kjRFdAX8Ebp6mMKNTEwztA3mpNT2/3N1xNk6YTcjEBklkp1nQtrdSqFDQ7Zm6jYyA2GUpkQ1Suxm+983IOGMkeNQBbFzMDAUsZ0PvDilb2hJ95tc78UYn57ZXeXZSFdf4y1c6dajfiRU2qArodpUUrX9CW3sikFBpQSNiZ0U/MPVw24RuJHgKKQTr3nnpwO3WtjAVf0b4kZpPyShuVUcnduc93epOiQUxjMo5aNS4rKm4n6iu3Iw8WFESrRF59OHQ+zqoeVW00X+w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4/BoV4hqRgwNw7odkh4jDkqTT6DGoZwDLnGcrR92Qn4=; b=X1JCmhbY9bx/DaL8yor4XKjJxUTEfFrcQQeQ4PpEBks3MOB3OPCq77EWpE+QV/xQinD6xWWnrTSor/WBGONqEpPnw8IwdwO7qOfzqs7SB9ibKC4NWC04qJeOEu9xp8DpqzqpmNmZojxKcOboboTIz1JT3OqRKqXgwz/tR9OF3C4= Received: from CH2PR02CA0006.namprd02.prod.outlook.com (2603:10b6:610:4e::16) by EAYPR12MB999157.namprd12.prod.outlook.com (2603:10b6:303:2bf::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.16; Fri, 18 Sep 2026 16:41:51 +0000 Received: from SJ1PEPF00001CDC.namprd05.prod.outlook.com (2603:10b6:610:4e:cafe::7d) by CH2PR02CA0006.outlook.office365.com (2603:10b6:610:4e::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Fri, 18 Sep 2026 16:41:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDC.mail.protection.outlook.com (10.167.242.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:41:50 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:41:49 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 3/7] treewide: firmware_loader: Drop the unused @module argument Date: Fri, 18 Sep 2026 16:40:57 +0000 Message-ID: <1db6b629d744bdb2fb98428557b4d22d27ce39a9.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDC:EE_|EAYPR12MB999157:EE_ X-MS-Office365-Filtering-Correlation-Id: dffc5f63-9b31-4c8a-9a36-08df15a3bd4a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|23010399003|30052699003|376014|7416014|1800799024|56012099006|10067099003|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: tfh8hUhPEhiXl7OXFWUD1TUMVrbdDiENHg9cjdY+6Y5xXymR2HIYT5rOHPcQJ+O/A47i0gAE0HJARduYWd3csVQRh9kIORwrTkv3I3sLYB7MzULiJ0evEXrS3tUUOcvryrCUKYfBpg1fXpJGbraj4q/T2igQBef4y/8fDC0LKXQE1yQG1OsMLtPtpcPKnrHbgZWvRpF9YtFVux5zHYAsXvamVwgP4wwUjj/fA2Z8e/OGuJI4BU0Lj7Vrv22OUtfvRMc/tgjt37hbnXdQE3eXdWqj0vIitAgGpfaOBLhY+48VINf7jvhQ2aXt0cz0wMzwn3zeOMR3+TVUkY37teEQFOMSSnFgnBuJh/yBYySA3NzMpOe5lzUMy1QRkkYflDxEeDMBzhYJCb95+/Fv//lFEwXTclrX52fHl9u8/n/3/En6vEiWwj4eY2tAEcP+1Q4Jvp8PlHwFCJ600dnsOv/VGFzciRC+vQtPuMITbPucWNt5nmAW9OkbEElGcf6Zvb4jyMtQuJd9XnBaH0+2Dw+3Gn91QUw3gvthBdqikoN4UEBoljT7XmOOEm7QMTxFDvC+Sh2mfN2/j6JEjJfu6xgdIMZkYw6C3F7bWfkEZDzJAl8JRd26nGvUSNQuUUMTEINiPeYXjJ49wSSNV7++2bu2jjiDFMeo8VGc9YV6Fu6HCiOqa0xDxXuuZijSPW5ORsvjiAv6f/yDIGVTLSRgEFPl8g== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(23010399003)(30052699003)(376014)(7416014)(1800799024)(56012099006)(10067099003)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: PBocUjFs30qXCZdeHwmTN12bI18msVIgGpLGRs7k2t8KY6W1ofTYNzMCS2/oNB+U16CqHo9Qyv1IJYoB8YzXDL32uYA0DNkh7y7VivokkIzy/3Ovwh7KuKFtGahGKUdnCqMMu6qKR4qiTeyfuLzD6lBMos3dY0lNpmaGyQ3yD3lEKKNHbRVCPdu31wdCV3BrRWI8kkUU3BqeO4b+wVGQRLWSp1DJk1Aoj+Dlq5oVu4FHwgmqlUVhdS+7LEU+Ek1dtiB9vOWmp9Hwl8gF2+kIrJxzTYXZmFRkvDzOPrK50avZJA2hNIeZ4TRoqfoav4EXE5d6PIZC/o4KmxBFPNJGiSkcYbwMNaNvVVvlk9JbViyy+EQkBU7BupYMZlzjTunzqtiyE98QhejC2P9dHAUJgrXclR3nLa6ZSU6jtU8WIHG3dt321OKknF6GRkE6VSn+ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:41:50.8696 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dffc5f63-9b31-4c8a-9a36-08df15a3bd4a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDC.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: EAYPR12MB999157 Content-Type: text/plain; charset="utf-8" From: Dan Williams Now that the firmware loader properly ceases all operations at firmware_upload_unregister() and no longer takes module references, clean up the unused parameter. Cc: Chao Gao Cc: Luis Chamberlain Cc: Russ Weight Cc: Danilo Krummrich Cc: Greg Kroah-Hartman Cc: "Rafael J. Wysocki" Signed-off-by: Dan Williams Acked-by: Conor Dooley [chao.gao@intel.com: drop leftover fw_upload_priv->module assignment and the unused @module field from struct fw_upload_priv] [prsampat@amd.com: convert the tdx-host caller added since the original posting] Signed-off-by: Pratik R. Sampat --- Documentation/driver-api/firmware/fw_upload.rst | 2 +- drivers/base/firmware_loader/sysfs_upload.c | 10 ++++------ drivers/base/firmware_loader/sysfs_upload.h | 1 - drivers/cxl/core/memdev.c | 4 ++-- drivers/firmware/microchip/mpfs-auto-update.c | 2 +- drivers/fpga/intel-m10-bmc-sec-update.c | 4 ++-- drivers/greybus/gb-beagleplay.c | 2 +- drivers/media/i2c/thp7312.c | 2 +- drivers/net/pse-pd/pd692x0.c | 4 ++-- drivers/virt/coco/tdx-host/tdx-host.c | 4 ++-- include/linux/firmware.h | 15 +++++++-------- lib/test_firmware.c | 3 +-- 12 files changed, 24 insertions(+), 29 deletions(-) diff --git a/Documentation/driver-api/firmware/fw_upload.rst b/Documentatio= n/driver-api/firmware/fw_upload.rst index edf1d0c5e7c3..702b1ed77551 100644 --- a/Documentation/driver-api/firmware/fw_upload.rst +++ b/Documentation/driver-api/firmware/fw_upload.rst @@ -57,7 +57,7 @@ function calls firmware_upload_unregister() such as:: len =3D (truncate) ? truncate - fw_name : strlen(fw_name); sec->fw_name =3D kmemdup_nul(fw_name, len, GFP_KERNEL); =20 - fwl =3D firmware_upload_register(THIS_MODULE, sec->dev, sec->fw_name, + fwl =3D firmware_upload_register(sec->dev, sec->fw_name, &m10bmc_ops, sec); if (IS_ERR(fwl)) { dev_err(sec->dev, "Firmware Upload driver failed to start\n"); diff --git a/drivers/base/firmware_loader/sysfs_upload.c b/drivers/base/fir= mware_loader/sysfs_upload.c index 890a242a7c20..920c4b640f96 100644 --- a/drivers/base/firmware_loader/sysfs_upload.c +++ b/drivers/base/firmware_loader/sysfs_upload.c @@ -273,7 +273,6 @@ void fw_upload_free(struct fw_sysfs *fw_sysfs) =20 /** * firmware_upload_register() - register for the firmware upload sysfs API - * @module: kernel module of this device * @parent: parent device instantiating firmware upload * @name: firmware name to be associated with this device * @ops: pointer to structure of firmware upload ops @@ -285,10 +284,10 @@ void fw_upload_free(struct fw_sysfs *fw_sysfs) * Return: struct fw_upload pointer or ERR_PTR() * **/ -struct fw_upload * -firmware_upload_register(struct module *module, struct device *parent, - const char *name, const struct fw_upload_ops *ops, - void *dd_handle) +struct fw_upload *firmware_upload_register(struct device *parent, + const char *name, + const struct fw_upload_ops *ops, + void *dd_handle) { u32 opt_flags =3D FW_OPT_NOCACHE; struct fw_upload *fw_upload; @@ -320,7 +319,6 @@ firmware_upload_register(struct module *module, struct = device *parent, fw_upload_priv->fw_upload =3D fw_upload; fw_upload_priv->ops =3D ops; mutex_init(&fw_upload_priv->lock); - fw_upload_priv->module =3D module; fw_upload_priv->name =3D name; fw_upload_priv->err_code =3D 0; fw_upload_priv->progress =3D FW_UPLOAD_PROG_IDLE; diff --git a/drivers/base/firmware_loader/sysfs_upload.h b/drivers/base/fir= mware_loader/sysfs_upload.h index 31931ff7808a..dc7ccdceb96f 100644 --- a/drivers/base/firmware_loader/sysfs_upload.h +++ b/drivers/base/firmware_loader/sysfs_upload.h @@ -26,7 +26,6 @@ enum fw_upload_prog { =20 struct fw_upload_priv { struct fw_upload *fw_upload; - struct module *module; const char *name; const struct fw_upload_ops *ops; struct mutex lock; /* protect data structure contents */ diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index b3419df586b9..ee7a97b8b2c8 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -1151,8 +1151,8 @@ int devm_cxl_setup_fw_upload(struct device *host, str= uct cxl_memdev_state *mds) if (!test_bit(CXL_MEM_COMMAND_ID_GET_FW_INFO, cxl_mbox->enabled_cmds)) return 0; =20 - fwl =3D firmware_upload_register(THIS_MODULE, dev, dev_name(dev), - &cxl_memdev_fw_ops, mds); + fwl =3D firmware_upload_register(dev, dev_name(dev), &cxl_memdev_fw_ops, + mds); if (IS_ERR(fwl)) return PTR_ERR(fwl); return devm_add_action_or_reset(host, cxl_remove_fw_upload, fwl); diff --git a/drivers/firmware/microchip/mpfs-auto-update.c b/drivers/firmwa= re/microchip/mpfs-auto-update.c index 1211fd8d0463..992088606204 100644 --- a/drivers/firmware/microchip/mpfs-auto-update.c +++ b/drivers/firmware/microchip/mpfs-auto-update.c @@ -437,7 +437,7 @@ static int mpfs_auto_update_probe(struct platform_devic= e *pdev) return dev_err_probe(dev, ret, "The current bitstream does not support auto-update\n"); =20 - fw_uploader =3D firmware_upload_register(THIS_MODULE, dev, "mpfs-auto-upd= ate", + fw_uploader =3D firmware_upload_register(dev, "mpfs-auto-update", &mpfs_auto_update_ops, priv); if (IS_ERR(fw_uploader)) return dev_err_probe(dev, PTR_ERR(fw_uploader), diff --git a/drivers/fpga/intel-m10-bmc-sec-update.c b/drivers/fpga/intel-m= 10-bmc-sec-update.c index 7d23d914df3f..3d318570faba 100644 --- a/drivers/fpga/intel-m10-bmc-sec-update.c +++ b/drivers/fpga/intel-m10-bmc-sec-update.c @@ -712,8 +712,8 @@ static int m10bmc_sec_probe(struct platform_device *pde= v) goto fw_name_fail; } =20 - fwl =3D firmware_upload_register(THIS_MODULE, sec->dev, sec->fw_name, - &m10bmc_ops, sec); + fwl =3D firmware_upload_register(sec->dev, sec->fw_name, &m10bmc_ops, + sec); if (IS_ERR(fwl)) { dev_err(sec->dev, "Firmware Upload driver failed to start\n"); ret =3D PTR_ERR(fwl); diff --git a/drivers/greybus/gb-beagleplay.c b/drivers/greybus/gb-beaglepla= y.c index 244966d56c9b..a097a3b10552 100644 --- a/drivers/greybus/gb-beagleplay.c +++ b/drivers/greybus/gb-beagleplay.c @@ -1172,7 +1172,7 @@ static int gb_fw_init(struct gb_beagleplay *bg) return PTR_ERR(desc); bg->rst_gpio =3D desc; =20 - fwl =3D firmware_upload_register(THIS_MODULE, &bg->sd->dev, "cc1352p7", + fwl =3D firmware_upload_register(&bg->sd->dev, "cc1352p7", &cc1352_bootloader_ops, bg); if (IS_ERR(fwl)) return PTR_ERR(fwl); diff --git a/drivers/media/i2c/thp7312.c b/drivers/media/i2c/thp7312.c index 775cfba188d8..ebbe14393c9f 100644 --- a/drivers/media/i2c/thp7312.c +++ b/drivers/media/i2c/thp7312.c @@ -1909,7 +1909,7 @@ static int thp7312_register_flash_mode(struct thp7312= _device *thp7312) goto error; } =20 - fwl =3D firmware_upload_register(THIS_MODULE, dev, "thp7312-firmware", + fwl =3D firmware_upload_register(dev, "thp7312-firmware", &thp7312_fw_upload_ops, thp7312); if (IS_ERR(fwl)) { ret =3D PTR_ERR(fwl); diff --git a/drivers/net/pse-pd/pd692x0.c b/drivers/net/pse-pd/pd692x0.c index 209de9cec849..5bb91a0f4438 100644 --- a/drivers/net/pse-pd/pd692x0.c +++ b/drivers/net/pse-pd/pd692x0.c @@ -1841,8 +1841,8 @@ static int pd692x0_i2c_probe(struct i2c_client *clien= t) return dev_err_probe(dev, ret, "failed to register PSE controller\n"); =20 - fwl =3D firmware_upload_register(THIS_MODULE, dev, dev_name(dev), - &pd692x0_fw_ops, priv); + fwl =3D firmware_upload_register(dev, dev_name(dev), &pd692x0_fw_ops, + priv); if (IS_ERR(fwl)) return dev_err_probe(dev, PTR_ERR(fwl), "failed to register to the Firmware Upload API\n"); diff --git a/drivers/virt/coco/tdx-host/tdx-host.c b/drivers/virt/coco/tdx-= host/tdx-host.c index e8ed8dfa526e..f11a545d40cf 100644 --- a/drivers/virt/coco/tdx-host/tdx-host.c +++ b/drivers/virt/coco/tdx-host/tdx-host.c @@ -194,8 +194,8 @@ static int seamldr_init(struct device *dev) if (!supports_runtime_update()) return 0; =20 - tdx_fwl =3D firmware_upload_register(THIS_MODULE, dev, "tdx_module", - &tdx_fw_ops, NULL); + tdx_fwl =3D firmware_upload_register(dev, "tdx_module", &tdx_fw_ops, + NULL); if (IS_ERR(tdx_fwl)) return PTR_ERR(tdx_fwl); =20 diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 0fa3b027f02f..aa0333095c10 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h @@ -197,20 +197,19 @@ static inline int request_partial_firmware_into_buf =20 #ifdef CONFIG_FW_UPLOAD =20 -struct fw_upload * -firmware_upload_register(struct module *module, struct device *parent, - const char *name, const struct fw_upload_ops *ops, - void *dd_handle); +struct fw_upload *firmware_upload_register(struct device *parent, + const char *name, + const struct fw_upload_ops *ops, + void *dd_handle); void firmware_upload_unregister(struct fw_upload *fw_upload); =20 #else =20 static inline struct fw_upload * -firmware_upload_register(struct module *module, struct device *parent, - const char *name, const struct fw_upload_ops *ops, - void *dd_handle) +firmware_upload_register(struct device *parent, const char *name, + const struct fw_upload_ops *ops, void *dd_handle) { - return ERR_PTR(-EINVAL); + return ERR_PTR(-EINVAL); } =20 static inline void firmware_upload_unregister(struct fw_upload *fw_upload) diff --git a/lib/test_firmware.c b/lib/test_firmware.c index 7459bba65444..a77a99404fd3 100644 --- a/lib/test_firmware.c +++ b/lib/test_firmware.c @@ -1322,8 +1322,7 @@ static ssize_t upload_register_store(struct device *d= ev, goto free_tst; } =20 - fwl =3D firmware_upload_register(THIS_MODULE, dev, tst->name, - &upload_test_ops, tst); + fwl =3D firmware_upload_register(dev, tst->name, &upload_test_ops, tst); if (IS_ERR(fwl)) { ret =3D PTR_ERR(fwl); goto free_buf; --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013038.outbound.protection.outlook.com [40.93.201.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18C2A51A13A; Fri, 18 Sep 2026 16:42:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.38 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749731; cv=fail; b=TaWneTtb8j2ZfDDHu9kNSfpraIHWtmzk8WAwlpk+8UVTR0taheKGm9rYORO4v2iWdsejKNb50jxQKQKjHOKVlvCR7QCc82xMENEIYt5Z2Ws2CEw0qY7ESi6ABAeYfE89IHFIjsR/Rd2bD40EUnYhBdv5Oc+HQkOhpVypfWZ24YY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749731; c=relaxed/simple; bh=GTlLBdeLAgc6tq3dZWi/wBPVSeyahCHz4UI98GE9JqY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=j+VmFtJwAdHka8co8WC4D35qn9d+FQng2nFs9p+c9kgOdESKHr7AJMGoxzogSndPEXNgcQJxTQlN+s2oE5EKow7CEAhhfqPbA/eLiwWsB3mG0InMff8x4kLYSz4l47I8Q8wVbKmfE753P1TtXM7A1lCsLEGm2F4DQbe6TBuewBQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Gq5d0Y+N; arc=fail smtp.client-ip=40.93.201.38 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Gq5d0Y+N" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XXdwHf4SEk6Ic587aaOnjLE0A8ELvaSA22+nROxgxZJq98VsvY+akyxr0uXzb4+wHcTLxwA0kC3A0n8S9vVunRK67S9H6gx5VLfbZWs23Kk86gCEyuh3/jqqd+rq8TfWhpLwq/icfjEG7OUD6/+g1vqtMAk2+ompogSfn/HFmJDdZItJMa6TgjSpLZpmJLE/N3rmOanR7lClppxlSezNf3yXy8Wvkhxlvrw0d07Pb/ypmGCQ+IjltfCjzeCfFmMVbYN6f8xRawQqt9wbo6xEbhsNlgR+PgYU+i430oMrr/nrfcEYER7TuhgA9OdcTrsxtRfce3TsgGbD6eC9cwwjLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PSU/TK891p11aT2gEU2Zcn8LN3F1xITGAxP0LT/EZ+4=; b=w6OhIFnPZspwoGctruUgZinJ5PtuCSKF0IIjZh7u76fitlJLKue4911ek2wR3M8jf6sCtlnLmerLgvDZFvtAeL3N/+jc+Y0ayJs9IVMpW3fePwnjLTn83G1qS8g9zlzpIzqwJJVun1KwIr6kTPHirCreTwUZO2eNGvPL3nbJHu1ew3rWoyyrtizgEhuba8t0pLOMWtHNJQfBu+ihdmghEZAX/T92XHcV64o+wObW+jx4xreO3OgZ6aJI9QWwIIxR05Y/4RFnROkNqMhoZ3f7OtL+t/+SiWQ/LMwq99F8abNdQoOp6c+j15Q4uBGaOVNCJT9SCrDiq9b50hd27dQkQQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PSU/TK891p11aT2gEU2Zcn8LN3F1xITGAxP0LT/EZ+4=; b=Gq5d0Y+NgO9NDavX5J92dDB5R8itwpLUW9810ywwunT3TMpsn2LZrjsgr/icQ/S9Jm9jEaoOYPYW3AH141vly+jnKqLgjJlvAjTOU0AQSC1tFv5W1eer6USMWIRBFImqoXN7lXkmAl0yNbEQnpLTYFvDlwgULPGwl8X8krldcmc= Received: from SJ0PR03CA0078.namprd03.prod.outlook.com (2603:10b6:a03:331::23) by PH0PR12MB7815.namprd12.prod.outlook.com (2603:10b6:510:28a::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.9; Fri, 18 Sep 2026 16:42:02 +0000 Received: from SJ1PEPF00001CDF.namprd05.prod.outlook.com (2603:10b6:a03:331:cafe::5a) by SJ0PR03CA0078.outlook.office365.com (2603:10b6:a03:331::23) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.12 via Frontend Transport; Fri, 18 Sep 2026 16:42:02 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDF.mail.protection.outlook.com (10.167.242.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:42:02 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:42:00 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 4/7] crypto: ccp - Factor out the release of the SEV firmware buffers Date: Fri, 18 Sep 2026 16:40:58 +0000 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDF:EE_|PH0PR12MB7815:EE_ X-MS-Office365-Filtering-Correlation-Id: 0d5492d6-51a7-4b6e-72c1-08df15a3c40c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|82310400026|23010399003|36860700016|6133799003|10067099003|56012099006|5023799004|18002099003|11063799006|22082099003; X-Microsoft-Antispam-Message-Info: n88VyRZILIimgBi2q8Ds/m+hRFVmAf9MvGkFrffIdtRmWGDyrgD6d0n4/63n2gzw/1MXtujhK3if0nAE7AqINCOfvpYVW0El6vOPq76RRa7SLDsC5TiVzjvHcNaCQobn3r2R929t+0ZZ+TwxZiUgTGIJXNNc982b77wyLyrQ7AOiSmEstQIsDDRdpAU9t2RxouNB4dHOP6XoqBoGTYoPnwpOGq1IEKjYoRA4Tcgym0TeUizpW4s7rwrRfkW4JnT+05kIyp5v6tUMKz34MS9o6MAqdmLxmRkokyi+HUSHe5tGcK47zAhNd5OyCeKMRoddubrFxe5UhwJsyY36C+UxbGarKZQ/ij2fXqO1ocV3uwmRrZ2XreSBV9OZt9d6Yt86hMM2wEX/6YlwiMLKd0IjdaJEyNK327vefk/bGvzSllQhvnNObKnmSQlbgVWP00CtDxOPeS/aenYMEKlcCaMC4o334KMFohNXR3lOhWblTYH26PqblZDHhA8ls71P1K57MMdd9tM3aokTBaXu5xli1ujt3dpzIPZu3jREoABYR+dS4IX5ntxbfm2mOY9Sa0xS83jjPBM3iTsSPoUXrAFzhsv+3Y8AljCH+JjvLZLA+ufMgFc3EOT/beYR+FkRH4HI4LssaGX0HPqIYtsKqI4p2dcyj3WSJQRlmT8SBrIWh5jQAvgkFXclw3s5Lztt+eUWsU9qv0IaFUlaliYyPd6CXg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(82310400026)(23010399003)(36860700016)(6133799003)(10067099003)(56012099006)(5023799004)(18002099003)(11063799006)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4TL94N6ZmGMEChKo40vvwM2ks8z6xv+r7hy4iF+ro9SDl5WX6mQ5nOJYQ+3JIhXyivmvudodyrObT+HjLJhXTZ4yCa+omsdrxHxRI9aDEibWuvvBMuGdKtmE7QVz8oL7Ip64yvFIqjaKE4qnjZBIKK2L7LlQQyaCktQyHUUFq3SinRG1zerUbGbvIY7KZpMFT/OM5wM2z9fDGivWNSxYT6iXpbtxXRUPAhablDkN9sh0RdnnSProlF9y/rFrUFvgbPnYEkZsx2oF/WU97EjGUdBKASYj6DN9yHETWIfsD8unQKBJP88dQKeCBTVqWps2jFLu2UiqZFZPRw6a0NTwUIa58Numh6kLgPe0jHIhP0IC5LoXzORuqvxkdvKknyBZULmkOnwZ8ODSnSMAf8qw5fw0lvoyxa/LSCXxHZ4rsSxCKPwsdLem+TMYD4WZ2p35 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:42:02.1641 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0d5492d6-51a7-4b6e-72c1-08df15a3c40c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7815 Content-Type: text/plain; charset="utf-8" __sev_firmware_shutdown() reclaims and frees the TMR and the INIT_EX NV area once the platform has been taken down. Move that into a helper so that other paths which de-initialize the platform can reuse the same path. No functional change intended. Suggested-by: Shantanu Sinha Signed-off-by: Pratik R. Sampat --- drivers/crypto/ccp/sev-dev.c | 55 ++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index f833cb7e4da3..1ed9e61a95cc 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -1881,6 +1881,35 @@ static int __sev_platform_shutdown_locked(int *error) return ret; } =20 +static void __sev_release_firmware_buffers(bool panic) +{ + if (sev_es_tmr) { + /* + * The TMR area was encrypted, flush it from the cache. + * + * If invoked during panic handling, local interrupts are + * disabled and all CPUs are stopped, so wbinvd_on_all_cpus() + * can't be used. In that case, wbinvd() is done on remote CPUs + * via the NMI callback, and done for this CPU later during + * SNP shutdown, so wbinvd_on_all_cpus() can be skipped. + */ + if (!panic) + wbinvd_on_all_cpus(); + + __snp_free_firmware_pages(virt_to_page(sev_es_tmr), + get_order(sev_es_tmr_size), + true); + sev_es_tmr =3D NULL; + } + + if (sev_init_ex_buffer) { + __snp_free_firmware_pages(virt_to_page(sev_init_ex_buffer), + get_order(NV_LENGTH), + true); + sev_init_ex_buffer =3D NULL; + } +} + static int sev_get_platform_state(int *state, int *error) { struct sev_user_data_status data; @@ -2906,31 +2935,7 @@ static void __sev_firmware_shutdown(struct sev_devic= e *sev, bool panic) =20 __sev_platform_shutdown_locked(&error); =20 - if (sev_es_tmr) { - /* - * The TMR area was encrypted, flush it from the cache. - * - * If invoked during panic handling, local interrupts are - * disabled and all CPUs are stopped, so wbinvd_on_all_cpus() - * can't be used. In that case, wbinvd() is done on remote CPUs - * via the NMI callback, and done for this CPU later during - * SNP shutdown, so wbinvd_on_all_cpus() can be skipped. - */ - if (!panic) - wbinvd_on_all_cpus(); - - __snp_free_firmware_pages(virt_to_page(sev_es_tmr), - get_order(sev_es_tmr_size), - true); - sev_es_tmr =3D NULL; - } - - if (sev_init_ex_buffer) { - __snp_free_firmware_pages(virt_to_page(sev_init_ex_buffer), - get_order(NV_LENGTH), - true); - sev_init_ex_buffer =3D NULL; - } + __sev_release_firmware_buffers(panic); =20 __sev_snp_shutdown_locked(&error, panic); } --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012048.outbound.protection.outlook.com [52.101.43.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CEA8550EC07; Fri, 18 Sep 2026 16:42:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749749; cv=fail; b=QVj5adGH7+1kVMeXgOrUsQr41GNS4mEs7syxqGdzVB8rs5Dg69zKSwWYbtBp4axTsyU77SEJuPBo7e/7h6RiezL/ThBifQDxaIkbTYU9lU3hqtftQUKMhMZDm4r99uT6vzqbt8xmV9gW/bHfSWjNyDg99ZDZnaFyeuXvF2StEnM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749749; c=relaxed/simple; bh=+6STHUGYVKtaTl6IbwFdaameYh3/Y1xs0ASxaJOxvek=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JtAngZ2G6GS4Lcqs2SZSoe9dQ77vjT1brLDDkB3+8JckYmJ30LTpW+RNUZdEcRpdivBzJhyJ2P2wLqgyPQfpWsvPFVuK5cGADdzYaGJI1g51dUX55M4/acDKRmbp0d5QOjZ5FTJsKxjbaI+jrfWaYWbHzKpfzaySBARbifRK12I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=vl5DD8Tr; arc=fail smtp.client-ip=52.101.43.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="vl5DD8Tr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BIUNlBJzWPPr7YYLfM8kieL49DjG76DnSTHcbVJUycksksEvNZBUOx9Mo4tf84yTF6wNjXILNtCK6TvW46U9beutdNzb2dsIo0En4nLOPk4ifrXrj/AeSOa5HN4FOr6fhPf6IfFaLiRg0AAAzpWLOfk99T0GDcoI8cHAzIvZ3Nl4TK4YRdBaHA9If8zg3TSIObjdNGj1QFq6KaaA+5aSL/+qZfQ1QcHUYrVc+woSe00nMBhWAJEgkBXDMzUsskNyXQG/uKgO4iDpREf9ySrCIF8PubI0qVh+/Ki5cMT6dN/G8EKYk8yoL6c8mbLNxYMfWBc/sgdHsU/uUF6seYmjUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bE7Ge1BjtRa9VzLR01DX+qnlhEI8i700n/5uL3bLjrE=; b=cvBQP+0GvqTm0jSpKQNBXSm3GPF6kc/2PeoYFq/PZb+bTbyjGBDjFRTjPOjgL4nfdpINgl/Ie2OFVs/ZNq5gfTJ7xjVhsokJDZOt1tOk/9aXHr5PPK1he10ZWPXCaAvy+HW/ZBBjkq2VKCqosVr05Gaio6ygWreJFOSv5m8w3fVdlkBbzz2iVvZ3Cba1CYTxFx7AqZ8CK7sPQetJ5sFXb+F8w5HyheG8V3V3U6QjXwfBrsNrnepplWdy0T46VnIZHZi5p6VDjvyvE1mq7D4XabP4V4ZXaOYEPgYVGniNwF0ymcoo6noyG3SPqgp6I2Zx3eOkowBs+oklzcJ2cJINxA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bE7Ge1BjtRa9VzLR01DX+qnlhEI8i700n/5uL3bLjrE=; b=vl5DD8Tr6y5XnnI7Ysh5NBY3vD/cImYmEqd0lD/Bapiy6x1dq02fiEP204kSsIWJHp1gJpBDTKEzUb12YNPr7H3xYybQbGOA67nxEe8pqmOC/XeFIFbT7NXIIXh8TDH1d503D81Ylk0Dl7CzvBORXhocYUDXJYAfs/LfKsgztlk= Received: from SJ0PR13CA0139.namprd13.prod.outlook.com (2603:10b6:a03:2c6::24) by CY8PR12MB7124.namprd12.prod.outlook.com (2603:10b6:930:5f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Fri, 18 Sep 2026 16:42:13 +0000 Received: from SJ1PEPF00001CDD.namprd05.prod.outlook.com (2603:10b6:a03:2c6:cafe::8a) by SJ0PR13CA0139.outlook.office365.com (2603:10b6:a03:2c6::24) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.451.9 via Frontend Transport; Fri, 18 Sep 2026 16:42:13 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDD.mail.protection.outlook.com (10.167.242.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:42:13 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:42:12 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 5/7] crypto: ccp - Allow SNP platform data to be queried after SNP INIT Date: Fri, 18 Sep 2026 16:40:59 +0000 Message-ID: <0f67392979b8db85aacd62fe547d9e2937a93393.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDD:EE_|CY8PR12MB7124:EE_ X-MS-Office365-Filtering-Correlation-Id: 096bd5a2-c609-4210-7a3c-08df15a3caee X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|7416014|376014|36860700016|23010399003|1800799024|10067099003|11063799006|56012099006|3023799007|6133799003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 8kQm7TDUjbtTClW4SMFANvieSBYMuA57wO14LZsJOwPO5hrRL5C3PIWVh9rPxe74CC0IoMmtZW9fhraE6T9CUA1Z5YIph3MotG9G+k6UpN3qyvk03bdkuF8qHe+BlZPHLTSfg0UEb1bpMPhEnUEtKXHGLlFMlfL+1HBus6eJ+AW4dJk6zFpsPPDRs1eOI/P+sIqVlz9RMkvKu7zn52TCpEU88CBfIRE4tF1Egifb9HGuk3Fnxf/O7kC9a5kaKuJJj4uD5SY28NSeebqzPpht1fZEDjuwmnaZjxLPo4LuSVtttjsZJH48Ss8ewSELD8zTbtWoQuSP8widk0e2YbRR24Cts/0TSPc4Fh6Wh7wpCxBmPpyzePxDu9XErdG70p1FmMoXy+sA2skbu5E5VASGO1bVOHoM6ZbMn0V+DjIB6EhioY8ngbJhg1BJ4RhDqMxmhsE4BClZC9H0MRg4SB3cgnWwlV9uiHk1Y9fgFqIQbj9yTDjt7LUoD08bKv6u1Uh4YJXLLvC5Rbv0QB4i9PVdnHBfLlBOQAQq8dtAFIHVZ8ob7tiaOKhFKliGpqweVPA2bygSaQB6O0xRCkeKacIa4OC5mk+8TDXmrAv693djzQNHvPbLhEQPmoQ0y1wEDr2IzOv80UJRRkVcSraC072V/O3fJ62X02qDDbNQUmL2k0wACysCFLdkW7k/OLKDAs/RZTtpDTIQ5R6AV146FH/NVg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(7416014)(376014)(36860700016)(23010399003)(1800799024)(10067099003)(11063799006)(56012099006)(3023799007)(6133799003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 85iA2rXnSmXDOZNcroYT3zba0mGbGbBDIjel6BqKsOsaxVHTc0TYdvvBc3n1+Na+PS29YHjTC0werIuP+e9DU+tVOGV/qxzJcEuQykSLGyQL5NcpA+MGUQct0OoIZaPWnzmifSU8u8sEYcYQVgfOdI4/QZMlcJ6IVlvUIT/X/Jxbsu+1f53ggwnXgceTwR9c893rQRF66XeKfYS/qTBjIXwSKM1QKKpo6Z3H7/6EAIJq/i30aO6t0pWH3MclsdprMy7hDDTFVl25j3v+dm3OLxfAmpdcgJPpQzj6HNLlGurYMLmz3GOcOV7t+u6OUvE9ykvAcdlWNt/8vxtRxqtXJ2gMJi7WC4zMc7BMiyeGm5NJpQI7o28wXHN/vNQbNxVGhsN71rPrVTIGYxbVuHj57eDyk+uzhKtCVG7eRbIEcfY0QPipAv3Cswpsm1lfz/wd X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:42:13.7670 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 096bd5a2-c609-4210-7a3c-08df15a3caee X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDD.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7124 Content-Type: text/plain; charset="utf-8" In preparation for refreshing the cached SNP platform status and feature information after a successful firmware live update from DOWNLOAD_FIRMWARE_EX, allow snp_get_platform_data() to be called while the SNP firmware is in the INIT state. Once SNP is initialized the firmware requires the output page of both commands to be firmware-owned. sev->snp_plat_status cannot satisfy that as it is embedded in struct sev_device, so use __sev_do_snp_platform_status(), which stages the output through a dedicated page, and allocate the SNP_FEATURE_INFO output page with snp_alloc_firmware_page(), which transitions the page to firmware-owned when SNP is initialized. snp_free_firmware_page() reclaims it once the feature information has been copied out. Co-developed-by: Tycho Andersen (AMD) Signed-off-by: Tycho Andersen (AMD) Signed-off-by: Pratik R. Sampat --- v1..v2: Use snp_[alloc|free]_firmware_page() to transition pages to and from firmware-owned state - Tom --- drivers/crypto/ccp/sev-dev.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index 1ed9e61a95cc..3704f52bd08d 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -131,6 +131,8 @@ static void __sev_firmware_shutdown(struct sev_device *= sev, bool panic); =20 static int snp_shutdown_on_panic(struct notifier_block *nb, unsigned long reason, void *arg); +static int __sev_do_snp_platform_status(struct sev_user_data_snp_status *s= tatus, + int *error); =20 static struct notifier_block snp_panic_notifier =3D { .notifier_call =3D snp_shutdown_on_panic, @@ -1261,19 +1263,11 @@ static int snp_get_platform_data(struct sev_device = *sev, int *error) { struct sev_data_snp_feature_info snp_feat_info; struct snp_feature_info *feat_info; - struct sev_data_snp_addr buf; - struct page *page; int rc; =20 - /* - * This function is expected to be called before SNP is - * initialized. - */ - if (sev->snp_initialized) - return -EINVAL; - - buf.address =3D __psp_pa(&sev->snp_plat_status); - rc =3D sev_do_cmd(SEV_CMD_SNP_PLATFORM_STATUS, &buf, error); + mutex_lock(&sev_cmd_mutex); + rc =3D __sev_do_snp_platform_status(&sev->snp_plat_status, error); + mutex_unlock(&sev_cmd_mutex); if (rc) { dev_err(sev->dev, "SNP PLATFORM_STATUS command failed, ret =3D %d, error= =3D %#x\n", rc, *error); @@ -1297,11 +1291,10 @@ static int snp_get_platform_data(struct sev_device = *sev, int *error) * command to ensure structure is 8-byte aligned, and does not * cross a page boundary. */ - page =3D alloc_page(GFP_KERNEL); - if (!page) + feat_info =3D snp_alloc_firmware_page(GFP_KERNEL); + if (!feat_info) return -ENOMEM; =20 - feat_info =3D page_address(page); snp_feat_info.length =3D sizeof(snp_feat_info); snp_feat_info.ecx_in =3D 0; snp_feat_info.feature_info_paddr =3D __psp_pa(feat_info); @@ -1313,7 +1306,7 @@ static int snp_get_platform_data(struct sev_device *s= ev, int *error) dev_err(sev->dev, "SNP FEATURE_INFO command failed, ret =3D %d, error = =3D %#x\n", rc, *error); =20 - __free_page(page); + snp_free_firmware_page(feat_info); =20 return rc; } --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012052.outbound.protection.outlook.com [52.101.53.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 462FF519E13; Fri, 18 Sep 2026 16:42:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.52 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749769; cv=fail; b=ta1Ae/AWhVssLjwWYucCPk8FL8Wcaxm720XjnnLEyT/C9roGoGmboN2qMwTqpUL4hcAvgavn6rtZnKEbel8w7qdz+TBMHbqpCjcq3VXxLz1G13t4xXQW8fDVBR41AgEP4tst4W4U3JNFST3/fG1A3D9eHQzw/wvwZif6ehpTCzA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749769; c=relaxed/simple; bh=a9bbHkoJbijYsc1hLVYLpa9oG3PzmH0X8LlD9zOqeZs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=G59h/nqiZ9nqaPo3M18mumX/BnZ3XQ2Otk4gMHdAevWN9KltWtKykaTVoCRmxVv5TCjj/2qcD0cL25/2odBkDlEP7vP0FTpLd4UesCp3ZvEmlg3I8TNvUvGg+/NoMP8OZvpnHg83zstwaLJAnHPf3mor+5R1A6D0UTIDTF4X1Yw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=39uYw+rN; arc=fail smtp.client-ip=52.101.53.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="39uYw+rN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xJJVFmbj+b52NIDB8yX4+yoOOfFdCtjRuJrvZ3JvKxl7XDO+3c5wW2/LEGLdBbxex8ZPo2yFl8Ln1lcjcisgw96YGUkIPWziZeLofPzXVxiPZYOWrUJM4w+o3cQPtUvWZg5o2JRFBT5ykWokhh1rFnOByV3UY1ihpWJj/QJeoT+ddflkXzb9fJApngrmwfu8bnKYY28wgURjx1Ue2eGo6wtRd9igOw27RkS/6sP5Mbr2N0PlaJL2c56x7hE4+GSwXu3i9hQFGZZg1w8Qse3/Z1JtN3cg1jYepm57qGwVNypBx/DJDRaU2HtkP38kvg0FGSnzJn7jSxpwEUDbFxXANw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Gao897XzuaUVH6SthFszXT6PSZBfUUavfCpUBsweRsU=; b=blXssBnZ5sqe2WcsPdxyBQLachKcGv9RgTZ2TfAMIq4hQv/OnEoSNMgPaAKX1R6B+9e4ZIq0MrMXswh7pwptHpvZATD3HJvf7MJmS+vBNBOH1fCtRmqVOty0GSiVRMmDzZT3c+CDM0dy8u9Ry51ksi5/x05Y91AaFrSXEt4sO5mGXDS7tzU0b4I4SLorRGN2dd74MoU0phGXqel53h+OL1M4coSeCY+3dcniii/3KpHR3SiOhMj4x4Rk5wk8U/4s101sSTSN9y/vKrEVcLk214/7NpqyGMhXjeJbLIxTVh4nn99mhrCFzENIKQj/Xjo/v3eFaR/84ffcAkh4SCVHtQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Gao897XzuaUVH6SthFszXT6PSZBfUUavfCpUBsweRsU=; b=39uYw+rNqL7sCK+8/d9izwGj0OcaV9RZDULsfwmotc0z3hadFhHSQ9LOM8dEGkjh/mGGFp7PwJjY8HCbWA3GV8oKOulW5POpQ9Wtt7rc8UjHhJQhTNZ3UMIrBB88yG1HQtpi/xQIyZxnYlMbbPzZk4Rrg/7Iy8mU9eibx5frvXM= Received: from SJ0PR13CA0127.namprd13.prod.outlook.com (2603:10b6:a03:2c6::12) by MW6PR12MB8758.namprd12.prod.outlook.com (2603:10b6:303:23d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.12; Fri, 18 Sep 2026 16:42:26 +0000 Received: from SJ1PEPF00001CDD.namprd05.prod.outlook.com (2603:10b6:a03:2c6:cafe::39) by SJ0PR13CA0127.outlook.office365.com (2603:10b6:a03:2c6::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:42:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CDD.mail.protection.outlook.com (10.167.242.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:42:26 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:42:23 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 6/7] crypto/ccp: Register with fw_uploader and always fail Date: Fri, 18 Sep 2026 16:41:00 +0000 Message-ID: <7464499e7c352c1ab16c50700f9f68561f84ede5.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CDD:EE_|MW6PR12MB8758:EE_ X-MS-Office365-Filtering-Correlation-Id: 0383d50b-d8c1-4f92-36fd-08df15a3d26c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|82310400026|36860700016|1800799024|23010399003|10067099003|3023799007|18002099003|22082099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: 8RaPEAYoOlgya967DdJVCQU9VdURcUeeoloH7HPyoebAzvZETAB0n2+DYOiqS4aa+G42QnoE2XY9kiJ+G57fFKLNGd6PDsv6c1R8ZjYCZUIr2aC/y84rpG4YIBgf1TKDfsr8tim9cE+adHrauxdC+qLgd2acLSE1LbwObKdIoHVzhvPpUnu7NcX9mSm4d6pZiuFEbH54sFqlinSliV2DRqBaM2QoEe2vpbbhZ9ePouptZOl/sAhozl/EjfTd42Iv4EnJpzmKDpbktGoN7a5Gfozv0ub0ZplnY0YLqX+gNLLXx2inx6C+Pjzbp0hx8A6mwJdrUNb5V+bCsQOmvDtpGFdptcPAAklkJLRZaHyDWl5cfVGPW9mCR2040pUxhFR093dADn9mLs5Mm26qsfgHZMBvgJGb51vLcKg6q+HXc0O2nTB1lPZuPfRWODjKLYro/02abduHt33wnWT9wtOoZOKtWEeyX9YhT6gH9wDCHNxR8u7GiqTvMhvk1dCr0wt7FFxGU4c3EnWqzezhQ3i9ONDBBq6IMJfDMzd9N1j1cdSCFmXjf8gopmvPR0MSn43lnZAxXzXg9g5yJ3mWh0ToA50oR9gA3hcNemHEMPJvqVAmnUkiuGhWWUgG+tSHeOFh7YZcRhg8hbPsa8PiVfm9dUJRpSKcIAIx9PYbzBYg+7dwvHusS3hZ/tBEkLwSHQLBXcOUGuBLkD20O2N5dPHoyQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(376014)(82310400026)(36860700016)(1800799024)(23010399003)(10067099003)(3023799007)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: dFl7T8BAXQz63TAtUVhrvPcl4Q2vejtG1fr1zjJIyvGKg7AnVxBj4Z0eVbAK1ZFxuMFIaKKJqDwI2JZjyVTQz2WUAF/F73+4dM1S5By7H3tnV3b5Svtnljo5N3I+VIHosCbMBZVEeWWpdsqZ+nLMzhXKCq7l2QovHqKFxYb1M4n5wBfjMPYAAu93Ni79W7lUMVc6pR4W61ofIosKiBWFGTPxfrZIMohu+H+iPrdIJHON9oscU94fte0kJj7d17Rl7ZRKCBoogHaLfn+Ry9X+r8o17NDnEQulopLWo21Hy5DDJAOdlxG4aC56sMtbFXshy2u/OoHOhzdDTQ6jsAJNlx6qD9iFvQm8cWpB+8TxGgPxvYFMBokCGI5JU2GNpIgZFpL8TI6Sj/VtkTuQfnoAsv2IzZtI6m5B3tEjtXMcKj9MudCq4O6vQhorN8pUKcow X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:42:26.3368 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0383d50b-d8c1-4f92-36fd-08df15a3d26c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CDD.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB8758 Content-Type: text/plain; charset="utf-8" In preparation for SEV-SNP DOWNLOAD_FIRMWARE_EX live firmware update support, add an 'sev' firmware loader that always fails with EBUSY. Co-developed-by: Tycho Andersen (AMD) Signed-off-by: Tycho Andersen (AMD) Signed-off-by: Pratik R. Sampat --- v1..v2: Use an atomic to get sev->fwl state to ensure that isn't a race possible while unregistering the interfaces - Sashiko --- drivers/crypto/ccp/sev-dev.c | 79 ++++++++++++++++++++++++++++++++++++ drivers/crypto/ccp/sev-dev.h | 2 + 2 files changed, 81 insertions(+) diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index 3704f52bd08d..f3714e8f5ab1 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -2208,6 +2208,79 @@ static int sev_update_firmware(struct device *dev) return ret; } =20 +#ifdef CONFIG_FW_UPLOAD +static enum fw_upload_err sev_fw_upload_prepare(struct fw_upload *fw_uploa= d, + const u8 *data, u32 size) +{ + return FW_UPLOAD_ERR_NONE; +} + +static enum fw_upload_err sev_fw_upload_write(struct fw_upload *fw_upload, + const u8 *data, u32 offset, + u32 size, u32 *written) +{ + return FW_UPLOAD_ERR_BUSY; +} + +static enum fw_upload_err sev_fw_upload_poll_complete(struct fw_upload *fw= _upload) +{ + return FW_UPLOAD_ERR_NONE; +} + +static void sev_fw_upload_cancel(struct fw_upload *fw_upload) +{ + /* intentional no-op */ +} + +static const struct fw_upload_ops sev_fw_upload_ops =3D { + .prepare =3D sev_fw_upload_prepare, + .write =3D sev_fw_upload_write, + .poll_complete =3D sev_fw_upload_poll_complete, + .cancel =3D sev_fw_upload_cancel, +}; + +static void register_sev_fw_uploader(struct sev_device *sev) +{ + struct fw_upload *fwl; + + /* + * SNP firmware update is a platform-wide operation; only the master + * PSP issues firmware commands. Register a single global interface. + */ + if (sev->psp !=3D psp_master || sev->fwl) + return; + + fwl =3D firmware_upload_register(sev->dev, "sev", &sev_fw_upload_ops, + sev); + if (IS_ERR(fwl)) { + dev_err(sev->dev, "SEV firmware upload registration failure: %ld\n", + PTR_ERR(fwl)); + return; + } + + sev->fwl =3D fwl; +} + +/* + * The upload ops issue PSP commands, so the interface has to be gone befo= re + * the SEV firmware is shut down and the PSP interrupt handler is cleared. + * devm teardown on sev->dev runs after the driver's remove callback and is + * therefore too late. Both teardown paths call this, and a module removal= can + * run concurrently with a sysfs unbind, so claim the pointer atomically to + * keep the unregister to a single caller. + */ +static void unregister_sev_fw_uploader(struct sev_device *sev) +{ + struct fw_upload *fwl =3D xchg(&sev->fwl, NULL); + + if (fwl) + firmware_upload_unregister(fwl); +} +#else /* CONFIG_FW_UPLOAD */ +static void register_sev_fw_uploader(struct sev_device *sev) { } +static void unregister_sev_fw_uploader(struct sev_device *sev) { } +#endif /* CONFIG_FW_UPLOAD */ + static int __sev_snp_shutdown_locked(int *error, bool panic) { struct psp_device *psp =3D psp_master; @@ -3014,6 +3087,8 @@ void sev_dev_destroy(struct psp_device *psp) if (!sev) return; =20 + unregister_sev_fw_uploader(sev); + sev_firmware_shutdown(sev); =20 if (sev->misc) @@ -3077,6 +3152,8 @@ void sev_pci_init(void) api_major, api_minor, build, sev->api_major, sev->api_minor, sev->build); =20 + register_sev_fw_uploader(sev); + return; =20 err: @@ -3092,6 +3169,8 @@ void sev_pci_exit(void) if (!sev) return; =20 + unregister_sev_fw_uploader(sev); + sev_firmware_shutdown(sev); } =20 diff --git a/drivers/crypto/ccp/sev-dev.h b/drivers/crypto/ccp/sev-dev.h index d5e596606def..7ec692e2147e 100644 --- a/drivers/crypto/ccp/sev-dev.h +++ b/drivers/crypto/ccp/sev-dev.h @@ -69,6 +69,8 @@ struct sev_device { =20 struct tsm_dev *tsmdev; struct sev_tio_status *tio_status; + + struct fw_upload *fwl; }; =20 int sev_dev_init(struct psp_device *psp); --=20 2.43.0 From nobody Thu Sep 24 23:31:35 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010070.outbound.protection.outlook.com [52.101.193.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A5A5251AFDF; Fri, 18 Sep 2026 16:42:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749780; cv=fail; b=qBKqVRm8+4W467OoHqFCBYdVUaO5sN8VJi05491kRlhaXFrl+19c+sxUPFoogQ6w7esbR1mWq2uMi3pSyl0m75Rh4UuTvF/p5noCZvOCW1ZsJvWQu6057Bq/H3JFbhPC9dxs6Zk48u5WXK5K1In4D1O5cDvaFDFNfAP7i36yk3s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789749780; c=relaxed/simple; bh=b979a89YSlxWiaPAM4xbD7lN0HBPD66Cy1iX6OqKKcU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=q3jXTWZ3kyeaGG6Kjz5F2Tfm4Slc4sg3oT4FQhr/kVeI+is8+OxBbFnfBIzBC9SCktKhvEVRb7g6NI+9AMJmuEZRaE8/02uKQqKb9MwbVU25z3guj09H+mKmlAcT8/giPHKtmf41mBjyVrTecOQqsbtRbiyljU4ILMCAEmkhFsU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=qjiblG4y; arc=fail smtp.client-ip=52.101.193.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="qjiblG4y" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xOUx01i7/AU6lgg7AIf75WKmsoLpQu6VY5ILZl0EWvoOcPlyS6dYDZykD5IRk0Gtbvuq8Cw+aFxaadvf4qrjdaOmOs/eBOwxM8MUVDLdRFTGLw/kRUnEgLunMMCTdGlGyKs5UwF95ehpDewBRCagyI6vMs/Bu38PjRyvE8PXgezRwsMtBP1PEF1xftK02pq1Cfi6k0gla/aIRyKjo/s9smOU6KEvKycyn7a81QidFk3JEfi4yepKShIWVTTn+yfQqLLnOiyqAjxo6qGi50EPTLvqD0s2RHSCM3mDkvaRnMOSwoptbwarhJkbwL0RlFU5Lsu8f8s/bWCKY26Sl+gjjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ohUejXLfOeaI32tOXg/M+rrQmOFxbyBMoxvkIvUaDvQ=; b=ikCZVduWFhgjYilSSt2I/PwzYomKEHVsF70fw29Gkf+VbO9UfxTzb6APxP7B5FtoGVE8/fFme4lBrhQl5uJudH0U8W8fh1FRbrO4jD4uNHp2m2iFm+szvXuNCrufFuHSO/TD4T9Ksq0BVHbrQPD3VsaNyHd8yb5ULa9ie7suo9SoPRvRGLoUOWZkQdeuArdjCqy/PwFbUYgJC8WyND/nqGdKi/op7j+azb0RoppRYCHnLT6KaXvbqLV93yInIVQGxXHG8U/YFlhQ4q9+WiKfzm4vrYiLsus8Z9PqQHLKkCWPnHU5p10QQLjHU+oPjUrgq82DzMSnx0GLW0kSvEKdIg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ohUejXLfOeaI32tOXg/M+rrQmOFxbyBMoxvkIvUaDvQ=; b=qjiblG4ygNcSGB6HRFCoy9vbFEWazBna6Qa2v5fpt5g00+g4+P3DznDOis4iRsPII/eEXvIZKT66AZUG/kMVCHA+fmg2H4ep7RJnhYjOqjSMNWILYzuVHecDv0gWnY5P2d+YDjfko5rO5puPQZ3AgacrUxl3MYtQ/iLEokk8c8g= Received: from CPYP284CA0044.BRAP284.PROD.OUTLOOK.COM (2603:10d6:103:81::13) by DS5PPF1ADAD2878.namprd12.prod.outlook.com (2603:10b6:f:fc00::646) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Fri, 18 Sep 2026 16:42:40 +0000 Received: from SJ1PEPF00001CE1.namprd05.prod.outlook.com (2603:10d6:103:81:cafe::8a) by CPYP284CA0044.outlook.office365.com (2603:10d6:103:81::13) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.13 via Frontend Transport; Fri, 18 Sep 2026 16:42:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00001CE1.mail.protection.outlook.com (10.167.242.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 16:42:36 +0000 Received: from speedway8455host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 11:42:34 -0500 From: "Pratik R. Sampat" To: , , , , , , CC: , , , , , , , , , , Subject: [Patch v2 7/7] crypto/ccp: Implement SNP Download Firmware EX Date: Fri, 18 Sep 2026 16:41:01 +0000 Message-ID: <3463e8ce7b925d8cade35cf9d98b96bc3fc619b4.1789749016.git.prsampat@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CE1:EE_|DS5PPF1ADAD2878:EE_ X-MS-Office365-Filtering-Correlation-Id: 31084fdb-2b1e-45c1-5c5f-08df15a3d83c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|23010399003|376014|7416014|82310400026|1800799024|10067099003|3023799007|56012099006|5023799004|6133799003|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: mz2IuHw9ncYTjqQpeBOTUrTS39Mavp4nYTCwOdcWJdrzyd8uqtS/vcT0UAbPCPyWCnJrWLy37HZ17XB9oqFii0RssfcTml1TyM2uD6tkP3G+02VRzXHSFR8SJREjjpVpeWKr2GbsIBvFyFYj1PXPHjDIGzVOGmFl9V40dSZBPhuf+DZ74siOob55u9Q6HQBdgTT8m2ps+Z9lqiPdV0fcTSJHGXZGZuWRvJiHIo/PLMQidGCw8PBUPCbDckBhkQcqCtvo1r7uD0Ve6B+IFGCybb4oC9Bj4H4Mm8cF2vsyhtqnfAlpsGhnJMIX9KSk/+ytEOETykiU1RVAW7qA2hVrI8HKTIMCtdL0sLX4qduSzUs9AwSO2gmZ/XfWaG6wtnhfAtguVOlpDUBEMAsujxaAuxuZYkKuosRtM6KyBIIp8KcEy8f2r5uOuRWkZAJX/JIcEtOPLwFs3J0ICv9MUwYbAUIcUzoEuXNLTw1nf/6qvXsIzisNzClDwggtAE5o/U2k/3TgX6oB4S76RREIs6PqRPOl9Q6julgzT8JXeS0K+VSN9um6yi9Pkmry+Ao1AcMm80yWsm43lcxkc8DvHpvhh2Fsv5iyfxwnVNsYqAukgCbf8J+ReS46XiPQU8BzSlRZGls2bjlHcOx5OHC0BUHhqLqt4xtXC202/JOjRxUfuubIeTWWjPjvzsBhn0IkQu30VIrb1rfIEsdFzyBPjy56wA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(23010399003)(376014)(7416014)(82310400026)(1800799024)(10067099003)(3023799007)(56012099006)(5023799004)(6133799003)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Z91Axbhm9yB/5kxNLQNLSlgcInHTv9IVLfLHykT+NOoCeaZvHdUOQSobhMdR7lfsZUhXg4xEFzvfHkMKEprg6lsU1Qtkv3IwMEfR3IU+RXs5al/e6UVIisgxBgR3LuaamogJ+EYuJ3Bi8utEZYZB59R2utMtEhVPdQ92DVaKIoL/E9fHIqFeFkR2MjKWOeheJRlwscaAIOS86n1C8GabdZ1T/csm/vmt+PWY2DQU28sXt7Dfy9lz14aHFEFVep3YMt/MCWzS3sunwt4sLfSN9u0mBrTaL95RktVst5lYXplTjbGBSWCDVhp7xzOkKfUMJaVRKbEhFnpepSFVm8xyjP3WwTOb2ENmHNAj+7ie3XvsbOeKCg96GJ8ms7DnhTcyCM/p3tocRlSLyRecifNkSmAoGcKGZsSX4UCXBkcX1gCXJd5CJMYfpLpTWFA5c3EF X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 16:42:36.0308 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 31084fdb-2b1e-45c1-5c5f-08df15a3d83c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CE1.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS5PPF1ADAD2878 Content-Type: text/plain; charset="utf-8" Implement SNP live firmware update using the DOWNLOAD_FIRMWARE_EX command. DOWNLOAD_FIRMWARE_EX requires the legacy SEV platform to be UNINIT. If it is WORKING then legacy guests are running and the update is refused as busy. If it is INIT, shut it down, release the buffers the firmware owns across that shutdown, run the update, and bring the platform back up afterwards. SNP is never taken down, so SNP guests are unaffected. To test run the following with your sbin file in FW: echo 1 > /sys/class/firmware/sev/loading cat > /sys/class/firmware/sev/data echo 0 > /sys/class/firmware/sev/loading The COMMIT bit is left clear, so the image is only loaded provisionally and the admin decides when to make it permanent with ioctl(/dev/sev, SNP_COMMIT). To roll back, do not commit and upload the previous image the same way. Co-developed-by: Tycho Andersen (AMD) Signed-off-by: Tycho Andersen (AMD) Signed-off-by: Pratik R. Sampat --- drivers/crypto/ccp/sev-dev.c | 268 ++++++++++++++++++++++++++++++++++- drivers/crypto/ccp/sev-dev.h | 2 + include/linux/psp-sev.h | 19 +++ 3 files changed, 288 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index f3714e8f5ab1..aee708be7cab 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -29,6 +29,7 @@ #include #include #include +#include =20 #include #include @@ -252,6 +253,7 @@ static int sev_cmd_buffer_len(int cmd) case SEV_CMD_SNP_PLATFORM_STATUS: return sizeof(struct sev_data_snp_addr); case SEV_CMD_SNP_GUEST_REQUEST: return sizeof(struct sev_data_snp_guest_= request); case SEV_CMD_SNP_CONFIG: return sizeof(struct sev_user_data_snp_config); + case SEV_CMD_SNP_DOWNLOAD_FIRMWARE_EX: return sizeof(struct sev_data_down= load_firmware_ex); case SEV_CMD_SNP_COMMIT: return sizeof(struct sev_data_snp_commit); case SEV_CMD_SNP_FEATURE_INFO: return sizeof(struct sev_data_snp_feature= _info); case SEV_CMD_SNP_VLEK_LOAD: return sizeof(struct sev_user_data_snp_vlek_= load); @@ -2209,17 +2211,274 @@ static int sev_update_firmware(struct device *dev) } =20 #ifdef CONFIG_FW_UPLOAD +/* Largest image the firmware accepts, anything above is rejected */ +#define SEV_FW_IMAGE_MAX_SIZE SZ_512K + static enum fw_upload_err sev_fw_upload_prepare(struct fw_upload *fw_uploa= d, const u8 *data, u32 size) { + struct sev_device *sev =3D fw_upload->dd_handle; + + if (size > SEV_FW_IMAGE_MAX_SIZE) { + dev_err(sev->dev, "DLFW_EX: image of %u bytes exceeds the %u byte maximu= m\n", + size, SEV_FW_IMAGE_MAX_SIZE); + return FW_UPLOAD_ERR_INVALID_SIZE; + } + return FW_UPLOAD_ERR_NONE; } =20 +static int sev_download_firmware_ex(const u8 *data, u32 size, int *psp_ret) +{ + struct sev_data_download_firmware_ex sev_data =3D {0}; + int ret, order; + struct page *p; + void *fw_blob; + + order =3D get_order(size); + p =3D alloc_pages(GFP_KERNEL | __GFP_ZERO, order); + if (!p) + return -ENOMEM; + + fw_blob =3D page_address(p); + memcpy(fw_blob, data, size); + + sev_data.len =3D sizeof(sev_data); + sev_data.fw_paddr =3D __psp_pa(fw_blob); + sev_data.fw_len =3D size; + /* + * Don't commit to the new firmware immediately, perform an explicit + * SNP_COMMIT after + */ + sev_data.commit =3D 0; + + ret =3D __sev_do_cmd_locked(SEV_CMD_SNP_DOWNLOAD_FIRMWARE_EX, &sev_data, + psp_ret); + + __free_pages(p, order); + + return ret; +} + +static enum fw_upload_err sev_fw_upload_handle_err(struct sev_device *sev, + int rc, int psp_ret) +{ + enum fw_upload_err ret =3D FW_UPLOAD_ERR_FW_INVALID; + + if (!rc) + return FW_UPLOAD_ERR_NONE; + + switch (psp_ret) { + case SEV_RET_INVALID_PARAM: + dev_err(sev->dev, "DLFW_EX: Provided image is not well formed\n"); + break; + case SEV_RET_INVALID_LEN: + ret =3D FW_UPLOAD_ERR_INVALID_SIZE; + dev_err(sev->dev, "DLFW_EX: Provided image has an unusable length\n"); + break; + case SEV_RET_SHUTDOWN_REQUIRED: + dev_err(sev->dev, "DLFW_EX: Provided image cannot be live-updated, shutd= own required\n"); + break; + case SEV_RET_BAD_VERSION: + dev_err(sev->dev, "DLFW_EX: Provided image < committed version\n"); + break; + case SEV_RET_INVALID_PLATFORM_STATE: + dev_err(sev->dev, "DLFW_EX: Platform not in UNINIT state\n"); + break; + case SEV_RET_INVALID_ADDRESS: + dev_err(sev->dev, "DLFW_EX: Unaligned address provided\n"); + break; + case SEV_RET_UNSUPPORTED: + dev_err(sev->dev, "DLFW_EX: feature not supported\n"); + break; + case SEV_RET_INVALID_CONFIG: + dev_err(sev->dev, "DLFW_EX: Image rejected, unsupported configuration\n"= ); + break; + case SEV_RET_BAD_SIGNATURE: + dev_err(sev->dev, "DLFW_EX: Bad firmware signature\n"); + break; + case SEV_RET_UPDATE_FAILED: + ret =3D FW_UPLOAD_ERR_HW_ERROR; + dev_err(sev->dev, "DLFW_EX: Upgrade failed, automatically reverted\n"); + break; + case SEV_RET_RESTORE_REQUIRED: + dev_err(sev->dev, "DLFW_EX: live upgrade failed, please roll back\n"); + /* + * Firmware requested a roll-back. Declare the PSP dead so + * nothing else tries to use it, and let the next upload through + * so the admin can restore the previous image. + */ + sev->fwl_rollback_required =3D true; + psp_dead =3D true; + ret =3D FW_UPLOAD_ERR_HW_ERROR; + break; + case SEV_RET_HWSEV_RET_UNSAFE: + dev_err(sev->dev, "DLFW_EX: SEV firmware no longer safe. Reboot recommen= ded\n"); + /* + * Following a return of HARDWARE_UNSAFE, operation of the SEV + * firmware is indeterminate and the recommendation is to reboot + * the platform. Declare the PSP dead so the driver stops + * issuing commands to it while the reboot is pending. + */ + psp_dead =3D true; + ret =3D FW_UPLOAD_ERR_HW_ERROR; + break; + case SEV_RET_NO_FW_CALL: + /* The command never reached the firmware. */ + dev_err(sev->dev, "DLFW_EX: driver error %d\n", rc); + ret =3D FW_UPLOAD_ERR_HW_ERROR; + break; + default: + dev_err(sev->dev, "Unknown SEV firmware err 0x%x\n", psp_ret); + ret =3D FW_UPLOAD_ERR_HW_ERROR; + break; + } + + return ret; +} + +static int sev_fw_upload_shutdown_platform(struct sev_device *sev) +{ + int rc, error =3D SEV_RET_NO_FW_CALL, sev_plat_state; + + lockdep_assert_held(&sev_cmd_mutex); + + rc =3D sev_get_platform_state(&sev_plat_state, &error); + if (rc) { + dev_err(sev->dev, "SEV get platform state failed %d, error %#x\n", + rc, error); + return rc; + } + + switch (sev_plat_state) { + case SEV_STATE_UNINIT: + return 0; + case SEV_STATE_WORKING: + /* Legacy guests are running, the update cannot proceed. */ + return -EBUSY; + case SEV_STATE_INIT: + break; + default: + dev_err(sev->dev, "Unknown SEV firmware state %d\n", sev_plat_state); + return -EINVAL; + } + + rc =3D __sev_platform_shutdown_locked(&error); + if (rc) { + dev_err(sev->dev, "SEV platform shutdown failed %d, error %#x\n", + rc, error); + return rc; + } + + __sev_release_firmware_buffers(false); + + sev->fwl_reinit_required =3D true; + + return 0; +} + +static void sev_fw_upload_reinit_platform(struct sev_device *sev) +{ + int rc, error =3D SEV_RET_NO_FW_CALL; + + lockdep_assert_held(&sev_cmd_mutex); + + if (!sev->fwl_reinit_required) + return; + + rc =3D __sev_platform_init_locked(&error); + if (rc) { + dev_err(sev->dev, "SEV platform re-init failed %d, error %#x\n", + rc, error); + return; + } + + sev->fwl_reinit_required =3D false; +} + +static enum fw_upload_err sev_fw_upload_update(struct sev_device *sev, + const u8 *data, u32 size, + u32 *written) +{ + int rc, error =3D SEV_RET_NO_FW_CALL; + enum fw_upload_err ret; + + guard(mutex)(&sev_cmd_mutex); + + /* + * A PSP declared dead only executes DOWNLOAD_FIRMWARE_EX if it was the + * firmware update that killed it and asked for a rollback. Declared + * dead for any other reason it will not answer until the platform is + * rebooted. + */ + if (psp_dead && !sev->fwl_rollback_required) { + dev_err(sev->dev, "DLFW_EX: PSP is not responding\n"); + return FW_UPLOAD_ERR_HW_ERROR; + } + + /* + * If the last firmware update returned RESTORE_REQUIRED, retry DLFW_EX. + * We being in this state means that the legacy firmware has previously + * been shut down, so no need to do it again. + */ + if (sev->fwl_rollback_required) { + psp_dead =3D false; + } else { + rc =3D sev_fw_upload_shutdown_platform(sev); + if (rc) { + return rc =3D=3D -EBUSY ? FW_UPLOAD_ERR_BUSY + : FW_UPLOAD_ERR_HW_ERROR; + } + } + + rc =3D sev_download_firmware_ex(data, size, &error); + ret =3D sev_fw_upload_handle_err(sev, rc, error); + if (ret =3D=3D FW_UPLOAD_ERR_NONE) { + *written =3D size; + sev->fwl_rollback_required =3D false; + } + + /* A rollback retry failed. PSP now stays dead. */ + if (sev->fwl_rollback_required) + psp_dead =3D true; + + if (!sev->fwl_rollback_required && !psp_dead) + sev_fw_upload_reinit_platform(sev); + + return ret; +} + static enum fw_upload_err sev_fw_upload_write(struct fw_upload *fw_upload, const u8 *data, u32 offset, u32 size, u32 *written) { - return FW_UPLOAD_ERR_BUSY; + struct sev_device *sev =3D fw_upload->dd_handle; + u8 old_major, old_minor, old_build; + enum fw_upload_err ret; + + old_major =3D sev->api_major; + old_minor =3D sev->api_minor; + old_build =3D sev->build; + + ret =3D sev_fw_upload_update(sev, data, size, written); + if (ret !=3D FW_UPLOAD_ERR_NONE) + return ret; + + if (sev_get_api_version()) { + dev_err(sev->dev, "SNP platform data refresh after firmware update faile= d\n"); + return FW_UPLOAD_ERR_HW_ERROR; + } + + if (sev->api_major !=3D old_major || sev->api_minor !=3D old_minor || + sev->build !=3D old_build) { + dev_info(sev->dev, "SEV firmware updated to %d.%d build %d\n", + sev->api_major, sev->api_minor, sev->build); + } else { + dev_info(sev->dev, "SEV firmware version unchanged: %d.%d build %d\n", + sev->api_major, sev->api_minor, sev->build); + } + + return ret; } =20 static enum fw_upload_err sev_fw_upload_poll_complete(struct fw_upload *fw= _upload) @@ -2243,6 +2502,13 @@ static void register_sev_fw_uploader(struct sev_devi= ce *sev) { struct fw_upload *fwl; =20 + /* + * The interface only drives DOWNLOAD_FIRMWARE_EX, which is an SNP + * command, so do not advertise it where SNP is unavailable. + */ + if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP)) + return; + /* * SNP firmware update is a platform-wide operation; only the master * PSP issues firmware commands. Register a single global interface. diff --git a/drivers/crypto/ccp/sev-dev.h b/drivers/crypto/ccp/sev-dev.h index 7ec692e2147e..1e45a08c41da 100644 --- a/drivers/crypto/ccp/sev-dev.h +++ b/drivers/crypto/ccp/sev-dev.h @@ -71,6 +71,8 @@ struct sev_device { struct sev_tio_status *tio_status; =20 struct fw_upload *fwl; + bool fwl_rollback_required; + bool fwl_reinit_required; }; =20 int sev_dev_init(struct psp_device *psp); diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h index 03a79786df1d..c6adbd46f05a 100644 --- a/include/linux/psp-sev.h +++ b/include/linux/psp-sev.h @@ -856,6 +856,25 @@ struct sev_platform_init_args { unsigned int max_snp_asid; }; =20 +/** + * struct sev_data_download_firmware_ex - SNP_DOWNLOAD_FIRMWARE_EX structu= re + * + * @len: length of the command buffer read by the PSP + * @rsvd0: reserved + * @fw_paddr: system physical address of the start of the firmware blob + * @fw_len: length of the firmware blob + * @commit: whether to immediately commit the firmware update + * @rsvd1: reserved + */ +struct sev_data_download_firmware_ex { + u32 len; /* In */ + u32 rsvd0; + u64 fw_paddr; /* In */ + u32 fw_len; /* In */ + u32 commit:1; /* In */ + u32 rsvd1:31; +} __packed; + /** * struct sev_data_snp_commit - SNP_COMMIT structure * --=20 2.43.0