From nobody Fri Dec 19 08:57:21 2025 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011029.outbound.protection.outlook.com [40.107.208.29]) (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 479A62EBBB0 for ; Mon, 8 Dec 2025 22:14:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232066; cv=fail; b=ZAai5SmcLysp4U9qydtRFStuhFTSwdd461j+XmyP72sFyoTs8OZsWxzH9verLutmFnwJFPJ+FxHpZPNnw0xv13pmXNqn382EOwNAnV0oPWicyJR+qxhEPM7S4IX1w2cHdSfrgasP0+igyuunXOBeyCmUaJW/OlS3XtmE7G+9SEE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232066; c=relaxed/simple; bh=XgncDHCPE0qUlcUYLZgaSH0Xh3vQ2qPIk+jvIsoEqkg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oasutwvPp1tEKe+n87AW1vkefES5KItYPfopwrJLEvshTtuBaFanEPgYAQSfKil3Pz0tqw7/wAiJ3c/O+Pjujx3Uj31j7nM/+pptCpNWircIztjFIIFZ8Tf9VLbXb9RxJ0VfvRG59s//uC/J4dX+qKl8H0J1Zj2z1sB+pkI8PDE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=BX1Mp8fl; arc=fail smtp.client-ip=40.107.208.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="BX1Mp8fl" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tKFNYjiYJhHqIhKL6lt+HKt0RRsabTdnZlcDPMXyViliXXmqieWXBtZUWLO6PZDNTXxBU+9FNeFjJNJ5M/a9qUQk6eeo0K/oLFb065ZmYfXjRqeoMb78cqQUQvElcBzzAS/KJnLwvyrBlEPquuX+ON8s6S57Xbd2plzhM7hVZ4UYdSVwnpsAIpochkm1PgyRyyF+yfxvw0Bf9f56oD/ncBq7a2zn0H0vGVGUTZ8Un2jhNIMwQxocTUUPxzIa6ef83zkktSmKQ3ss7vqFi1wwYE0ZMH3tBw0oFvjj6fqgajUIiKp9i46LtxuYuaDy6L7qHt+AGGMYmqc6e8FvfwdIqg== 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=UNdCpr9KaMKmcawYn84inPu5qjCMmW6AI6/zz2hDM2M=; b=og97/tTFmYz383Kvgx3FmS2fBKOzcupMeNU5VrjAqLjYMG44nmj2ta8fFqT/lVB6fpMIHeUDNafpGbjNBO4DJ3ll4VeSwyY+HxEDjGBlgdFJrvnPOUbkz2K7pSdM5VZDP++yIufn9sfRjfcaKQwUDot4P8N8ElacRgFGiPhdwmhHEaAk3XPcymsOu/r8IWvqq7Fr2H9JcKSRfdlXbc9F65Rwp+1+PkEKf+BdD177IhQbD1C3I7l5V9oAxCINZynMVNyzvoe1UC+7yAP5yWBZfMZrfZItjWtKLxwxrpVze01nbbHQNfD7FdX4uwkKAo3QjcCIVd6NfIVyGgKcJG02kw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=arm.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UNdCpr9KaMKmcawYn84inPu5qjCMmW6AI6/zz2hDM2M=; b=BX1Mp8fl3vJMIPz8PMxVYqiRnpnfP1tgU8fXAuQjZMiRmkQzCjArXPCb17oXX/PYiFTCli2EpZ2ltYLWKh2rUH9o8M7nOV6q7Xrnlj6Vszc26H8WCd6ODJ2zwprjtZ9/nUMIy1kN1fgf0OUsfOijQtYtj0uXXXf5Dp+4T0MZOuGeP92wCQ8COsQWszE/tEK514r1inlgLsXN0FRlxoFiBH1RBIrcG47hE5HzvmV0raSbpnMgkF6LJ+wr+GR1dzlLJy0Qq7/sETmP9JZRiBDo5RsC/8Y6nueaFmhN/pOofbc0JjnFqXu2a1dklrq1zCKNM3E/sq+QX60jfDfGgfYz2w== Received: from BY5PR04CA0025.namprd04.prod.outlook.com (2603:10b6:a03:1d0::35) by IA0PR12MB9047.namprd12.prod.outlook.com (2603:10b6:208:402::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.14; Mon, 8 Dec 2025 22:14:19 +0000 Received: from CO1PEPF000044EF.namprd05.prod.outlook.com (2603:10b6:a03:1d0:cafe::6b) by BY5PR04CA0025.outlook.office365.com (2603:10b6:a03:1d0::35) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.14 via Frontend Transport; Mon, 8 Dec 2025 22:13:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF000044EF.mail.protection.outlook.com (10.167.241.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 22:14:18 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:08 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:07 -0800 Received: from build-vvidwans-noble-20250617.internal (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Mon, 8 Dec 2025 14:14:07 -0800 From: Vedashree Vidwans To: , , , , CC: , , , , , , , , Vedashree Vidwans Subject: [RFC PATCH 1/5] firmware: smccc: LFA: use smcc 1.2 Date: Mon, 8 Dec 2025 22:13:11 +0000 Message-ID: <20251208221319.1524888-2-vvidwans@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208221319.1524888-1-vvidwans@nvidia.com> References: <20251208221319.1524888-1-vvidwans@nvidia.com> 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-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000044EF:EE_|IA0PR12MB9047:EE_ X-MS-Office365-Filtering-Correlation-Id: 793ffcff-36df-4b2f-4d28-08de36a721bb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?CoGe6Ro94/DaJPCHNMAsILQ2nzeER+kmW40ySCnWJNG2rkrlcDDp/lBu6kgy?= =?us-ascii?Q?3EO9ODr1G5SPcuWmMFPJtSAHZ7OsHCLhdRZnyosHHo91xCABssLXBt4LLTrB?= =?us-ascii?Q?AC8wqqwXMQjw24QLMxhvM8fBd1QFuz78LLnaTbUOsH+qJMDADsR7GxU/usKC?= =?us-ascii?Q?11XftCXXSUnaqlZd+ohow3l4sBsedN5c9c3DxKPja5kjpZlFd9znQmm4p4BJ?= =?us-ascii?Q?835goMAv2vkCjDf9tEsTM0/bjTLY/FS1YXMcbumN5DBmU47P12389Qlh7b6+?= =?us-ascii?Q?06E9p6aj1AC1lRtii56PnBnPr0tee+uTayq3yA9erim1c030py/KqeqN1Ujb?= =?us-ascii?Q?QvEi3KyEs66gnaaX+7eoVzp2kWQ4q+PD5xyccBXIFizp5m9KL/zDhajhLW5W?= =?us-ascii?Q?93NAI4KpBDCBiZHM7CHK7772osSdzlpMBzoms7hr5l82mQmrxZ09VSab9r2y?= =?us-ascii?Q?o+VcSMp4vlrqHoRsdsWiVnHETHYzHF/VnN09rQSzYzu322Zd5WxJGOkmePVH?= =?us-ascii?Q?gRLJnYiXizDOWO9cWx1Ps4zSlUiT04+yy6FtHDBq5G//LsqkeQDBWup4k2n1?= =?us-ascii?Q?3DaZiMETBLXLkK2bH2KHmBqn29rN+08/jYXgO9SJbLoN8UdHnr3Q+3pnDjXh?= =?us-ascii?Q?Ojo1BYZYcbbkXAVC7lnRfMAvN1Y9Jh4Ssps224kcrJim4hDoTJgv09tFjoxZ?= =?us-ascii?Q?CZni8jBXU/x23qAu/ssSvHWLhgXtAKxMUyV1PvBBuzCJHJqIGQs6u3PHDut2?= =?us-ascii?Q?8q15PS4KLqo85m9hyv4Jgq/WQRTmxEQuw7wXMmKYEuj+/Zk78CjiVFTrwuJQ?= =?us-ascii?Q?OGFSe3ZWIq8FoM41PfKnGxhb+NiWDzgXoa/Vhzo2CcLsW1gJfcoIh9Je1+lJ?= =?us-ascii?Q?794hQSaNimho1iStBu+AHXHHwZDG2WHwsJ0Qn7QBxzRZbhPl9GmIdcXHyEOC?= =?us-ascii?Q?7y+ZVWkxuKnaUEnNuFRxv45nbK1iCXXoR0LMgnXqfuZRR5kgpm65Pyzw3IOT?= =?us-ascii?Q?GSxHjKlnEZ2bJgTF56Ii4/smS/bbeDZa1Zem9/aCIpL8YOSrYxoLS1T1u5JR?= =?us-ascii?Q?ta/eE/qSY/iTv/KgF039dukpgqdSskyF6p7aiEvTHmnnr0QJdY9L65Wm7EAs?= =?us-ascii?Q?r3pwP1Cm9pPWiuCuojqtExF8XZuuKsBO2FJz2ubKvrRfIZa3Tp7dEMykIBWT?= =?us-ascii?Q?vXW9Msd5FP2aOYporFIW8Gd5fCaV4th0rNB7tHGcd09PS7SidDPYJ8GJxda/?= =?us-ascii?Q?DVMRJb+qk2Uu8YfvwtejW1OiqsP1eUCQzdaPKA4EPYmBPrgiUH0Q8KZN/YUQ?= =?us-ascii?Q?0KwJAByN4WuVVd0qjOdEEhibHQ13Vg5A2gVJnqowhvgPzpNr/LPD3fGRD30A?= =?us-ascii?Q?zq1gYKjRlY057T1lAO0ep9Vbay5EbeSOL1Mg1VU1QSHv9B2PyY4Pb+KZcnY1?= =?us-ascii?Q?Eew3cBYEopzqBp7GFp/QpCMHRpJJHy0pJadj1zdSBLkYcyeFR+lX6qh3LOGk?= =?us-ascii?Q?NwKQqxy3xfOsd7SbZB3JReCf+s4rXQ1MEH0/O5nyGr90P6EOsanz7qzLIC8T?= =?us-ascii?Q?/hR+Q8XsfyiYxwArh7c=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 22:14:18.5650 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 793ffcff-36df-4b2f-4d28-08de36a721bb X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000044EF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB9047 Content-Type: text/plain; charset="utf-8" Update driver to use SMCCC 1.2+ version as mentioned in the LFA spec. Signed-off-by: Vedashree Vidwans --- drivers/firmware/smccc/lfa_fw.c | 102 ++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 37 deletions(-) diff --git a/drivers/firmware/smccc/lfa_fw.c b/drivers/firmware/smccc/lfa_f= w.c index 1f333237271d..bdde14b66606 100644 --- a/drivers/firmware/smccc/lfa_fw.c +++ b/drivers/firmware/smccc/lfa_fw.c @@ -117,32 +117,38 @@ static struct kobject *lfa_dir; =20 static int get_nr_lfa_components(void) { - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs reg =3D { 0 }; =20 - arm_smccc_1_1_invoke(LFA_1_0_FN_GET_INFO, 0x0, &res); - if (res.a0 !=3D LFA_SUCCESS) - return res.a0; + reg.a0 =3D LFA_1_0_FN_GET_INFO; + reg.a1 =3D 0; /* lfa_info_selector =3D 0 */ =20 - return res.a1; + arm_smccc_1_2_invoke(®, ®); + if (reg.a0 !=3D LFA_SUCCESS) + return reg.a0; + + return reg.a1; } =20 static int call_lfa_activate(void *data) { struct image_props *attrs =3D data; - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs args =3D { 0 }; + struct arm_smccc_1_2_regs res =3D { 0 }; + + args.a0 =3D LFA_1_0_FN_ACTIVATE; + args.a1 =3D attrs->fw_seq_id; /* fw_seq_id under consideration */ + /* + * As we do not support updates requiring a CPU reset (yet), + * we pass 0 in args.a3 and args.a4, holding the entry point and context + * ID respectively. + * We want to force CPU rendezvous if either cpu_rendezvous or + * cpu_rendezvous_forced is set. The flag value is flipped as + * it is called skip_cpu_rendezvous in the spec. + */ + args.a2 =3D !(attrs->cpu_rendezvous_forced || attrs->cpu_rendezvous); =20 do { - /* - * As we do not support updates requiring a CPU reset (yet), - * we pass 0 in x3 and x4, holding the entry point and context - * ID respectively. - * We want to force CPU rendezvous if either cpu_rendezvous or - * cpu_rendezvous_forced is set. The flag value is flipped as - * it is called skip_cpu_rendezvous in the spec. - */ - arm_smccc_1_1_invoke(LFA_1_0_FN_ACTIVATE, attrs->fw_seq_id, - !(attrs->cpu_rendezvous_forced || attrs->cpu_rendezvous), - 0, 0, &res); + arm_smccc_1_2_invoke(&args, &res); } while (res.a0 =3D=3D 0 && res.a1 =3D=3D 1); =20 return res.a0; @@ -150,7 +156,8 @@ static int call_lfa_activate(void *data) =20 static int activate_fw_image(struct image_props *attrs) { - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs args =3D { 0 }; + struct arm_smccc_1_2_regs res =3D { 0 }; int ret; =20 /* @@ -159,8 +166,10 @@ static int activate_fw_image(struct image_props *attrs) * LFA_PRIME/ACTIVATE will need to be called again. * res.a1 will become 0 once the prime/activate process completes. */ + args.a0 =3D LFA_1_0_FN_PRIME; + args.a1 =3D attrs->fw_seq_id; /* fw_seq_id under consideration */ do { - arm_smccc_1_1_invoke(LFA_1_0_FN_PRIME, attrs->fw_seq_id, &res); + arm_smccc_1_2_invoke(&args, &res); if (res.a0 !=3D LFA_SUCCESS) { pr_err("LFA_PRIME failed: %s\n", lfa_error_strings[-res.a0]); @@ -211,15 +220,17 @@ static ssize_t activation_pending_show(struct kobject= *kobj, { struct image_props *attrs =3D container_of(attr, struct image_props, image_attrs[LFA_ATTR_ACT_PENDING]); - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs reg =3D { 0 }; =20 /* * Activation pending status can change anytime thus we need to update * and return its current value */ - arm_smccc_1_1_invoke(LFA_1_0_FN_GET_INVENTORY, attrs->fw_seq_id, &res); - if (res.a0 =3D=3D LFA_SUCCESS) - attrs->activation_pending =3D !!(res.a3 & BIT(1)); + reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; + reg.a1 =3D attrs->fw_seq_id; + arm_smccc_1_2_invoke(®, ®); + if (reg.a0 =3D=3D LFA_SUCCESS) + attrs->activation_pending =3D !!(reg.a3 & BIT(1)); =20 return sysfs_emit(buf, "%d\n", attrs->activation_pending); } @@ -298,21 +309,23 @@ static ssize_t cancel_store(struct kobject *kobj, str= uct kobj_attribute *attr, { struct image_props *attrs =3D container_of(attr, struct image_props, image_attrs[LFA_ATTR_CANCEL]); - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs reg =3D { 0 }; =20 - arm_smccc_1_1_invoke(LFA_1_0_FN_CANCEL, attrs->fw_seq_id, &res); + reg.a0 =3D LFA_1_0_FN_CANCEL; + reg.a1 =3D attrs->fw_seq_id; + arm_smccc_1_2_invoke(®, ®); =20 /* * When firmware activation is called with "skip_cpu_rendezvous=3D1", * LFA_CANCEL can fail with LFA_BUSY if the activation could not be * cancelled. */ - if (res.a0 =3D=3D LFA_SUCCESS) { + if (reg.a0 =3D=3D LFA_SUCCESS) { pr_info("Activation cancelled for image %s\n", attrs->image_name); } else { pr_err("Firmware activation could not be cancelled: %s\n", - lfa_error_strings[-res.a0]); + lfa_error_strings[-reg.a0]); return -EINVAL; } =20 @@ -395,21 +408,24 @@ static int create_fw_inventory(char *fw_uuid, int seq= _id, u32 image_flags) =20 static int create_fw_images_tree(void) { - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs reg =3D { 0 }; struct uuid_regs image_uuid; char image_id_str[40]; int ret, num_of_components; =20 num_of_components =3D get_nr_lfa_components(); + for (int i =3D 0; i < num_of_components; i++) { - arm_smccc_1_1_invoke(LFA_1_0_FN_GET_INVENTORY, i, &res); - if (res.a0 =3D=3D LFA_SUCCESS) { - image_uuid.uuid_lo =3D res.a1; - image_uuid.uuid_hi =3D res.a2; + reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; + reg.a1 =3D i; /* fw_seq_id under consideration */ + arm_smccc_1_2_invoke(®, ®); + if (reg.a0 =3D=3D LFA_SUCCESS) { + image_uuid.uuid_lo =3D reg.a1; + image_uuid.uuid_hi =3D reg.a2; =20 snprintf(image_id_str, sizeof(image_id_str), "%pUb", &image_uuid); - ret =3D create_fw_inventory(image_id_str, i, res.a3); + ret =3D create_fw_inventory(image_id_str, i, reg.a3); if (ret) return ret; } @@ -420,17 +436,29 @@ static int create_fw_images_tree(void) =20 static int __init lfa_init(void) { - struct arm_smccc_res res =3D { 0 }; + struct arm_smccc_1_2_regs reg =3D { 0 }; int err; =20 - arm_smccc_1_1_invoke(LFA_1_0_FN_GET_VERSION, &res); - if (res.a0 =3D=3D -LFA_NOT_SUPPORTED) { + /* LFA requires SMCCC version >=3D 1.2 */ + if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2) { + pr_err("Not supported with SMCCC version %u", arm_smccc_get_version()); + return -ENODEV; + } + + if (arm_smccc_1_1_get_conduit() =3D=3D SMCCC_CONDUIT_NONE) { + pr_err("Invalid SMCCC conduit"); + return -ENODEV; + } + + reg.a0 =3D LFA_1_0_FN_GET_VERSION; + arm_smccc_1_2_invoke(®, ®); + if (reg.a0 =3D=3D -LFA_NOT_SUPPORTED) { pr_err("Arm Live Firmware activation(LFA): no firmware agent found\n"); return -ENODEV; } =20 pr_info("Arm Live Firmware Activation (LFA): detected v%ld.%ld\n", - res.a0 >> 16, res.a0 & 0xffff); + reg.a0 >> 16, reg.a0 & 0xffff); =20 lfa_dir =3D kobject_create_and_add("lfa", firmware_kobj); if (!lfa_dir) --=20 2.43.0 From nobody Fri Dec 19 08:57:21 2025 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012047.outbound.protection.outlook.com [40.107.200.47]) (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 ADE8D2F39AD for ; Mon, 8 Dec 2025 22:14:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.47 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232070; cv=fail; b=ppE/YCuvtyASTZhmxATDd8nl4lv5r5yg98+vFtMZ5OZiBb6JC9LkUUq/cMclLRouG5ONcBQePYuTsMDQQUHrAeIkYnsc40VVCWbZG2tsEajKQtrW2Xs0Cq8HWgTfLoF3HrQpt3vA6qS8Ot3gyfOZuFBPYOzEgUQqiK6e+83amTI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232070; c=relaxed/simple; bh=nu1qwZLl+bw/0kkC8fMwcBMrxWgavaRa4g60Y7S1ZlA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=X5hhKQGuD3GGTvky7Iuy+KSAoWcSSW6yI6usFHJP7pt5VlY+xKNzUqI3ZxFIumz9rysswA8/mOVkk9jtMmMn0WCx3hhFKSJJ6p89nczDEgm29N0BojiXIbIMMhD+F+xJjvq+cprGO//Kkn6kZ51VXn2D/bOPdAIJYSXmufUwR/Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=NTKSQM7H; arc=fail smtp.client-ip=40.107.200.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="NTKSQM7H" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OpiCdk/u0E5TnEmrE+tePmtm39MRNwhWnjXNFJfbqXyhXxYOtowpIrOYPk1but3Ps/9I6OdgChVSkv2mA9lVGDN0oLu0ErSrLfH8eGqgki69+3zWb4rdpTVDuATnSlFUHDUXVN3zyS0uZN1OQ/yOIXyh8J93qBxqMmgFlbcjgv4X9CPzadJHn3SyU8F2z5CzSOEl7k/yrQUDKQS6CJMsn7QcBNdVClIA1o3phl8cZ7ggIrSKBht1W/QpKDboRIT4ffphMjrVr1jLFM2pbdxtr/KsSISMwxCMOrSXfxwqUthy9eBy+Wb1VsTRMtL86qaKDXEQESqpqN1ju6u3K/HUcw== 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=It+M1e+ZKZqRz3i0LYB9UkqDMz0DAatokyU2zdXSiJM=; b=ws4zXTcEMuPeb452DOmD1mcb3q1hqckbwBdnNqpEjskMxj4lhdJTNGTRXmxQz6aIIAY2qtmAAShseNOGhLYmbz73Q/WaEwRxs2qfGGxc483eD7f9iWfYZhtCXD9aRRUnln6Ey9oEDrmuf04p/Xqa5UT9ThsWsmIxgAubF0fLBPXFBWdido+4h7OPfFMsUs9pJoTx/VDpSbDya2oalHBomTyTb6voDrOZfJHneOgaiUPVIZeMmSTvYYMtvFzWAPuSHViUeUlmp4Hh+9XnURW8+DoBEUa4jHxe4C5KrKvOBgxREwHGwP7Avc+A643YmMlifK9Ar50rpxxrvxzpc8r+DA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=arm.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=It+M1e+ZKZqRz3i0LYB9UkqDMz0DAatokyU2zdXSiJM=; b=NTKSQM7HrObMhYNUYrVF46C1imVHnckQIiB1t89UYZYEaKihNPymHxfhPz6eI8KVpU+HYbFnwnDKmj/naDSUWNaL9GYdXbnbsFyFYIjeOS1MVRA53gmL44hRX3oVQsftBYFVLpSayVaoHLkaTB/xgr0j+vdsBZlaQijVS1Y61NOyWbTogtHIxIQ/265kmlQY/d6byxMF7mXK8LlTMNtdfmglvBLrWVWcvBL2/znldjikcQHo7mSYaP7jrG8rf5SRCGn8pq53RqhkDQOHVbElU0gZBoixcaBHFczQCJqgNAfTM9TDYfCfhQcl37KrhX1lbKlGzyV/I1ZbOfroQQcmwA== Received: from CH0PR03CA0320.namprd03.prod.outlook.com (2603:10b6:610:118::25) by DS4PR12MB9746.namprd12.prod.outlook.com (2603:10b6:8:2a4::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.14; Mon, 8 Dec 2025 22:14:24 +0000 Received: from CH2PEPF00000142.namprd02.prod.outlook.com (2603:10b6:610:118:cafe::6f) by CH0PR03CA0320.outlook.office365.com (2603:10b6:610:118::25) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.14 via Frontend Transport; Mon, 8 Dec 2025 22:14:23 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by CH2PEPF00000142.mail.protection.outlook.com (10.167.244.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 22:14:23 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:08 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:08 -0800 Received: from build-vvidwans-noble-20250617.internal (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Mon, 8 Dec 2025 14:14:08 -0800 From: Vedashree Vidwans To: , , , , CC: , , , , , , , , Vedashree Vidwans Subject: [RFC PATCH 2/5] firmware: smccc: LFA: refactor Date: Mon, 8 Dec 2025 22:13:12 +0000 Message-ID: <20251208221319.1524888-3-vvidwans@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208221319.1524888-1-vvidwans@nvidia.com> References: <20251208221319.1524888-1-vvidwans@nvidia.com> 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-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF00000142:EE_|DS4PR12MB9746:EE_ X-MS-Office365-Filtering-Correlation-Id: 0e7785c0-8256-4e77-0f16-08de36a724c5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|36860700013|82310400026|1800799024|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?HV0uDhuVSK0gPGbB4eQ53ZVTfAOmnKrfjvoFlOtgX+1XZdKHdtB6Rgjrx0OP?= =?us-ascii?Q?NsZaZoPmPC2VHKTfgl7NhX6ONrLMXWqaDIeRa+wyq9g/JAMonWmDC0oRWwNN?= =?us-ascii?Q?yClUYvRYpDSJ4wvl629wN1TgOxXhVSqa1/CdzCAVG7PRvFoiA962JcYmlu0k?= =?us-ascii?Q?+gwNIuKvJntuTzuwYjz8OBN2BnpTREUUj5vIvbsB6BA1S1KMxxXf8S0F4IFB?= =?us-ascii?Q?hE93z1FKtzbS6EKublCvUSFQFjLAdrBR8t2AFmbaotP8ZnP8pLbDl0p/F+XB?= =?us-ascii?Q?rVRUdF0GnV0xB3LuCkONGANGfKsqycK+hWB28RWfhqZlQAejdCcVg7SsmqZ4?= =?us-ascii?Q?a+1tbvUO8zNBj4SoHX/bMlNqYHDPVf0IVZosDVdqlDRUBkr3KewhEpZUcgNu?= =?us-ascii?Q?tcZpQTbqTArFzEoMyW3AB4w6/aiOf+glJLI/3sYh1YnoHVVTktDW+8sEiW0o?= =?us-ascii?Q?6g/WhwiQXRBzlZ+uLQZSljQVHIdANnL6MoW2zvOKaoKk9h5BaX4XqeINtWAx?= =?us-ascii?Q?GhE/46jSiBnp34tIBGXXPzd3asqmXPKfMGGBhejWuz/GWaApB0pZASIi8JJa?= =?us-ascii?Q?eEoBcYmsQIIwjnz6YVjlINiU8d6qKjN8IQ5RBz5zrqXyBs7fCej8JGH+x+4K?= =?us-ascii?Q?Am7eNOay3p5UZ8S07pQoFU62MjyuLNKa9OVyAsCsv3GC0dpWq8aRKeF65Qbx?= =?us-ascii?Q?KfbAV4YXr9I93ofw0lPI2XNUV02H9qHivPpzThHNr7SpOgbUyDaUv70wILy9?= =?us-ascii?Q?D4ojjV1B+qAmLUPqQHQ+I42TvAEZBcLgGrL5uhPU+NgfLzKiXmV0rWLGUufJ?= =?us-ascii?Q?D8KevWJmj0sgI20CAaB36f2KSuFb/jhTMhOPEmEfqYfi93MmsXXHPiXp/W5W?= =?us-ascii?Q?cd8t9jJOvnHzB2MYyuoHzGRY8p2ZO+WtvbbFUiBRXOrpreq2b0TITe0ZHLFZ?= =?us-ascii?Q?IeZkgWKCp4kX1F7r+Sc6chD8/WX0w1aG4av6VlunIexHRH7xvCU+ertDXACX?= =?us-ascii?Q?C/7C2xPSalCmG1LStC0xs3uK7506poqRwD3YcDLUpLEeEuFyl9EgZuNejk/h?= =?us-ascii?Q?xEti/0nPzkN2uziM2BpBnf/75e0QBPv6BtYka14EQhF5hgK48NL3uuyLlCzs?= =?us-ascii?Q?7t4pHJjgzz6+HGLFIuSzUEWWxXioqXcsEzorsNptojtwXGJnQufPYJOJiEcf?= =?us-ascii?Q?/j8aw4dRTPFqaUUOSmjsp/4q3ICUhb6mwYE7U57C287pF5ofHkD094yHXrk5?= =?us-ascii?Q?+Wda/U7aQ8l911BfCbh80k0ZKuRyUNlyPya/fOqDokEfbp9m8gD2qtSmWjyV?= =?us-ascii?Q?F+yhTqdHj7WmjJOV8KpMwO3J1FfyuFs998hzun0X+c7CpdM8oGu9StJzNiTa?= =?us-ascii?Q?iGz/nQdHZVFOWx1nC/93zBjLkwWCKz0UpGW/yExmGdBAoPiuBy6wkGTmv3GU?= =?us-ascii?Q?ywbysMuef6tVtlcIAzTPUQTwag9axKj17liKddMk0ELzkePJoEX465xXOGPI?= =?us-ascii?Q?JmCxo5kxKmsjE+QuS4LWpeCLp+gOGAd9KRZAWxdedusCn1ex+0AulNrKfrKd?= =?us-ascii?Q?TnXPSoGs58aAW6yGSsw=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.233;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge2.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(36860700013)(82310400026)(1800799024)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 22:14:23.6127 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0e7785c0-8256-4e77-0f16-08de36a724c5 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.233];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF00000142.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS4PR12MB9746 Content-Type: text/plain; charset="utf-8" - Refactor LFA CANCEL logic into independent lfa_cancel() function. - Use FW UUID as image_name for images not known by the driver. - Move may_reset_cpu check to activate_fw_image(). This keeps all the functionality within a function. Signed-off-by: Vedashree Vidwans --- drivers/firmware/smccc/lfa_fw.c | 64 ++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/drivers/firmware/smccc/lfa_fw.c b/drivers/firmware/smccc/lfa_f= w.c index bdde14b66606..df8b65324413 100644 --- a/drivers/firmware/smccc/lfa_fw.c +++ b/drivers/firmware/smccc/lfa_fw.c @@ -129,6 +129,31 @@ static int get_nr_lfa_components(void) return reg.a1; } =20 +static int lfa_cancel(struct image_props *attrs) +{ + struct arm_smccc_1_2_regs reg =3D { 0 }; + + reg.a0 =3D LFA_1_0_FN_CANCEL; + reg.a1 =3D attrs->fw_seq_id; + arm_smccc_1_2_invoke(®, ®); + + /* + * When firmware activation is called with "skip_cpu_rendezvous=3D1", + * LFA_CANCEL can fail with LFA_BUSY if the activation could not be + * cancelled. + */ + if (reg.a0 =3D=3D LFA_SUCCESS) { + pr_info("Activation cancelled for image %s\n", + attrs->image_name); + } else { + pr_err("Firmware activation could not be cancelled: %s\n", + lfa_error_strings[-reg.a0]); + return -EINVAL; + } + + return reg.a0; +} + static int call_lfa_activate(void *data) { struct image_props *attrs =3D data; @@ -160,6 +185,11 @@ static int activate_fw_image(struct image_props *attrs) struct arm_smccc_1_2_regs res =3D { 0 }; int ret; =20 + if (attrs->may_reset_cpu) { + pr_err("CPU reset not supported by kernel driver\n"); + return -EINVAL; + } + /* * LFA_PRIME/ACTIVATE will return 1 in res.a1 if the firmware * priming/activation is still in progress. In that case @@ -284,12 +314,6 @@ static ssize_t activate_store(struct kobject *kobj, st= ruct kobj_attribute *attr, image_attrs[LFA_ATTR_ACTIVATE]); int ret; =20 - if (attrs->may_reset_cpu) { - pr_err("Firmware component requires unsupported CPU reset\n"); - - return -EINVAL; - } - ret =3D activate_fw_image(attrs); if (ret) { pr_err("Firmware activation failed: %s\n", @@ -309,25 +333,11 @@ static ssize_t cancel_store(struct kobject *kobj, str= uct kobj_attribute *attr, { struct image_props *attrs =3D container_of(attr, struct image_props, image_attrs[LFA_ATTR_CANCEL]); - struct arm_smccc_1_2_regs reg =3D { 0 }; - - reg.a0 =3D LFA_1_0_FN_CANCEL; - reg.a1 =3D attrs->fw_seq_id; - arm_smccc_1_2_invoke(®, ®); + int ret; =20 - /* - * When firmware activation is called with "skip_cpu_rendezvous=3D1", - * LFA_CANCEL can fail with LFA_BUSY if the activation could not be - * cancelled. - */ - if (reg.a0 =3D=3D LFA_SUCCESS) { - pr_info("Activation cancelled for image %s\n", - attrs->image_name); - } else { - pr_err("Firmware activation could not be cancelled: %s\n", - lfa_error_strings[-reg.a0]); - return -EINVAL; - } + ret =3D lfa_cancel(attrs); + if (ret !=3D 0) + return ret; =20 return count; } @@ -367,6 +377,8 @@ static int create_fw_inventory(char *fw_uuid, int seq_i= d, u32 image_flags) for (int i =3D 0; i < ARRAY_SIZE(fw_images_uuids); i++) { if (!strcmp(fw_images_uuids[i].uuid, fw_uuid)) image_name =3D fw_images_uuids[i].name; + else + image_name =3D fw_uuid; } =20 attrs->image_dir =3D kobject_create_and_add(fw_uuid, lfa_dir); @@ -414,6 +426,10 @@ static int create_fw_images_tree(void) int ret, num_of_components; =20 num_of_components =3D get_nr_lfa_components(); + if (num_of_components <=3D 0) { + pr_err("Error getting number of LFA components"); + return -ENODEV; + } =20 for (int i =3D 0; i < num_of_components; i++) { reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; --=20 2.43.0 From nobody Fri Dec 19 08:57:21 2025 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013052.outbound.protection.outlook.com [40.107.201.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 B5B662EB87F for ; Mon, 8 Dec 2025 22:14:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.52 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232069; cv=fail; b=Bt61oyB2OzsRqk/Q668bYwF/0b5pMZKUxYu7j3vhEoS6TemtAFDp39Amt6gt78oamQ7a+5tPsrv+CVPNB+MS/ayakzbAKicTQ0db9cROOKGJYhq0nVLZ9k/r6WfHNTWNbs0UebcDr1Xkd58paFnALD5yetM+PVeXKZBboSyEHZs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232069; c=relaxed/simple; bh=GO8WC1j1hJDcuCKXDygd2pTVO0GxuIriqzLQ6cc5d1E=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hnYiK+2/HVbomud5PjWMnFPaHYFt/8tgPx4pOs1GwpyskgA4xHZTCOQ4EKBgoytfXsBn241m5dhDMaOf4/eq6i+wVUV29JEjjEfJExyiM5gX3+W/lYD36N9b0mpaTZzcvyD8ttKCHF5J9CSH9NumX+zC9y/VKFax1Ibibt0uiyY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=eNQUvwY+; arc=fail smtp.client-ip=40.107.201.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="eNQUvwY+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dP5k+iFgkvum9/dXtCUxDEMTpPfwxXckjv8kliBnDLJMJxhQxn3TlwiYAGoZP1VgeO3tGrLI0jgllDTiSLZKaj6v3+r9aABAloEH5Q4CQ2rYordDvd+zCIPfF1OEnq+dmCET4byHsFLHMVeT1nYrJ4FdfLFBnMIdUW9k9K0Wc0MFaXuGCb/eFbaPV993NB+wt8fuzxhIUB/I/tH9UPVIzR07zgQl/MHzjGb8cbPvWR5ejGGzMSw59pWR9dHdpIqMjpQSvV4lAGzy/I2wMZj/SsFiRHkpQPl4TQQpo1q4rKxCsM4F53uuU5lojHob9ZEXx/EacgIIVImKKRlHJ84a4Q== 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=j/gXv2TGUP1+OTf9LSdSxi93VgRiZLptH+WeThyxnoA=; b=Jh6IVfK66gmra/8Ue1eex8lXqSBHamFaeeNX4XJVDqiHB1/zdKyXHaptLGK3+y4Of/EVYOszr7oYvmu6EO1zTkXSLX+j2xfYEXVypKRDPGDy1a3e+6rMDPyhAAo/qVrxnglkH1j5X29UEG+tkCbfNc1s9Hq/KybqlYKdDyBH84LtpqMb962PpzxdxB7HPxMeCRbXJKdS+ZMtbjkNWF7N7ePOMb1PFV37vJ+kFc89hcthGuIfQROdWp3udMg6qqtFxmNZJCRZEF9MxL30kb738uwGP3lOPePDk7W/v5SwbPGRpxHwz1MyxwJ674MGEu7uyAlK1+Qc5qI6agPXsd7wDg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=arm.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j/gXv2TGUP1+OTf9LSdSxi93VgRiZLptH+WeThyxnoA=; b=eNQUvwY++lcrflOhPjxXtLBVBt1Jr9/GEWg4FAQS6TMKB1GVKy0XWd7OaB4M5yjSuWBjKt32JwfTvR1vQjtRVUgOxdF5XvrfCxngYlo4tpOrLwLPuDRmAUOYtzTDZHNo9DTXozry8aMDZKt8pUpYN3kQs9pdFEwHzCdNdY7xZmw2xWwUlhxrNTf6eG130tEhpyR3rUxbFmkvOABVDkiPkkwKg5Ppznu2UzdLVoRdEuLPp3KyvivdwjmmxS8WoYHnbhKk4MgszbdwiNgKwRanIZChc0AJ892bAz1COeZ0uS79WMKXMEX9l5zRBab9NKb9m9H8DtVB00RJv3G83xPCNA== Received: from BY5PR04CA0027.namprd04.prod.outlook.com (2603:10b6:a03:1d0::37) by CH1PR12MB9624.namprd12.prod.outlook.com (2603:10b6:610:2b3::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.14; Mon, 8 Dec 2025 22:14:21 +0000 Received: from CO1PEPF000044EF.namprd05.prod.outlook.com (2603:10b6:a03:1d0:cafe::46) by BY5PR04CA0027.outlook.office365.com (2603:10b6:a03:1d0::37) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.14 via Frontend Transport; Mon, 8 Dec 2025 22:14:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF000044EF.mail.protection.outlook.com (10.167.241.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 22:14:21 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:09 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:08 -0800 Received: from build-vvidwans-noble-20250617.internal (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Mon, 8 Dec 2025 14:14:08 -0800 From: Vedashree Vidwans To: , , , , CC: , , , , , , , , Vedashree Vidwans Subject: [RFC PATCH 3/5] firmware: smccc: add timeout, touch wdt Date: Mon, 8 Dec 2025 22:13:13 +0000 Message-ID: <20251208221319.1524888-4-vvidwans@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208221319.1524888-1-vvidwans@nvidia.com> References: <20251208221319.1524888-1-vvidwans@nvidia.com> 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-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000044EF:EE_|CH1PR12MB9624:EE_ X-MS-Office365-Filtering-Correlation-Id: 73ffd333-6450-4bf6-6e9f-08de36a72338 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?2AuNIwGQHmsCf2h5WdeYZKAkI1Ge6yqXvCXrcvb6Ho+aivNepdTma4wPs0Je?= =?us-ascii?Q?eFqzu31thHnqlpu6zLJP0aRKVnFaZnPysBoPuenqgvVTa5W4UssvircMkdpD?= =?us-ascii?Q?bmQFP9km/S6Zb131dfxhB+Htr1n/QJZvpfX+nQWTV4M4zXGixZsWr2Zlh/5S?= =?us-ascii?Q?F0LqYTVRGQuGIevv/zNPsIjKKYkUWvRhJvEPjvv2/VncxAoW30g7Q75jX1BR?= =?us-ascii?Q?PtKa6p4bQ/I06HqJKgiQushDHRat4/aCH5nquf4OZ66uoDY8H0uDQHwKQ+Cz?= =?us-ascii?Q?s3EK0XpEgiRtfEBzfrcjY7TSJQgQTOP/jOg+sxwXfvHyj1t9te4J53w+xE/w?= =?us-ascii?Q?xgf64z2Fxo1aPIegFsNQEHrdejXJGl/ocSXcfH4NyWiKNpspRqUwa5nLhbPb?= =?us-ascii?Q?OU4xzHXaj0PTtnZ0nYM0xfN/CpKB/2gfrew6bl0bPyYUiLb+Qn8wCUf5hJ5P?= =?us-ascii?Q?M/U0xPEhKDiJumrqSmtKlyUUFHQjl+h+FEo8VCIed5KKZ63ys0Ppc8sd9bg8?= =?us-ascii?Q?A/fMGiLj4e5UjZemAjQxNp/1RFf5bsbxfeJfmMT4JuU3SKGWTU9DrPYfg+4a?= =?us-ascii?Q?XDv14D+60T6uuuSPLzySE3m8JTpsNocuMuIheIWfyA3q/JiNFAnDmA0/vrWR?= =?us-ascii?Q?CesZr7Y2rq0egtif3KS/46HcMYTi853zqYp9SAYLLf2jTeh+pgIWntMiq5xw?= =?us-ascii?Q?XBGy0p/kby5GUa1OvZITskX3Itc9NRW1YaFkbaOJt8WmpNOU2crv1B3GvaqP?= =?us-ascii?Q?NfCd6C+EMfR3ZHEqcJHH9ngJMdy1j8s9WEkwSh7I3VspPWTgbSwjv721Xpcp?= =?us-ascii?Q?znAWFe9kf1uY/ZrjG/X2BlDY5zb9fTkkat+dHe4MhXdDXJq1hYox/8kkDD5/?= =?us-ascii?Q?pyKetAg+jSAPr5uvjnT0z/AvMpqkzXuAEahfEV9QillXsCEdHFK7trxtI8Ho?= =?us-ascii?Q?g7QVjS/2JpAjaDeUkE+cre93WyFQj7xh5E0dO34icsT4LxvhJoqh2YDuc2nK?= =?us-ascii?Q?hhNqmzm2AXTYt4gwNXuc9E3YYOxX9S7NMRG76fDpi+N+U7x6ObGENav1mAhr?= =?us-ascii?Q?XZJXhyWWca4dMM4z+lIZDCazpsA2mBBKg7e6uu1PefAdMMyD4ug9lqekMvRb?= =?us-ascii?Q?UKhjY7efL+BXx27/mxva1I2dO3kgGGOBVyMAofQ7nJ69ZCsntnBAb3t5QUrm?= =?us-ascii?Q?x2vScoxSRgythm1jNlxep41vCRRPA+q7Fv6AN3a3LgKPQKSTrOLxJX09GJ90?= =?us-ascii?Q?fS1AdyK2gb6uiKntd0teMkYySobkqX8W93Ka/VW/fUVtkfgez+34/m7KXufQ?= =?us-ascii?Q?XUwsk68VHKeO4DHtO3vAuqV2H/OPDkoT597f7M5fO4vrrZtctM/D19TEC60U?= =?us-ascii?Q?pkGkPWcLmOlTqD0pqKRg1vPlNWTBEAZwkUC2DMpRdUDrfkGYpgU2HM8WPM2K?= =?us-ascii?Q?BD14Eo6l4t/gKDvXy7lSJsnsB6g42fXBPEpEszjdGjDXemox/GXpUzCjdLLu?= =?us-ascii?Q?PxGrrNO/p5ruhLhSeIA0XOSzIRCc0lzcZ6GUt3szJkSDXjg+jHTha9F8K94l?= =?us-ascii?Q?oUX3y6CtjbjLL4eH/zg=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 22:14:21.0678 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 73ffd333-6450-4bf6-6e9f-08de36a72338 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000044EF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH1PR12MB9624 Content-Type: text/plain; charset="utf-8" Enhance PRIME/ACTIVATION functions to touch watchdog and implement timeout mechanism. This update ensures that any potential hangs are detected promptly and that the LFA process is allocated sufficient execution time before the watchdog timer expires. These changes improve overall system reliability by reducing the risk of undetected process stalls and unexpected watchdog resets. Signed-off-by: Vedashree Vidwans --- drivers/firmware/smccc/lfa_fw.c | 74 +++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/drivers/firmware/smccc/lfa_fw.c b/drivers/firmware/smccc/lfa_f= w.c index df8b65324413..0e420cefa260 100644 --- a/drivers/firmware/smccc/lfa_fw.c +++ b/drivers/firmware/smccc/lfa_fw.c @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include =20 #define LFA_ERROR_STRING(name) \ [name] =3D #name @@ -34,6 +37,18 @@ #define LFA_1_0_FN_ACTIVATE LFA_1_0_FN(5) #define LFA_1_0_FN_CANCEL LFA_1_0_FN(6) =20 +/* CALL_AGAIN flags (returned by SMC) */ +#define LFA_PRIME_CALL_AGAIN BIT(0) +#define LFA_ACTIVATE_CALL_AGAIN BIT(0) + +/* Prime loop limits, TODO: tune after testing */ +#define LFA_PRIME_BUDGET_US 30000000 /* 30s cap */ +#define LFA_PRIME_POLL_DELAY_US 10 /* 10us between polls */ + +/* Activation loop limits, TODO: tune after testing */ +#define LFA_ACTIVATE_BUDGET_US 20000000 /* 20s cap */ +#define LFA_ACTIVATE_POLL_DELAY_US 10 /* 10us between polls */ + /* LFA return values */ #define LFA_SUCCESS 0 #define LFA_NOT_SUPPORTED 1 @@ -159,6 +174,8 @@ static int call_lfa_activate(void *data) struct image_props *attrs =3D data; struct arm_smccc_1_2_regs args =3D { 0 }; struct arm_smccc_1_2_regs res =3D { 0 }; + ktime_t end =3D ktime_add_us(ktime_get(), LFA_ACTIVATE_BUDGET_US); + int ret; =20 args.a0 =3D LFA_1_0_FN_ACTIVATE; args.a1 =3D attrs->fw_seq_id; /* fw_seq_id under consideration */ @@ -172,9 +189,34 @@ static int call_lfa_activate(void *data) */ args.a2 =3D !(attrs->cpu_rendezvous_forced || attrs->cpu_rendezvous); =20 - do { + for (;;) { + /* Touch watchdog, ACTIVATE shouldn't take longer than watchdog_thresh */ + touch_nmi_watchdog(); arm_smccc_1_2_invoke(&args, &res); - } while (res.a0 =3D=3D 0 && res.a1 =3D=3D 1); + + if ((long)res.a0 < 0) { + pr_err("ACTIVATE for image %s failed: %s", + attrs->image_name, lfa_error_strings[-res.a0]); + return res.a0; + } + + /* SMC returned with success */ + if (!(res.a1 & LFA_ACTIVATE_CALL_AGAIN)) + break; /* ACTIVATE successful */ + + /* SMC returned with call_again flag set */ + if (ktime_before(ktime_get(), end)) { + udelay(LFA_ACTIVATE_POLL_DELAY_US); + continue; + } + + pr_err("ACTIVATE timed out for image %s", attrs->image_name); + ret =3D lfa_cancel(attrs); + if (ret =3D=3D 0) + return -ETIMEDOUT; + else + return ret; + } =20 return res.a0; } @@ -183,6 +225,7 @@ static int activate_fw_image(struct image_props *attrs) { struct arm_smccc_1_2_regs args =3D { 0 }; struct arm_smccc_1_2_regs res =3D { 0 }; + ktime_t end =3D ktime_add_us(ktime_get(), LFA_PRIME_BUDGET_US); int ret; =20 if (attrs->may_reset_cpu) { @@ -198,15 +241,32 @@ static int activate_fw_image(struct image_props *attr= s) */ args.a0 =3D LFA_1_0_FN_PRIME; args.a1 =3D attrs->fw_seq_id; /* fw_seq_id under consideration */ - do { + for (;;) { + /* Touch watchdog, PRIME shouldn't take longer than watchdog_thresh */ + touch_nmi_watchdog(); arm_smccc_1_2_invoke(&args, &res); - if (res.a0 !=3D LFA_SUCCESS) { - pr_err("LFA_PRIME failed: %s\n", - lfa_error_strings[-res.a0]); =20 + if ((long)res.a0 < 0) { + pr_err("LFA_PRIME for image %s failed: %s\n", + attrs->image_name, lfa_error_strings[-res.a0]); return res.a0; } - } while (res.a1 =3D=3D 1); + if (!(res.a1 & LFA_PRIME_CALL_AGAIN)) + break; /* PRIME successful */ + + /* SMC returned with call_again flag set */ + if (ktime_before(ktime_get(), end)) { + udelay(LFA_PRIME_POLL_DELAY_US); + continue; + } + + pr_err("PRIME timed out for image %s", attrs->image_name); + ret =3D lfa_cancel(attrs); + if (ret =3D=3D 0) + return -ETIMEDOUT; + else + return ret; + } =20 if (attrs->cpu_rendezvous_forced || attrs->cpu_rendezvous) ret =3D stop_machine(call_lfa_activate, attrs, cpu_online_mask); --=20 2.43.0 From nobody Fri Dec 19 08:57:21 2025 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010063.outbound.protection.outlook.com [52.101.46.63]) (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 65ABA2E92D4 for ; Mon, 8 Dec 2025 22:14:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232076; cv=fail; b=jXomd2T85mWl/bNqGUjnseWNl7qBDJObzlZ+XL65CNGll/OzcRDlXJi9/4f+L53WuJZFMMekD/k9Iq6AxnDA6ymtYa1J0+mEXrw/PzIcg73JuPUc8kgpm0peOjdom9DZlcg6zdRy27tryY+JhZYRwVTpZeqHzdFBl1dGlphuxd8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232076; c=relaxed/simple; bh=+QnguX84NhdNKYuknbJSg6PAO//3InkZT0dcgHDhz/c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Yo6YM72TOcfsOI8r4+3foKXDZRTbXrwLTfwvw24wYDVccXDql2BE0NSg7BZT54sPAkkOA2iVn6PFJ14h6jGr+J8I8UvH9X88XMvgPBcggnzgErRp2OB/LF6f/JG/FytA8utGJULOelPfMYyeqPmZ4586aKaEvr6/BEmYqp2Dz0U= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=PZFcZjUD; arc=fail smtp.client-ip=52.101.46.63 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="PZFcZjUD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ji0eyjlw8BEy5U3NgGtLAshRJ05MQbZtU48LdCyCg6Gu4MVPN7WR7wFfqUGDJ8jEOSQ4zDCAMZzzUGs3U8ixLc4gjbHyTsurn3pFhDHCF4wvcgWF1uIY7tW0xn52CHTZuSoQDnZFPPlF+TcEOU99fOgZZT2RjvN08lkWm5z20h3sOY9y0vs+UKNQPt49h6PApPQfuShxs8uzre6eB03vKV8UUClIaeQCbHvPbvA+V7vChLVjQtA8IcyjQkmvP3HcVV7/bIv7dgCZUhjz9i9hqsnNyagCWhZLkK14Vw8zUB75+T4luVVJX91eTORITgdgQ0MeAyIq2g0jx7LKW9RFDg== 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=Op+0HtvBVztvsKx5CL+YZvkKE7djWqrMUILpOrH1gFQ=; b=JcA0RutwHd/zgqWNIz/VLklUrERiLdGCOeH2GjbcBmlS3HxEMxakYweS6GyWBlJTLHHE+EYhBpaKrJ+k0uONuNMThdcWFH8uZhS2XSJjGqINUmWW3Zxm2W6AgAUb7ySoiseLHI2ciQNjUq0sZwPfbq90tNT/tQc2VF1Y5gic/1GEyQizPuu9/LyFpog+VIbvegpkEpwSbUuxWpqmu/G5S4isZrrDYFzewtjRLmMt+Dx0wLbUwylA8lxlK566MdIa/oX9AG/c83KL/M8EEe5bWyMCd6E+r0/ObqpyWS8xNdDBHiB4R98sCJdfK1gLSB2vZDRtS8xGDD53lltOdWTrAQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=arm.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Op+0HtvBVztvsKx5CL+YZvkKE7djWqrMUILpOrH1gFQ=; b=PZFcZjUDCnUFrGO/wqIyGikcDQj0/fhx2LarTv9LvKeHs2TtbeYnDJY+S/hJF739zVNgBkRIV79WTJO9sgKeDy2QsqIRkbSdf2++E0IIe3rQNTOhj3Pxkd6qfj6/MqSONrWk4shxIGtjeE3Km7eXfWBHkQ4pqj4HXuoz+vb2yuQjx8RBXnQmb+V3bxG707g7hjr04GKyELn8zUhTaM1iwryCkpmLl3A1sORSktruU06Fe8JQChJtrpYEHYPoA8ZJLBR5jrBJOgXzrxRz8OSczPek03d4m+959R3HNoDrdpYDPjQ8oiRwNzJtXse7/TogBznMGIF12jwZtYQ7EueUJA== Received: from SJ0PR13CA0104.namprd13.prod.outlook.com (2603:10b6:a03:2c5::19) by PH7PR12MB8594.namprd12.prod.outlook.com (2603:10b6:510:1b3::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.14; Mon, 8 Dec 2025 22:14:26 +0000 Received: from CO1PEPF000044F5.namprd05.prod.outlook.com (2603:10b6:a03:2c5:cafe::ec) by SJ0PR13CA0104.outlook.office365.com (2603:10b6:a03:2c5::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9412.5 via Frontend Transport; Mon, 8 Dec 2025 22:14:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF000044F5.mail.protection.outlook.com (10.167.241.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 22:14:26 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:09 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:08 -0800 Received: from build-vvidwans-noble-20250617.internal (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Mon, 8 Dec 2025 14:14:08 -0800 From: Vedashree Vidwans To: , , , , CC: , , , , , , , , Vedashree Vidwans Subject: [RFC PATCH 4/5] firmware: smccc: register as platform driver Date: Mon, 8 Dec 2025 22:13:14 +0000 Message-ID: <20251208221319.1524888-5-vvidwans@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208221319.1524888-1-vvidwans@nvidia.com> References: <20251208221319.1524888-1-vvidwans@nvidia.com> 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-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000044F5:EE_|PH7PR12MB8594:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b9b6534-cf71-4779-9709-08de36a72659 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|7416014|1800799024|13003099007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?UousEuVOSMLb/OTCUBZk/tBMYenbPghNTAuYmam9CJklmh1JX4c+DddnJOTL?= =?us-ascii?Q?hDptxswGW2E+6sMSVCicvh8mlppFjCVRuiEGSKIQXYrXa56zR82jXlQ+MYdZ?= =?us-ascii?Q?fYntPY40v7pHBakuxYnzplm4QCyWF3ajRQ4OtGsFxiCYOhgZ7VmevuTlBHwN?= =?us-ascii?Q?7mZEf0ifNxs+2Etz+hc/ddbOyrGDRn6/QEkMCwckZp6Qm9nYa9XDGxTUu4ow?= =?us-ascii?Q?9tnQW5YU7KwFXdZDZzPeF9UZgLCQuewkZLCmO65uUKAUiV6OyW69rqqCfIGL?= =?us-ascii?Q?U5bz6SWzuqjHfzesZ4VcCqo4IvenHTKkE3IY14GyaIvDhSZJEA2BWhDdGuiF?= =?us-ascii?Q?saKr+PzmCFoxIO72lBQcTXoR4IHQbfJ/nLMFNxRdPk9mS7BxAE5+VV0X+28T?= =?us-ascii?Q?W1V5uUCGsXfAG47F3rxq/DIqu3EqF5l3MF4lQdxsVfmrizpi16mkWUxD6fCS?= =?us-ascii?Q?jRl0xOj5MuC+RAMdq0wp9aLlDZz5zweS9nyQ8g9ZTJ0ojd1Z8WirXLjv/rMa?= =?us-ascii?Q?974eNRzmk1bPHfDWtbSFH5gYvJpt0/1tMW+5r3cis55tLnxCvtwVHm8sQe5N?= =?us-ascii?Q?oFTUmyunZQ+HEeKn/jtUsTmB1LVRDBxjo+TX4egwE7CYJJGgtkDJNHKPFjpk?= =?us-ascii?Q?rYx0GmD1aPzXpit2oyCvKeQGWKq80vHkFbU0+2rXGJCUN3Jr9+IcSFOvScug?= =?us-ascii?Q?j3s0ydMbVXJfQY3KhyqecyeocPVgPYWoZ0y+2M1ByBVZPfx0Hk36kUH5Ug4/?= =?us-ascii?Q?yEf0iA4rdnqnAjQYZVu0U3fpp8pZFbJ5jFXBc6KdwFXC8oqRRKP1sC4iQXCH?= =?us-ascii?Q?jJ9Itr+UX9bIm5dynLizpPaFswX7poIQvzXEM9TRojj+aQdsXd+FFnisyQw3?= =?us-ascii?Q?bDuQkxbJrjnTneiXlxAMuaU5vQOmsq+T3zJHYAGZ/oN7ylqovhKlN5+pqb7E?= =?us-ascii?Q?D3zinHfgJ4yAcPAr5NLifTS8cdAuu8Jb7fxisEgYzAakmUHpJT0tJSmuHr1R?= =?us-ascii?Q?+lJ+FruaGIXnsLkMy8A/5UovtHCLkon9JzGE7zWr4AhkWr0rZxcM5E8/tTCQ?= =?us-ascii?Q?Qg1WPJRgl2DlrVWhjs71gZ4ZTfo6mz6uv1Rk0+HUsHiAtkMuYosNofzLMEYI?= =?us-ascii?Q?FpqF+f+GSlP7uJRoXybxMvRCyxLdFmuMyHWO58xkIblasSm4LJQJkEoxrnOg?= =?us-ascii?Q?QSyevqveOyNb7cRVCYaTtKFim4z9GtxxjzFR2FlW2CU29PbVj/5n8MQTCpXS?= =?us-ascii?Q?9SW7tEAki+lhtOmSUq1Fv8fBu5PLTM4I3vriW7CvAsn3hRVf4CnMw4/le3yv?= =?us-ascii?Q?rOAyiYShgpoLWlvvAGAkHsf2EFFo5todbkb/ow/NQr9OdtOzrel+NQmogXNT?= =?us-ascii?Q?rbqBSQjZxRhw7GxK2KZCwjrOBHA+M0yK0VkWPLAa/lYjQvnSvd25On07r56F?= =?us-ascii?Q?js0VzZBkV5sAcLaecfWd1kfB6WaNHrZzY9S8pauUiMv9vyuezS6g/V0T6ANX?= =?us-ascii?Q?Lbvl1WgkhqxxgmLmcizI/BkbSPOsh2Ui4UFCEwnebQgQLPsylqGOZm+v8cqF?= =?us-ascii?Q?Ly+b5uYTPdL+0Jet4xY=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(7416014)(1800799024)(13003099007);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 22:14:26.3111 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9b9b6534-cf71-4779-9709-08de36a72659 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000044F5.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8594 Content-Type: text/plain; charset="utf-8" - Update driver to be in-built kernel module. This will ensure driver is installed in kernel and would not require any user intervention. - Register the LFA driver as a platform driver corresponding to 'armhf000' device. The driver will be invoked when the device is detected on a platform. - Add functionality to register LFA interrupt in the driver probe(). This LFA IRQ number will be retrived from the LFA device node. - On IRQ, driver will query FW component details and trigger activation of capable and pending FW component. The driver will loop to update FW component details after every successful FW component activation. - Mutex synchronization is implemented to avoid concurrent LFA updates through interrupt and sysfs interfaces. Device node snippet from LFA spec[1]: fwu0 { compatible =3D "arm,armhf000"; memory-region =3D <&fwu_payload>; interrupt-parent =3D <&ic>; interrupts =3D <0 100 1>; // SPI, Interrupt #100, Edge Rising }; [1] https://developer.arm.com/documentation/den0147/latest/ Signed-off-by: Vedashree Vidwans --- drivers/firmware/smccc/Kconfig | 3 +- drivers/firmware/smccc/lfa_fw.c | 124 +++++++++++++++++++++++++++++++- 2 files changed, 125 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/smccc/Kconfig b/drivers/firmware/smccc/Kconfig index 48b98c14f770..c21be43fbfed 100644 --- a/drivers/firmware/smccc/Kconfig +++ b/drivers/firmware/smccc/Kconfig @@ -25,8 +25,9 @@ config ARM_SMCCC_SOC_ID platforms providing some sysfs information about the SoC variant. =20 config ARM_LFA - tristate "Arm Live Firmware activation support" + bool "Arm Live Firmware activation support" depends on HAVE_ARM_SMCCC_DISCOVERY + default y help Include support for triggering Live Firmware Activation, which allows to upgrade certain firmware components without a reboot. diff --git a/drivers/firmware/smccc/lfa_fw.c b/drivers/firmware/smccc/lfa_f= w.c index 0e420cefa260..24916fc53420 100644 --- a/drivers/firmware/smccc/lfa_fw.c +++ b/drivers/firmware/smccc/lfa_fw.c @@ -19,7 +19,12 @@ #include #include #include +#include +#include +#include +#include =20 +#define DRIVER_NAME "ARM_LFA" #define LFA_ERROR_STRING(name) \ [name] =3D #name #undef pr_fmt @@ -129,6 +134,7 @@ static const struct fw_image_uuid { }; =20 static struct kobject *lfa_dir; +static DEFINE_MUTEX(lfa_lock); =20 static int get_nr_lfa_components(void) { @@ -374,17 +380,23 @@ static ssize_t activate_store(struct kobject *kobj, s= truct kobj_attribute *attr, image_attrs[LFA_ATTR_ACTIVATE]); int ret; =20 + if (!mutex_trylock(&lfa_lock)) { + pr_err("Mutex locked, try again"); + return -EAGAIN; + } + ret =3D activate_fw_image(attrs); if (ret) { pr_err("Firmware activation failed: %s\n", lfa_error_strings[-ret]); - + mutex_unlock(&lfa_lock); return -ECANCELED; } =20 pr_info("Firmware activation succeeded\n"); =20 /* TODO: refresh image flags here*/ + mutex_unlock(&lfa_lock); return count; } =20 @@ -510,6 +522,106 @@ static int create_fw_images_tree(void) return 0; } =20 +static irqreturn_t lfa_irq_thread(int irq, void *data) +{ + struct image_props *attrs =3D NULL; + int ret; + int num_of_components, curr_component; + + mutex_lock(&lfa_lock); + + /* + * As per LFA spec, after activation of a component, the caller + * is expected to re-enumerate the component states (using + * LFA_GET_INFO then LFA_GET_INVENTORY). + * Hence we need an unconditional loop. + */ + + do { + /* TODO: refresh image flags here */ + /* If refresh fails goto exit_unlock */ + + /* Initialize counters to track list traversal */ + num_of_components =3D get_nr_lfa_components(); + curr_component =3D 0; + + /* Execute PRIME and ACTIVATE for activable FW component */ + list_for_each_entry(attrs, &lfa_fw_images, image_node) { + curr_component++; + if ((!attrs->activation_capable) || (!attrs->activation_pending)) { + /* LFA not applicable for this FW component */ + continue; + } + + ret =3D activate_fw_image(attrs); + if (ret) { + pr_err("Firmware %s activation failed: %s\n", + attrs->image_name, lfa_error_strings[-ret]); + goto exit_unlock; + } + + pr_info("Firmware %s activation succeeded", attrs->image_name); + /* Refresh FW component details */ + break; + } + } while (curr_component < num_of_components); + + /* TODO: refresh image flags here */ + /* If refresh fails goto exit_unlock */ + +exit_unlock: + mutex_unlock(&lfa_lock); + return IRQ_HANDLED; +} + +static int __init lfa_probe(struct platform_device *pdev) +{ + int err; + unsigned int irq; + + err =3D platform_get_irq_byname_optional(pdev, "fw-store-updated-interrup= t"); + if (err < 0) + err =3D platform_get_irq(pdev, 0); + if (err < 0) { + pr_err("Interrupt not found, functionality will be unavailable."); + + /* Bail out without failing the driver. */ + return 0; + } + irq =3D err; + + err =3D request_threaded_irq(irq, NULL, lfa_irq_thread, IRQF_ONESHOT, DRI= VER_NAME, NULL); + if (err !=3D 0) { + pr_err("Interrupt setup failed, functionality will be unavailable."); + + /* Bail out without failing the driver. */ + return 0; + } + + return 0; +} + +static const struct of_device_id lfa_of_ids[] =3D { + { .compatible =3D "arm,armhf000", }, + { }, +}; +MODULE_DEVICE_TABLE(of, lfa_of_ids); + +static const struct acpi_device_id lfa_acpi_ids[] =3D { + {"ARMHF000"}, + {}, +}; +MODULE_DEVICE_TABLE(acpi, lfa_acpi_ids); + +static struct platform_driver lfa_driver =3D { + .probe =3D lfa_probe, + .driver =3D { + .name =3D DRIVER_NAME, + .of_match_table =3D lfa_of_ids, + .acpi_match_table =3D ACPI_PTR(lfa_acpi_ids), + }, +}; + static int __init lfa_init(void) { struct arm_smccc_1_2_regs reg =3D { 0 }; @@ -536,22 +648,32 @@ static int __init lfa_init(void) pr_info("Arm Live Firmware Activation (LFA): detected v%ld.%ld\n", reg.a0 >> 16, reg.a0 & 0xffff); =20 + err =3D platform_driver_register(&lfa_driver); + if (err < 0) + pr_err("Platform driver register failed"); + lfa_dir =3D kobject_create_and_add("lfa", firmware_kobj); if (!lfa_dir) return -ENOMEM; =20 + mutex_lock(&lfa_lock); err =3D create_fw_images_tree(); if (err !=3D 0) kobject_put(lfa_dir); =20 + mutex_unlock(&lfa_lock); return err; } module_init(lfa_init); =20 static void __exit lfa_exit(void) { + mutex_lock(&lfa_lock); clean_fw_images_tree(); + mutex_unlock(&lfa_lock); + kobject_put(lfa_dir); + platform_driver_unregister(&lfa_driver); } module_exit(lfa_exit); =20 --=20 2.43.0 From nobody Fri Dec 19 08:57:21 2025 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013013.outbound.protection.outlook.com [40.107.201.13]) (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 524E02EF64F for ; Mon, 8 Dec 2025 22:14:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232077; cv=fail; b=l9GH+yztdDn6+SRos/LCjqcTjbQq5hT6fne+dpA2/0WsZsqKXNiMidBYmH/tL6n3ti6Om1D/zFCuHIQW9ykeNmvS1xZgamQBoxTl+PeZiaCI48zf3d3yLdg4HGf7PUOskKSkop9hk4odaDCr5AbZL2vfzUgf7/UfoS25JatHyeI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765232077; c=relaxed/simple; bh=lF8Tarzpc5wZ7u3iFdQNhIy6oC2REyFA1ZLS/kkKXL8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cetC1XZHdwbDwcQu9CrLO8zJg7BBA+MxiCzwv10trHmQ6tLVXgq4wUOZ8NES/SobFiEyjS8agjtKmzp6Wsp2jTr+jfzWufMc8oF6v8tBbeMRXSg1E9OkEGzIlwViYlBqdtKLrXa63p38xlzIRQnNt5YDchFyDwPbBErPbx3EEBs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=CQuVWTB6; arc=fail smtp.client-ip=40.107.201.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="CQuVWTB6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xK3DtltTFlG239qcuTiHz3DDCvXhwXgFGPU12n+PUh2E3i/xqoKaOX3MFTPXAZG2kprkurjZB15VvWwUW1BbtdtRndYBZPVQ7Bhqk/FE/kqIcD6d2PzknskHodnAPeSY1d0EAarOIuTwnLHy7SL2s7Zw8Yshde2xmbXVoMiQ+HlzSKs5xC8rhm8+kpfLfTHPQSjxLqwApsJFhE2GfaD85U+teXkHIGpRAyr4zjuB2UZwOpl2OLnCUd14r+uUgHq3mARosbXB1vCXKbm9Zg6S1ZlzHOwIOyJg7hKWo+l4Bjy0nm1NThUOr0pxC/IIJ+85l+8mFXIwshCQyuHMpW4Dtg== 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=7SbzCpewv0BHDLxYJt2Uo6zghjFTApMjSAo+xPwjQ9g=; b=VyDdkxlU+o1vRxIiyd2Ef74ZQcZnFMFDr7zqjMhhDXutERiL/ItDVPEbfR3EOKQ7MXfWVGB1K3SXhpCxeY9iGCS2LFAKDN9KxEkNmJEzhiyDF+n+qnkQVeBUWZUxfsISOm9OMCikNvA3PTbcQo2RMsPPKuXSYSY7lm3Im5K5vfrSc3sB9sjx16T5hqofXAy9tIfdVHr6wjfiMks8V7RzIDkXIo59omMjPgWOxOSPixSzQ4gOHOnOtfBwp7fPuZW9cX6SjPhYe67i3zf3GOBGmM6J93a9gAlI9ZA1vvujP1F68vwPhI37Zd/fZqCU3Wm36KD/9gfDFh1jloUrmyxtWg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=arm.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7SbzCpewv0BHDLxYJt2Uo6zghjFTApMjSAo+xPwjQ9g=; b=CQuVWTB6kkTSt89jNj7L1GhA2HL4DYpNnfIXL8rACqDdqhxvsEazseNhajtqBd87mqt+QFLwbncOMeifxxqdDSqwsDnquMqvRMI8dk/C+YAwS/0sHdTcc0d3akg/WSPnQY5lgHdZqudhj0LesA2xyc9hGkiHdXvGKXU9SxOmRIysDxCf+XLvGPvkq3AtMvLOH+QygAESjdItM/qP/YjvkVL/prfY5ndPZ9mAQHRNjmaPH+c+GuNlkOy6P+ilfK/FeRz4s07swRNHzUtevfuX0Y8QfABofDsg+g7bJ4HD0yhu4RE0QKeVkc9E+tpbGeR5Au3zZ/La2c8APyL7sdfAqA== Received: from SJ0PR13CA0097.namprd13.prod.outlook.com (2603:10b6:a03:2c5::12) by MN2PR12MB4272.namprd12.prod.outlook.com (2603:10b6:208:1de::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.14; Mon, 8 Dec 2025 22:14:30 +0000 Received: from CO1PEPF000044F5.namprd05.prod.outlook.com (2603:10b6:a03:2c5:cafe::42) by SJ0PR13CA0097.outlook.office365.com (2603:10b6:a03:2c5::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9412.6 via Frontend Transport; Mon, 8 Dec 2025 22:14:28 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF000044F5.mail.protection.outlook.com (10.167.241.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 22:14:29 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:10 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Mon, 8 Dec 2025 14:14:09 -0800 Received: from build-vvidwans-noble-20250617.internal (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Mon, 8 Dec 2025 14:14:09 -0800 From: Vedashree Vidwans To: , , , , CC: , , , , , , , , Vedashree Vidwans Subject: [RFC PATCH 5/5] firmware: smccc: lfa: refresh fw details Date: Mon, 8 Dec 2025 22:13:15 +0000 Message-ID: <20251208221319.1524888-6-vvidwans@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251208221319.1524888-1-vvidwans@nvidia.com> References: <20251208221319.1524888-1-vvidwans@nvidia.com> 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-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000044F5:EE_|MN2PR12MB4272:EE_ X-MS-Office365-Filtering-Correlation-Id: f65a3589-7b4f-4ded-a2e4-08de36a72827 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|7416014|376014|1800799024|82310400026|13003099007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?vq5TmBgSjD5S6jrul593pry40fZljHTqXY8wWHCZ9sDUsT5PeKo9TS5br7Ys?= =?us-ascii?Q?t8rbEJHSl/r59kdlg/BXsIvQUrC9wiIl4ZldodnQfY7BUt/niQtvjmVl+TJJ?= =?us-ascii?Q?eosk874Gia1SHVRN4fNwfnmLZNj85/YzKzzrjyCS/NLvpR/iwgSuBdxIctxa?= =?us-ascii?Q?i257xLnMjDMfWhE2NNOtOOSUzB6YQiwk9TOiTOrGOpmKMB3fHgzDDMwC0ldf?= =?us-ascii?Q?DZKacFhm2VT6bBHikr+H2fiWTcFuugBiKwGjFp7ORhOIl0ACTKecdd7T9Bzd?= =?us-ascii?Q?NT80tscA6aN+FCdDQrZfCVc+SdiIcJTnjS4ugTZ9Jmx+pV1nvFaUEEHg3TRv?= =?us-ascii?Q?mjtw2zS5iTC9eCnHxfhQMovJRbnOY9xSNqNpEOjwSWF1GY1IxoXch7WaoRWu?= =?us-ascii?Q?7cy7fJru4kTTgChKSuBz9FpcLn5+KhU17hfSt8wXgCSl8NweIZgVu1RWrTar?= =?us-ascii?Q?gLlBSPzAve8E6FVFxDYYsChoAv5VFivXvzTIc1Sz8OnaI4LMiao7GLXmyZqR?= =?us-ascii?Q?nqAVJZzxsaFC15SbYprb7HDWlsuob49HBoAGiDq+HsJkVjvWL83jIbqXvq5a?= =?us-ascii?Q?m5VUr31K7gWdnFP9O3xpfKWIDZoJlLXIHkGABtdSVBUu/8sjCYsZ8moT3XK0?= =?us-ascii?Q?oZkT1ffk9exhIZBL6PQSH++dOjoTtHLkkrp7MYBVqurzqLvqdTXMfJCuQqjs?= =?us-ascii?Q?SBHaFNKYJb7FLuaJ8KhS1E3dYH5ppfCahtAAOHgv9uL2OTT+wINLHPnLBnhG?= =?us-ascii?Q?nUc+fQmxj/b7rS6/boqNRiPDOXXxKu4jbu6s652DizNnD9rYGvMhOf5BeLFe?= =?us-ascii?Q?OEGv5u8/lPWVJeVADZL3cxMG7mOtv6S0nyAwa5uhzjszT52Imk5KeaCzWXyK?= =?us-ascii?Q?mjmmGy/t/YvZyE73y5lvhvlEAAjTQsrz27r6JxyHOBR5u7aYJ6lRrj4+qhGW?= =?us-ascii?Q?i7571I3zWF6fm/dntN/kohW4/uCF6wArSiNlvF/S4k39fULi/Osozqp87buH?= =?us-ascii?Q?heFCLd8UhfQFJ7DwI1MlsvFOx2WM7Vh3kFx6VnHp+KRpRCwXAoTEPC1sJwrq?= =?us-ascii?Q?vTT4XBPSk3hty433Gt2tGUs/mctnBlZaNn0GErHDMHjxuxFXJ084rbDuExg6?= =?us-ascii?Q?D4WicGMLMORajEzz4d6ybLJMvADLokuasqYxeCQdowg4yCRPyNPdlk+UMOBX?= =?us-ascii?Q?6u6EeBEw0PPUlvlnVjsVze9m3dwGPki5sJSGQO6xqi0nckkTn/d9KERX3agX?= =?us-ascii?Q?YjYk7CZ485t3CP5SyzwC82m3VY32TA4x4PH0v/xTXNYIScS9JYVcCscy/Sqn?= =?us-ascii?Q?YTOtsTHs5iUEnXDzhbWSCvRnUuybKdn/UH16uL/uTFGL5B5CcjBgZ8mJnwLA?= =?us-ascii?Q?RZBFO5d7m9PvdtO7xUe6zBjlQiVx4Ml5GEuWpJK0E7/A7X1aMVd8QL1Tp8wj?= =?us-ascii?Q?WzdA0jvYlLUmL0zsDTTUa0LU530NRXS4hHEAdqdHas3qjbGF3nD1KlsNP+C2?= =?us-ascii?Q?d6i5Alcs7ciXtRh3UinxYp6mTTHbf6CY4WG7qLW4FUphbwJUCZ/Jz/EfVqhy?= =?us-ascii?Q?4LeZT0apCKoz5GuOkM4=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(36860700013)(7416014)(376014)(1800799024)(82310400026)(13003099007);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 22:14:29.3443 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f65a3589-7b4f-4ded-a2e4-08de36a72827 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000044F5.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4272 Content-Type: text/plain; charset="utf-8" FW image details are querried with a SMC call. Currently, these FW details are added as nodes in a linked list. This patch updates the FW node creation and update functions. Now the linked list is updated based on the current value of num_lfa_components. As per spec [1], FW inventory is updated after each activation. [1] https://developer.arm.com/documentation/den0147/latest/ Signed-off-by: Vedashree Vidwans --- drivers/firmware/smccc/lfa_fw.c | 148 +++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 48 deletions(-) diff --git a/drivers/firmware/smccc/lfa_fw.c b/drivers/firmware/smccc/lfa_f= w.c index 24916fc53420..334090708405 100644 --- a/drivers/firmware/smccc/lfa_fw.c +++ b/drivers/firmware/smccc/lfa_fw.c @@ -133,6 +133,7 @@ static const struct fw_image_uuid { }, }; =20 +static int update_fw_images_tree(void); static struct kobject *lfa_dir; static DEFINE_MUTEX(lfa_lock); =20 @@ -282,17 +283,6 @@ static int activate_fw_image(struct image_props *attrs) return ret; } =20 -static void set_image_flags(struct image_props *attrs, int seq_id, - u32 image_flags) -{ - attrs->fw_seq_id =3D seq_id; - attrs->activation_capable =3D !!(image_flags & BIT(0)); - attrs->activation_pending =3D !!(image_flags & BIT(1)); - attrs->may_reset_cpu =3D !!(image_flags & BIT(2)); - /* cpu_rendezvous_optional bit has inverse logic in the spec */ - attrs->cpu_rendezvous =3D !(image_flags & BIT(3)); -} - static ssize_t name_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -395,7 +385,9 @@ static ssize_t activate_store(struct kobject *kobj, str= uct kobj_attribute *attr, =20 pr_info("Firmware activation succeeded\n"); =20 - /* TODO: refresh image flags here*/ + ret =3D update_fw_images_tree(); + if (ret) + pr_err("Failed to update FW images tree"); mutex_unlock(&lfa_lock); return count; } @@ -425,20 +417,41 @@ static struct kobj_attribute image_attrs_group[LFA_AT= TR_NR_IMAGES] =3D { [LFA_ATTR_CANCEL] =3D __ATTR_WO(cancel) }; =20 +static void delete_fw_image_node(struct image_props *attrs) +{ + int i; + + for (i =3D 0; i < LFA_ATTR_NR_IMAGES; i++) + sysfs_remove_file(attrs->image_dir, &attrs->image_attrs[i].attr); + + kobject_put(attrs->image_dir); + attrs->image_dir =3D NULL; + list_del(&attrs->image_node); + kfree(attrs); +} + static void clean_fw_images_tree(void) { struct image_props *attrs, *tmp; =20 - list_for_each_entry_safe(attrs, tmp, &lfa_fw_images, image_node) { - kobject_put(attrs->image_dir); - list_del(&attrs->image_node); - kfree(attrs); - } + list_for_each_entry_safe(attrs, tmp, &lfa_fw_images, image_node) + delete_fw_image_node(attrs); +} + +static void update_fw_image_node(struct image_props *attrs, int seq_id, + char *fw_uuid, u32 image_flags) +{ + attrs->fw_seq_id =3D seq_id; + attrs->image_name =3D fw_uuid; + attrs->activation_capable =3D !!(image_flags & BIT(0)); + attrs->activation_pending =3D !!(image_flags & BIT(1)); + attrs->may_reset_cpu =3D !!(image_flags & BIT(2)); + /* cpu_rendezvous_optional bit has inverse logic in the spec */ + attrs->cpu_rendezvous =3D !(image_flags & BIT(3)); } =20 -static int create_fw_inventory(char *fw_uuid, int seq_id, u32 image_flags) +static int create_fw_image_node(int seq_id, char *fw_uuid, u32 image_flags) { - const char *image_name =3D "(unknown)"; struct image_props *attrs; int ret; =20 @@ -446,21 +459,12 @@ static int create_fw_inventory(char *fw_uuid, int seq= _id, u32 image_flags) if (!attrs) return -ENOMEM; =20 - for (int i =3D 0; i < ARRAY_SIZE(fw_images_uuids); i++) { - if (!strcmp(fw_images_uuids[i].uuid, fw_uuid)) - image_name =3D fw_images_uuids[i].name; - else - image_name =3D fw_uuid; - } - attrs->image_dir =3D kobject_create_and_add(fw_uuid, lfa_dir); if (!attrs->image_dir) return -ENOMEM; =20 - INIT_LIST_HEAD(&attrs->image_node); - attrs->image_name =3D image_name; - attrs->cpu_rendezvous_forced =3D 1; - set_image_flags(attrs, seq_id, image_flags); + /* Update FW attributes */ + update_fw_image_node(attrs, seq_id, fw_uuid, image_flags); =20 /* * The attributes for each sysfs file are constant (handler functions, @@ -485,17 +489,19 @@ static int create_fw_inventory(char *fw_uuid, int seq= _id, u32 image_flags) return ret; } } - list_add(&attrs->image_node, &lfa_fw_images); + list_add_tail(&attrs->image_node, &lfa_fw_images); =20 return ret; } =20 -static int create_fw_images_tree(void) +static int update_fw_images_tree(void) { struct arm_smccc_1_2_regs reg =3D { 0 }; struct uuid_regs image_uuid; + struct image_props *attrs, *tmp; char image_id_str[40]; int ret, num_of_components; + int node_idx =3D 0; =20 num_of_components =3D get_nr_lfa_components(); if (num_of_components <=3D 0) { @@ -503,22 +509,67 @@ static int create_fw_images_tree(void) return -ENODEV; } =20 - for (int i =3D 0; i < num_of_components; i++) { - reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; - reg.a1 =3D i; /* fw_seq_id under consideration */ - arm_smccc_1_2_invoke(®, ®); - if (reg.a0 =3D=3D LFA_SUCCESS) { + /* + * Pass 1: + * For nodes < num_of_components, update fw_image_node + * For nodes >=3D num_of_components, delete + */ + list_for_each_entry_safe(attrs, tmp, &lfa_fw_images, image_node) { + if (attrs->fw_seq_id < num_of_components) { + /* Update this FW image node */ + + /* Get FW details */ + reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; + reg.a1 =3D attrs->fw_seq_id; + arm_smccc_1_2_invoke(®, ®); + + if (reg.a0 !=3D LFA_SUCCESS) + return -EINVAL; + + /* Build image name with UUID */ image_uuid.uuid_lo =3D reg.a1; image_uuid.uuid_hi =3D reg.a2; + snprintf(image_id_str, sizeof(image_id_str), "%pUb", &image_uuid); =20 - snprintf(image_id_str, sizeof(image_id_str), "%pUb", - &image_uuid); - ret =3D create_fw_inventory(image_id_str, i, reg.a3); - if (ret) - return ret; + if (strcmp(attrs->image_name, image_id_str)) { + /* UUID doesn't match previous UUID for given FW, not expected */ + pr_err("FW seq id %u: Previous UUID %s doesn't match current %s", + attrs->fw_seq_id, attrs->image_name, image_id_str); + return -EINVAL; + } + + /* Update FW attributes */ + update_fw_image_node(attrs, attrs->fw_seq_id, image_id_str, reg.a3); + node_idx++; + } else { + /* This node is beyond valid FW components list */ + delete_fw_image_node(attrs); } } =20 + /* + * Pass 2: + * If current FW components number is more than previous list, add new= component nodes. + */ + for (node_idx; node_idx < num_of_components; node_idx++) { + /* Get FW details */ + reg.a0 =3D LFA_1_0_FN_GET_INVENTORY; + reg.a1 =3D node_idx; + arm_smccc_1_2_invoke(®, ®); + + if (reg.a0 !=3D LFA_SUCCESS) + return -EINVAL; + + /* Build image name with UUID */ + image_uuid.uuid_lo =3D reg.a1; + image_uuid.uuid_hi =3D reg.a2; + snprintf(image_id_str, sizeof(image_id_str), "%pUb", &image_uuid); + + ret =3D create_fw_image_node(node_idx, image_id_str, reg.a3); + if (ret) + return ret; + } + return 0; } =20 @@ -538,8 +589,9 @@ static irqreturn_t lfa_irq_thread(int irq, void *data) */ =20 do { - /* TODO: refresh image flags here */ - /* If refresh fails goto exit_unlock */ + ret =3D update_fw_images_tree(); + if (ret) + goto exit_unlock; =20 /* Initialize counters to track list traversal */ num_of_components =3D get_nr_lfa_components(); @@ -561,13 +613,13 @@ static irqreturn_t lfa_irq_thread(int irq, void *data) } =20 pr_info("Firmware %s activation succeeded", attrs->image_name); - /* Refresh FW component details */ break; } } while (curr_component < num_of_components); =20 - /* TODO: refresh image flags here */ - /* If refresh fails goto exit_unlock */ + ret =3D update_fw_images_tree(); + if (ret) + goto exit_unlock; =20 exit_unlock: mutex_unlock(&lfa_lock); @@ -657,7 +709,7 @@ static int __init lfa_init(void) return -ENOMEM; =20 mutex_lock(&lfa_lock); - err =3D create_fw_images_tree(); + err =3D update_fw_images_tree(); if (err !=3D 0) kobject_put(lfa_dir); =20 --=20 2.43.0