From nobody Mon Feb 9 03:47:29 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012043.outbound.protection.outlook.com [52.101.43.43]) (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 779FA2C234C for ; Tue, 3 Feb 2026 02:58:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770087502; cv=fail; b=bbgUwjdsLvplJXuGojxUdzlyI5jzSAps4fwp4RTb/GMsN5MaD+FzB69Y+bwEEz1p+C9gG18mnDC+aP10oHcFnZ2rHsPCcKrfJ3QvYbxbfkTaDOPiLuvUdEdPiyVyb6D6ZR003KXmGu6OFc0W7XmFjvFcxSiIJwa0TS8IQLfGmfU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770087502; c=relaxed/simple; bh=oguDDfChU1sm7qvitlh6XgH/XwbLa+sM6fn+7QXc/Wc=; h=From:To:Subject:Date:Message-Id:Content-Type:MIME-Version; b=fSbVuoh/unWjunLwykI4xFPoMYr6PLfumf7foflA+426UUuVHFxukHIiv5xOS8SgcqrtNEz6Q5We7fe/W8c9Z9JYls70EKJAUwaVMnLR9XRQ2QZipPl0ndO/CqcgB0f9dvLFQDzFD3lqjPeuuAoRgoduRXwCoVl/6XAQyqXTsx4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=altera.com; spf=pass smtp.mailfrom=altera.com; dkim=pass (2048-bit key) header.d=altera.com header.i=@altera.com header.b=Xcs6Swg2; arc=fail smtp.client-ip=52.101.43.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=altera.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=altera.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=altera.com header.i=@altera.com header.b="Xcs6Swg2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jW1MMkAPQngaNrCrgLrdJ8eZfU/fXNRx2j3mtj2a0Y+KzXWVak1CJn7mci9N3GiTV32xyeoTtS8ff+vkvoUyfCnJR3NlA21uminB8ns+lickHBLwskHBOcYwAFKY/9lSFLFzjjp1aAhuwvodNNsrf0eZgGm7CU/gWULR7VzrFF02juBQzmJnLe2PZv4awmL09WwGknqTOhKh96WW7NXQ3e70RxnOFjxtYArk6vyorpeT8D+u8IqaRls7g/uRTpCzb8CE4ylE1wKRL13AXMHscc77T1yGMhxm+mWHhxnJC2NU0VoDBtAOkwj3TlLeR5TJFPVSpW93PNrBoRH+11kl7w== 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=fZdCR1IAcUXO2+CzbbbEsV/bVYjy/rL0jVEFTY9cu/4=; b=hBmx8riw42vPXyBIm44dLiZSRqMJpzB1zd8Qi7hPtXwaaVRf5Yuf8I44H/9UpBt+H9JKEYBk0rGQvGU+kgyUlsQQjvyETEcGzeFBg26M3aLm3/JLCbmPzVY+qnYUz5mmjcdgUzeWvy6RrieEs4U3ewmM6AFGfS5zFqaX/5HqDrRvU2/st93RkvEGVYUbpqha6KenRdUWoppA2wWcxfM2VK+X5XBCz03T6Iz+jzeQwvvmTnIapskhWbHNT3ud5kNtAZSMh2ZzGYMV7SMZZ47D97vNXH3O1KRmBYbEhinj9tYztCMKYFgegv4xrkH5sK5BCL3fsr0odjJLHmApWRyjEQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=altera.com; dmarc=pass action=none header.from=altera.com; dkim=pass header.d=altera.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=altera.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fZdCR1IAcUXO2+CzbbbEsV/bVYjy/rL0jVEFTY9cu/4=; b=Xcs6Swg2sHse3LDv8/RS+qCLHUrCmi5flm3pECXER+utpD2Kov8RpfXzV5kQNf6AEUCev2nD11syx3zitb47DIox0H2DJ4MCZu65Th5OJkgkXYOOJFWxZMBm8r24R5T0QGZotA3EWZxTPiMRe5tNbVTyws4eG65NS9BXbkqxZCDwItAD3oe/0ykn3v/evn4D2BAFqfCNjsoJmvsj1DXiynq3zbASDt3rMDuVSxxU2Fju14jSheC89fYkKfIHBoAht4WmmS420pX0YbpNXbywqEZv35W6WuvWDpg7y+FkJEoKsNpy5BOQVsgHBP8Ju6WOtDanNlCKs6RKg1izLGVtRg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=altera.com; Received: from BLAPR03MB5458.namprd03.prod.outlook.com (2603:10b6:208:29d::17) by MW4PR03MB6667.namprd03.prod.outlook.com (2603:10b6:303:122::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.16; Tue, 3 Feb 2026 02:58:17 +0000 Received: from BLAPR03MB5458.namprd03.prod.outlook.com ([fe80::7eda:fa34:15f9:e656]) by BLAPR03MB5458.namprd03.prod.outlook.com ([fe80::7eda:fa34:15f9:e656%5]) with mapi id 15.20.9564.016; Tue, 3 Feb 2026 02:58:17 +0000 From: Muhammad Amirul Asyraf Mohamad Jamian To: Dinh Nguyen , linux-kernel@vger.kernel.org, Ang Tien Sung Subject: [RESEND] firmware: stratix10-svc: Add Multi SVC clients support Date: Mon, 2 Feb 2026 18:58:15 -0800 Message-Id: <20260203025815.4526-1-muhammadamirulasyraf.mohamadjamian@altera.com> X-Mailer: git-send-email 2.26.2 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0290.namprd03.prod.outlook.com (2603:10b6:a03:39e::25) To BLAPR03MB5458.namprd03.prod.outlook.com (2603:10b6:208:29d::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BLAPR03MB5458:EE_|MW4PR03MB6667:EE_ X-MS-Office365-Filtering-Correlation-Id: 3db66961-b037-46b5-3c38-08de62d01498 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?q0Nq7/VjvAJ3WAYDqoMcBy+IWpNitqk5sjt7lu+nClFkUANuolXmNpoEXNwE?= =?us-ascii?Q?N9uIMrw32/k4BmdBEos1puElGN92CStdzsdgD+a/IgE1fQMftRpB8zbY2w7H?= =?us-ascii?Q?w0pxtfZpyK6OPCXiCPDKmB3kVjsR/ZxtCCOu1X71M0mPy6fDqArg+lRMnITI?= =?us-ascii?Q?7qLn6YjKcsYscMeYUKk1GbNVhKhmG9Vo/s2815MYQae9O12Mf4gAk/RxaT5u?= =?us-ascii?Q?NDOob/UK+5mc8kmHI1kLOXBpFWqm/sS+J6kGGBX71u8M6/sWcm1UI9/PUQsd?= =?us-ascii?Q?RFX+y58q/X0x3hD6XInSPoDPrGvi4EpYVO8j/zrg/b9usRdzY2BTJ2WEYW41?= =?us-ascii?Q?bax+vENKfXlm+TiQsni3vO4AMVkyeIxlIJlsdv7ewUHclFq7NhuN3MN76dkh?= =?us-ascii?Q?XjXda2WT3tJGyrMmWFTWrTFf9XXy4Px681Fgskg9g9qkyCa2Q01ZZU69LxSQ?= =?us-ascii?Q?AVOxebFKrX2I5krQaj3Gh30EBfFMsyOGcv859dWYQ0SKkBasuR3Vax0Fgv7F?= =?us-ascii?Q?TuIWmfvg+6vBZJ8mNeOaiecsbNys2N4JvjG33+UD7vFgwVl5zJYyBfaKzjwN?= =?us-ascii?Q?ux0pcYwFC9+yoDvQXZipyole+aJ3qWdTrvo+LkA45cjGOhQo0tGgztfY60nZ?= =?us-ascii?Q?dPKHCavuIB0rtLY8KHVG55EhRxCKdlWWO8NAUuFEjyGAM6CvJvDQqF6WpMNo?= =?us-ascii?Q?pj5AQG+MHQ9GnfM+ohnjStPWVF9kBbAu+3i+w8sjlnAkDhu1ysPXv1cd8OyF?= =?us-ascii?Q?b0l/mBBzlRk/UWPhtU6ZnlGN1u/F7IwpUl6clxP3qRv6xEXqCSSUIq6LrhUz?= =?us-ascii?Q?j5go6kYcsfqzH8kRlGMy8bl4Ci0LJYiQvzeNds+XCuYXG48tTWI1joHx9uMN?= =?us-ascii?Q?9NkriSJwi51U9xiAi6uzM0Wo0c8ea5Cx55UqRzMlXGmLTGOF6GlTAdw1DW6w?= =?us-ascii?Q?mmlxrmgyBxxQdUX5/0nkXu9F3t9gm7DvWbbiS/amBFKeBiIhbKxmLLWg9fme?= =?us-ascii?Q?e0cxx+b6dg5edqOAxq6MJnXatnWmZY2cM6PT4lpfqd2IAgUHirpEYOui3sOE?= =?us-ascii?Q?IUyhkqURkQwEqLJ8uH3g2fBHIVoxA9Mi+xgwD0FwPPLAGP9ihfAamNTwo4wD?= =?us-ascii?Q?IifKfRFuFRmSpzpkid/hXMAAjYEDs3dBuxZmXGZPgG5f/EnH8m5w2gE8cam9?= =?us-ascii?Q?hEEVLER0xWS8U1gEeOKlA4ULUGNJ9CFPYLJXGlXaki8q2o9YhEov7Gv+LvS2?= =?us-ascii?Q?hIZoAnHg+1xp8pa56sHFYO9P2ESfvo9cMxfr7fLnbIdJeKQqAj6HjBy8D3Ax?= =?us-ascii?Q?7BfQyX/m3hxJBfGke/0od4pGKkmPDewjqrSriKUm11RN2NtPmxWY9ufcLyfx?= =?us-ascii?Q?6/mkjgYpBwjzTH+zEZdb+/uIH1z2p+UwqmL007jgMhIL8reXfzUIFJYHjAbw?= =?us-ascii?Q?LCxhZAFMNUKiYZZXdQkRbM13g3fgSXBRTNO0wgDNfGggaDa7yRu7iY5mPJWQ?= =?us-ascii?Q?YU70DVoS2DG2fVLKqjyPQR2XFbPT7IYDMeFmJTsA0476p0jhIzHhVm/7N6C+?= =?us-ascii?Q?O27lz8Fy39/cMBD1YbI=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BLAPR03MB5458.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?W1XvknyIUYxUVdUB/9f8nIpk9pntPiy6DsSx2r0f2itqXmP/ta1YfiFLDC/t?= =?us-ascii?Q?MsjHzzX2GxstzBm8Rg4rSOkp5Z9eMWUR3EOKW/fxTqi0xRUAp79on9LyqB17?= =?us-ascii?Q?X0Fbbmcq8jPhub1FijrUTs+YVUaKkFDKtwYqm4uP6T4MetZOsNSkq+Pf5MaG?= =?us-ascii?Q?0IAmeEPp/a2H1YAniqtbLjQlDUcZntEcd1qQ3P92M13NZ60HgvoHvx1E8ikW?= =?us-ascii?Q?tfhHmA4aToHnoP4a2o18w1F4OfE5XvtrneQirjz6LiIyZO0E3rKKnTBfvvRi?= =?us-ascii?Q?l8K/2qL/NdkjqA5AOT4+rEUwUzFS3uH1gkw7Hul2W+HJCi6rPIoCiS0hwJ0o?= =?us-ascii?Q?YSHIpCZN5ZbaBcKbKfldWaZkZgHRaDTPPviH+aaNt+pPZhtAlwwFdbQZw9k+?= =?us-ascii?Q?uet6f+S/+0wwB09+T9+yRMO0zIt0g8BOtKqFLKG4RwYfi6iImf1jS8oXoR83?= =?us-ascii?Q?VbXyqGvQ0zTH7Daza9Qu6HLDSdUpiP1JDlSDwEqIpy8ChnngrBSjTqldnn21?= =?us-ascii?Q?MMXn8ScIHKmFndhL/BzTkmlrocfSDJG1o8r76H9colZ/yLh8fMtF9tItCOVE?= =?us-ascii?Q?Q5y0EqAt+XdjZnPat2d3+Xs9yzK/GpWUnr6Ch6moX0BIlWJx59ZWGN1jB2KO?= =?us-ascii?Q?yrW7JZtnIYwuOfOfOid163h67Hd0RvPA/5QdpU5MpReA70ZYjNGQrU1Le8jp?= =?us-ascii?Q?bmMpUILC/N//cLEdmE9sC/NoZehwHnLVVgzrn6WnSjGGrJFnxRAhOW8i/IkZ?= =?us-ascii?Q?vm7QIVsGao12Hct6mlS244Bif5s4uc7MgGJmUsgD8W42ai8WR6Qfg0z8zewl?= =?us-ascii?Q?bFpYweA4+EBCvvAbQLE7HNSECqguzAnfjFctQekzSV7C3dadfTn1VtyHlULs?= =?us-ascii?Q?h34m2U6m1oEB7JVXEtUF4UCjxEcZzWj9hDArXUSdHGfk0lNSXMZFJ7bl1cJx?= =?us-ascii?Q?JPZ5aZONzXL0wwx4uG3S/BfMlw9iVpWlNHwyJxPd13kf3EXq1rlnlompRaI7?= =?us-ascii?Q?JlKeZ7Fvz0XYzS7vyHSmSl9RiClkyAE0oKEMm4xRxFK2LVXp7d9fzGWc4845?= =?us-ascii?Q?1pKVsgnO6EH0n+lcdD+X8m17XlCOtlT5ycMdkUSC41mh42VYAhYt1RdhYGEI?= =?us-ascii?Q?DqZUGhWzACmeEWdDOG9U9DHl01S1xJVWtCz2ZJ/vUm42CP+2a5jWT1Ko4xRh?= =?us-ascii?Q?REwUZAdCj6V+Ru2Uwq7X+6TPwWM9jWSNqUT7crHxv3g1wu+B/l6efwCn1bzQ?= =?us-ascii?Q?bwCgsEbPCEeO0hNu+JB1mMm0ojX0HA3+voXDh9mo0JJPzs0wffiFMrWVkqC2?= =?us-ascii?Q?s1yNAJByghu7vZmnvvy9CpFQy+/qmin4Tw4XGVRBDwjUMN/xlYH0FiUQbXre?= =?us-ascii?Q?VGCpvNL9PG5N6UV8h4gmqDF+UIg8xFOPc/6+Aol08THsqfNxzcOT9PlK3MVp?= =?us-ascii?Q?cfFlsVHAOy6HAoPhNQe5Oc6k6Wtx30EYbgb6b/wg9xQsRQSgowcy8VlI2Vht?= =?us-ascii?Q?qy/fP8Ukal5OwBbdleMHxSw1lmsVfccOb4dUxs9L+1NOT3m2kV94nFUPJIIw?= =?us-ascii?Q?SW1FlfK4ZKyB/KjEn0ShIYrFaieEn5w1C4qhMBWi113ZnY7l6QmePEG+YoZ5?= =?us-ascii?Q?ocFejutrSyiw9JS4Q6MCiIBlMmusbXfaQbG3ocG8TjF54Z5uMXDzwTpqay8V?= =?us-ascii?Q?+CY752ooz0bZnY38UhY6MfSkh3vpJQmjbU0s4bjRCknuUp8J+9Op0kDTgMrR?= =?us-ascii?Q?bozYS5dHW1pG6/glEiDYWN2L3kKLncJ31B2fOXHDHgcSg/bxKG7sEZWi6m3V?= X-MS-Exchange-AntiSpam-MessageData-1: gYE15Y600HNDEw== X-OriginatorOrg: altera.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3db66961-b037-46b5-3c38-08de62d01498 X-MS-Exchange-CrossTenant-AuthSource: BLAPR03MB5458.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2026 02:58:17.3261 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: WttJkZDw76lnLUv4FGbAi9P8vyNQWLMaoAx323dbKWzz7Y/UqK/ewIASTED9eQCXlughTlhI+Uo0AYIFWTZcALCQre/iRGrRtRQoYLdUVpz7tXmluDnqgfZytoLOMSW8B4BLia+KhrUKX1e2vjL9Xg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR03MB6667 Content-Type: text/plain; charset="utf-8" In the current implementation, SVC client drivers such as socfpga-hwmon, intel_fcs, stratix10-soc, stratix10-rsu each send an SMC command that triggers a single thread in the stratix10-svc driver. Upon receiving a callback, the initiating client driver sends a stratix10-svc-done signal, terminating the thread without waiting for other pending SMC commands to complete. This leads to a timeout issue in the firmware SVC mailbox service when multiple client drivers send SMC commands concurrently. To resolve this issue, a dedicated thread is now created per channel. The stratix10-svc driver will supports up to the number of channels defined by SVC_NUM_CHANNEL. Thread synchronization is handled using a mutex to prevent simultaneous issuance of SMC commands by multiple threads. Additionally, a thread task is now validated before invoking kthread_stop when the user aborts, ensuring safe termination. Timeout values have also been adjusted to accommodate the increased load from concurrent client driver activity. Signed-off-by: Ang Tien Sung Signed-off-by: Fong, Yan Kei Signed-off-by: Khairul Anuar Romli Signed-off-by: Muhammad Amirul Asyraf Mohamad Jamian --- drivers/firmware/stratix10-svc.c | 200 +++++++++++------- .../firmware/intel/stratix10-svc-client.h | 8 +- 2 files changed, 128 insertions(+), 80 deletions(-) diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-= svc.c index 515b948ff320..6bc0f9315a4e 100644 --- a/drivers/firmware/stratix10-svc.c +++ b/drivers/firmware/stratix10-svc.c @@ -37,9 +37,9 @@ * service layer will return error to FPGA manager when timeout occurs, * timeout is set to 30 seconds (30 * 1000) at Intel Stratix10 SoC. */ -#define SVC_NUM_DATA_IN_FIFO 32 +#define SVC_NUM_DATA_IN_FIFO 8 #define SVC_NUM_CHANNEL 4 -#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 200 +#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 2000 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC 30 #define BYTE_TO_WORD_SIZE 4 =20 @@ -252,11 +252,10 @@ struct stratix10_async_ctrl { * @node: list management * @genpool: memory pool pointing to the memory region * @task: pointer to the thread task which handles SMC or HVC call - * @svc_fifo: a queue for storing service message data * @complete_status: state for completion - * @svc_fifo_lock: protect access to service message data queue * @invoke_fn: function to issue secure monitor call or hypervisor call * @svc: manages the list of client svc drivers + * @sdm_lock: only allows a single command single response to SDM * @actrl: async control structure * * This struct is used to create communication channels for service client= s, to @@ -269,12 +268,10 @@ struct stratix10_svc_controller { int num_active_client; struct list_head node; struct gen_pool *genpool; - struct task_struct *task; - struct kfifo svc_fifo; struct completion complete_status; - spinlock_t svc_fifo_lock; svc_invoke_fn *invoke_fn; struct stratix10_svc *svc; + struct mutex *sdm_lock; /* Protect SDM transaction until response */ struct stratix10_async_ctrl actrl; }; =20 @@ -283,6 +280,9 @@ struct stratix10_svc_controller { * @ctrl: pointer to service controller which is the provider of this chan= nel * @scl: pointer to service client which owns the channel * @name: service client name associated with the channel + * @task: pointer to the thread task which handles SMC or HVC call + * @svc_fifo: a queue for storing service message data + * @svc_fifo_lock: protect access to service message data queue * @lock: protect access to the channel * @async_chan: reference to asynchronous channel object for this channel * @@ -293,6 +293,10 @@ struct stratix10_svc_chan { struct stratix10_svc_controller *ctrl; struct stratix10_svc_client *scl; char *name; + struct task_struct *task; + /* Separate fifo for every channel */ + struct kfifo svc_fifo; + spinlock_t svc_fifo_lock; /* locking pending fifo */ spinlock_t lock; struct stratix10_async_chan *async_chan; }; @@ -527,13 +531,14 @@ static void svc_thread_recv_status_ok(struct stratix1= 0_svc_data *p_data, */ static int svc_normal_to_secure_thread(void *data) { - struct stratix10_svc_controller - *ctrl =3D (struct stratix10_svc_controller *)data; - struct stratix10_svc_data *pdata; - struct stratix10_svc_cb_data *cbdata; + struct stratix10_svc_chan *chan =3D (struct stratix10_svc_chan *)data; + struct stratix10_svc_controller *ctrl =3D chan->ctrl; + struct stratix10_svc_data *pdata =3D NULL; + struct stratix10_svc_cb_data *cbdata =3D NULL; struct arm_smccc_res res; unsigned long a0, a1, a2, a3, a4, a5, a6, a7; int ret_fifo =3D 0; + bool sdm_lock_owned =3D false; =20 pdata =3D kmalloc(sizeof(*pdata), GFP_KERNEL); if (!pdata) @@ -555,12 +560,12 @@ static int svc_normal_to_secure_thread(void *data) a6 =3D 0; a7 =3D 0; =20 - pr_debug("smc_hvc_shm_thread is running\n"); + pr_debug("%s: %s: Thread is running!\n", __func__, chan->name); =20 while (!kthread_should_stop()) { - ret_fifo =3D kfifo_out_spinlocked(&ctrl->svc_fifo, + ret_fifo =3D kfifo_out_spinlocked(&chan->svc_fifo, pdata, sizeof(*pdata), - &ctrl->svc_fifo_lock); + &chan->svc_fifo_lock); =20 if (!ret_fifo) continue; @@ -569,6 +574,16 @@ static int svc_normal_to_secure_thread(void *data) (unsigned int)pdata->paddr, pdata->command, (unsigned int)pdata->size); =20 + /* SDM can only processs one command at a time */ + if (!sdm_lock_owned) { + /* Must not do mutex re-lock */ + pr_debug("%s: %s: Thread is waiting for mutex!\n", + __func__, chan->name); + guard(mutex)(ctrl->sdm_lock); + } + + sdm_lock_owned =3D true; + switch (pdata->command) { case COMMAND_RECONFIG_DATA_CLAIM: svc_thread_cmd_data_claim(ctrl, pdata, cbdata); @@ -702,8 +717,8 @@ static int svc_normal_to_secure_thread(void *data) pr_warn("it shouldn't happen\n"); break; } - pr_debug("%s: before SMC call -- a0=3D0x%016x a1=3D0x%016x", - __func__, + pr_debug("%s: %s: before SMC call -- a0=3D0x%016x a1=3D0x%016x", + __func__, chan->name, (unsigned int)a0, (unsigned int)a1); pr_debug(" a2=3D0x%016x\n", (unsigned int)a2); @@ -712,8 +727,8 @@ static int svc_normal_to_secure_thread(void *data) pr_debug(" a5=3D0x%016x\n", (unsigned int)a5); ctrl->invoke_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res); =20 - pr_debug("%s: after SMC call -- res.a0=3D0x%016x", - __func__, (unsigned int)res.a0); + pr_debug("%s: %s: after SMC call -- res.a0=3D0x%016x", + __func__, chan->name, (unsigned int)res.a0); pr_debug(" res.a1=3D0x%016x, res.a2=3D0x%016x", (unsigned int)res.a1, (unsigned int)res.a2); pr_debug(" res.a3=3D0x%016x\n", (unsigned int)res.a3); @@ -728,6 +743,7 @@ static int svc_normal_to_secure_thread(void *data) cbdata->kaddr2 =3D NULL; cbdata->kaddr3 =3D NULL; pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata); + sdm_lock_owned =3D false; continue; } =20 @@ -1697,21 +1713,21 @@ int stratix10_svc_send(struct stratix10_svc_chan *c= han, void *msg) return -ENOMEM; =20 /* first client will create kernel thread */ - if (!chan->ctrl->task) { - chan->ctrl->task =3D + if (!chan->task) { + chan->task =3D kthread_run_on_cpu(svc_normal_to_secure_thread, - (void *)chan->ctrl, + (void *)chan, cpu, "svc_smc_hvc_thread"); - if (IS_ERR(chan->ctrl->task)) { - dev_err(chan->ctrl->dev, - "failed to create svc_smc_hvc_thread\n"); - kfree(p_data); - return -EINVAL; - } + if (IS_ERR(chan->task)) { + dev_err(chan->ctrl->dev, + "failed to create svc_smc_hvc_thread\n"); + kfree(p_data); + return -EINVAL; + } } =20 - pr_debug("%s: sent P-va=3D%p, P-com=3D%x, P-size=3D%u\n", __func__, - p_msg->payload, p_msg->command, + pr_debug("%s: %s: sent P-va=3D%p, P-com=3D%x, P-size=3D%u\n", __func__, + chan->name, p_msg->payload, p_msg->command, (unsigned int)p_msg->payload_length); =20 if (list_empty(&svc_data_mem)) { @@ -1747,12 +1763,16 @@ int stratix10_svc_send(struct stratix10_svc_chan *c= han, void *msg) p_data->arg[2] =3D p_msg->arg[2]; p_data->size =3D p_msg->payload_length; p_data->chan =3D chan; - pr_debug("%s: put to FIFO pa=3D0x%016x, cmd=3D%x, size=3D%u\n", __func__, - (unsigned int)p_data->paddr, p_data->command, - (unsigned int)p_data->size); - ret =3D kfifo_in_spinlocked(&chan->ctrl->svc_fifo, p_data, + pr_debug("%s: %s: put to FIFO pa=3D0x%016x, cmd=3D%x, size=3D%u\n", + __func__, + chan->name, + (unsigned int)p_data->paddr, + p_data->command, + (unsigned int)p_data->size); + + ret =3D kfifo_in_spinlocked(&chan->svc_fifo, p_data, sizeof(*p_data), - &chan->ctrl->svc_fifo_lock); + &chan->svc_fifo_lock); =20 kfree(p_data); =20 @@ -1773,12 +1793,21 @@ EXPORT_SYMBOL_GPL(stratix10_svc_send); */ void stratix10_svc_done(struct stratix10_svc_chan *chan) { - /* stop thread when thread is running AND only one active client */ - if (chan->ctrl->task && chan->ctrl->num_active_client <=3D 1) { - pr_debug("svc_smc_hvc_shm_thread is stopped\n"); - kthread_stop(chan->ctrl->task); - chan->ctrl->task =3D NULL; + /* stop thread when thread is running */ + if (chan->task) { + if (!IS_ERR(chan->task)) { + struct task_struct *task_to_stop =3D chan->task; + + chan->task =3D NULL; + pr_debug("%s: %s: svc_smc_hvc_shm_thread is stopping\n", + __func__, chan->name); + kthread_stop(task_to_stop); + } + + chan->task =3D NULL; } + pr_debug("%s: %s: svc_smc_hvc_shm_thread has stopped\n", + __func__, chan->name); } EXPORT_SYMBOL_GPL(stratix10_svc_done); =20 @@ -1817,8 +1846,8 @@ void *stratix10_svc_allocate_memory(struct stratix10_= svc_chan *chan, pmem->paddr =3D pa; pmem->size =3D s; list_add_tail(&pmem->node, &svc_data_mem); - pr_debug("%s: va=3D%p, pa=3D0x%016x\n", __func__, - pmem->vaddr, (unsigned int)pmem->paddr); + pr_debug("%s: %s: va=3D%p, pa=3D0x%016x\n", __func__, + chan->name, pmem->vaddr, (unsigned int)pmem->paddr); =20 return (void *)va; } @@ -1855,6 +1884,11 @@ static const struct of_device_id stratix10_svc_drv_m= atch[] =3D { {}, }; =20 +/** + * mailbox_lock protects access to the to SDM if thread is busy + */ +static DEFINE_MUTEX(mailbox_lock); + static int stratix10_svc_drv_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -1905,7 +1939,6 @@ static int stratix10_svc_drv_probe(struct platform_de= vice *pdev) controller->num_active_client =3D 0; controller->chans =3D chans; controller->genpool =3D genpool; - controller->task =3D NULL; controller->invoke_fn =3D invoke_fn; init_completion(&controller->complete_status); =20 @@ -1917,32 +1950,63 @@ static int stratix10_svc_drv_probe(struct platform_= device *pdev) } =20 fifo_size =3D sizeof(struct stratix10_svc_data) * SVC_NUM_DATA_IN_FIFO; - ret =3D kfifo_alloc(&controller->svc_fifo, fifo_size, GFP_KERNEL); + ret =3D kfifo_alloc(&chans->svc_fifo, fifo_size, GFP_KERNEL); if (ret) { dev_err(dev, "failed to allocate FIFO\n"); goto err_async_exit; } - spin_lock_init(&controller->svc_fifo_lock); + spin_lock_init(&chans->svc_fifo_lock); + /* + * This mutex is used to block threads from utilizing + * SDM to prevent out of order command tx + */ + controller->sdm_lock =3D &mailbox_lock; + + fifo_size =3D sizeof(struct stratix10_svc_data) * SVC_NUM_DATA_IN_FIFO; =20 chans[0].scl =3D NULL; chans[0].ctrl =3D controller; chans[0].name =3D SVC_CLIENT_FPGA; spin_lock_init(&chans[0].lock); + ret =3D kfifo_alloc(&chans[0].svc_fifo, fifo_size, GFP_KERNEL); + if (ret) { + dev_err(dev, "failed to allocate FIFO 0\n"); + return ret; + } + spin_lock_init(&chans[0].svc_fifo_lock); =20 chans[1].scl =3D NULL; chans[1].ctrl =3D controller; chans[1].name =3D SVC_CLIENT_RSU; spin_lock_init(&chans[1].lock); + ret =3D kfifo_alloc(&chans[1].svc_fifo, fifo_size, GFP_KERNEL); + if (ret) { + dev_err(dev, "failed to allocate FIFO 1\n"); + return ret; + } + spin_lock_init(&chans[1].svc_fifo_lock); =20 chans[2].scl =3D NULL; chans[2].ctrl =3D controller; chans[2].name =3D SVC_CLIENT_FCS; spin_lock_init(&chans[2].lock); + ret =3D kfifo_alloc(&chans[2].svc_fifo, fifo_size, GFP_KERNEL); + if (ret) { + dev_err(dev, "failed to allocate FIFO 2\n"); + return ret; + } + spin_lock_init(&chans[2].svc_fifo_lock); =20 chans[3].scl =3D NULL; chans[3].ctrl =3D controller; chans[3].name =3D SVC_CLIENT_HWMON; spin_lock_init(&chans[3].lock); + ret =3D kfifo_alloc(&chans[3].svc_fifo, fifo_size, GFP_KERNEL); + if (ret) { + dev_err(dev, "failed to allocate FIFO 3\n"); + return ret; + } + spin_lock_init(&chans[3].svc_fifo_lock); =20 list_add_tail(&controller->node, &svc_ctrl); platform_set_drvdata(pdev, controller); @@ -1950,60 +2014,41 @@ static int stratix10_svc_drv_probe(struct platform_= device *pdev) /* add svc client device(s) */ svc =3D devm_kzalloc(dev, sizeof(*svc), GFP_KERNEL); if (!svc) { - ret =3D -ENOMEM; - goto err_free_kfifo; + return -ENOMEM; } controller->svc =3D svc; =20 svc->stratix10_svc_rsu =3D platform_device_alloc(STRATIX10_RSU, 0); if (!svc->stratix10_svc_rsu) { dev_err(dev, "failed to allocate %s device\n", STRATIX10_RSU); - ret =3D -ENOMEM; - goto err_free_kfifo; + return -ENOMEM; } =20 ret =3D platform_device_add(svc->stratix10_svc_rsu); - if (ret) { - platform_device_put(svc->stratix10_svc_rsu); - goto err_free_kfifo; - } - - svc->intel_svc_fcs =3D platform_device_alloc(INTEL_FCS, 1); - if (!svc->intel_svc_fcs) { - dev_err(dev, "failed to allocate %s device\n", INTEL_FCS); - ret =3D -ENOMEM; - goto err_unregister_rsu_dev; - } - - ret =3D platform_device_add(svc->intel_svc_fcs); - if (ret) { - platform_device_put(svc->intel_svc_fcs); - goto err_unregister_rsu_dev; - } + if (ret) + goto err_put_device; =20 ret =3D of_platform_default_populate(dev_of_node(dev), NULL, dev); if (ret) - goto err_unregister_fcs_dev; + goto err_put_device; =20 pr_info("Intel Service Layer Driver Initialized\n"); =20 return 0; =20 -err_unregister_fcs_dev: - platform_device_unregister(svc->intel_svc_fcs); -err_unregister_rsu_dev: - platform_device_unregister(svc->stratix10_svc_rsu); -err_free_kfifo: - kfifo_free(&controller->svc_fifo); err_async_exit: stratix10_svc_async_exit(controller); +err_put_device: + platform_device_put(svc->stratix10_svc_rsu); err_destroy_pool: gen_pool_destroy(genpool); + return ret; } =20 static void stratix10_svc_drv_remove(struct platform_device *pdev) { + int i; struct stratix10_svc_controller *ctrl =3D platform_get_drvdata(pdev); struct stratix10_svc *svc =3D ctrl->svc; =20 @@ -2014,11 +2059,14 @@ static void stratix10_svc_drv_remove(struct platfor= m_device *pdev) platform_device_unregister(svc->intel_svc_fcs); platform_device_unregister(svc->stratix10_svc_rsu); =20 - kfifo_free(&ctrl->svc_fifo); - if (ctrl->task) { - kthread_stop(ctrl->task); - ctrl->task =3D NULL; + for (i =3D 0; i < SVC_NUM_CHANNEL; i++) { + if (ctrl->chans[i].task) { + kthread_stop(ctrl->chans[i].task); + ctrl->chans[i].task =3D NULL; + } + kfifo_free(&ctrl->chans[i].svc_fifo); } + if (ctrl->genpool) gen_pool_destroy(ctrl->genpool); list_del(&ctrl->node); diff --git a/include/linux/firmware/intel/stratix10-svc-client.h b/include/= linux/firmware/intel/stratix10-svc-client.h index d290060f4c73..91013161e9db 100644 --- a/include/linux/firmware/intel/stratix10-svc-client.h +++ b/include/linux/firmware/intel/stratix10-svc-client.h @@ -68,12 +68,12 @@ * timeout value used in Stratix10 FPGA manager driver. * timeout value used in RSU driver */ -#define SVC_RECONFIG_REQUEST_TIMEOUT_MS 300 -#define SVC_RECONFIG_BUFFER_TIMEOUT_MS 720 -#define SVC_RSU_REQUEST_TIMEOUT_MS 300 +#define SVC_RECONFIG_REQUEST_TIMEOUT_MS 5000 +#define SVC_RECONFIG_BUFFER_TIMEOUT_MS 5000 +#define SVC_RSU_REQUEST_TIMEOUT_MS 2000 #define SVC_FCS_REQUEST_TIMEOUT_MS 2000 #define SVC_COMPLETED_TIMEOUT_MS 30000 -#define SVC_HWMON_REQUEST_TIMEOUT_MS 300 +#define SVC_HWMON_REQUEST_TIMEOUT_MS 2000 =20 struct stratix10_svc_chan; =20 --=20 2.43.7