From nobody Sun Feb 8 09:13:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7704EB64D7 for ; Wed, 21 Jun 2023 06:50:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230474AbjFUGuP (ORCPT ); Wed, 21 Jun 2023 02:50:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230306AbjFUGte (ORCPT ); Wed, 21 Jun 2023 02:49:34 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5874E2736 for ; Tue, 20 Jun 2023 23:47:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687330044; x=1718866044; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=S0zflA3tprr4dANxBLyGkK7sp29/Tso1ozZZZAy9qPM=; b=aRNFuzX6Oh5G9u8YH1BAoFQflcLi4xJxvT9OEaE0KsmLuA9oUReP+tXu OK6+Db3xfL4W1iuJCSGVsGq+mWJrCAG0h6etyi0uGnrhFmBHjXzAgas5v U7BLt6V4nT+20AknNPVgHLWT6o2ku0DAWKdkZhPvRQDkmPoVI7XO9VmQf 6GVvfq8YRm+B9z2yu2bVWMMcc1NQ9ZSyFTeKgFODhnKmtPhaVEEfd3F78 0JmITnBewE+Qxxw1Qeekv8NCZTPLkqWLKw4SrYKd3y8WGVba/by9SNf0t yY7rwIMhIqu4FNk3rDT8kGV9XCpRjAcJXnyXepDhdXdIOwBcby0mzJzfH A==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="389511910" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="389511910" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Jun 2023 23:47:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="779728082" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="779728082" Received: from unknown (HELO localhost.localdomain) ([10.226.216.90]) by fmsmga008.fm.intel.com with ESMTP; 20 Jun 2023 23:47:20 -0700 From: tien.sung.ang@intel.com To: Dinh Nguyen Cc: linux-kernel@vger.kernel.org, Ang Tien Sung Subject: [PATCH v2 1/2] firmware: stratix10-svc: Support up to N SVC clients Date: Wed, 21 Jun 2023 14:46:44 +0800 Message-Id: <20230621064645.1431883-2-tien.sung.ang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230621064645.1431883-1-tien.sung.ang@intel.com> References: <20230621064645.1431883-1-tien.sung.ang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Ang Tien Sung This fixes the SVC Time-out issue on Intel's firmware SVC mailbox service when more than 1 client driver sends SMC commands concurrently. A thread is created now per channel. Current stratix10-svc driver supports N channels. Thread synchronization with mutex is used to prevent more than one thread from calling SMC command. The time-out are adjusted to cater for multiple drivers. In the old implementation, the respective SVC client drivers like intel_fcs and stratix10-soc sends a SMC command and this triggers a single thread at the stratix10-svc driver. Upon receiving a callback, the caller driver sends stratix10-svc-done and it stops the thread without waiting for the other SMC commands to complete. Signed-off-by: Ang Tien Sung --- drivers/firmware/stratix10-svc.c | 181 ++++++++++++++++++++----------- 1 file changed, 119 insertions(+), 62 deletions(-) diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-= svc.c index 80f4e2d14e04..ca713f39107e 100644 --- a/drivers/firmware/stratix10-svc.c +++ b/drivers/firmware/stratix10-svc.c @@ -33,9 +33,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 3 -#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 200 +#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 2000 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC 30 =20 /* stratix10 service layer clients */ @@ -125,14 +125,11 @@ struct stratix10_svc_data { * @dev: device * @chans: array of service channels * @num_chans: number of channels in 'chans' array - * @num_active_client: number of active service client * @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 + * @sdm_lock: a mutex lock to allow only one pending sdm message per client * * This struct is used to create communication channels for service client= s, to * handle secure monitor or hypervisor call. @@ -141,14 +138,12 @@ struct stratix10_svc_controller { struct device *dev; struct stratix10_svc_chan *chans; int num_chans; - 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; + /* Enforces atomic command sending to SDM */ + struct mutex *sdm_lock; }; =20 /** @@ -156,6 +151,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 * * This struct is used by service client to communicate with service layer= , each @@ -165,6 +163,11 @@ struct stratix10_svc_chan { struct stratix10_svc_controller *ctrl; struct stratix10_svc_client *scl; char *name; + struct task_struct *task; + struct kfifo svc_fifo; + /* Access protection to the message data queue */ + spinlock_t svc_fifo_lock; + /* Access protection to the channel */ spinlock_t lock; }; =20 @@ -382,13 +385,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) @@ -410,12 +414,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; @@ -424,6 +428,16 @@ static int svc_normal_to_secure_thread(void *data) (unsigned int)pdata->paddr, pdata->command, (unsigned int)pdata->size); =20 + /* SDM can only process 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); + mutex_lock(ctrl->sdm_lock); + } + + sdm_lock_owned =3D true; + switch (pdata->command) { case COMMAND_RECONFIG_DATA_CLAIM: svc_thread_cmd_data_claim(ctrl, pdata, cbdata); @@ -538,8 +552,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); @@ -548,8 +562,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); @@ -564,6 +578,8 @@ 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); + mutex_unlock(ctrl->sdm_lock); + sdm_lock_owned =3D false; continue; } =20 @@ -637,7 +653,9 @@ static int svc_normal_to_secure_thread(void *data) =20 } } - + pr_debug("%s: %s: Exit thread\n", __func__, chan->name); + if (sdm_lock_owned) + mutex_unlock(ctrl->sdm_lock); kfree(cbdata); kfree(pdata); =20 @@ -699,7 +717,7 @@ static int svc_get_sh_memory(struct platform_device *pd= ev, =20 /* smc or hvc call happens on cpu 0 bound kthread */ sh_memory_task =3D kthread_create_on_node(svc_normal_to_secure_shm_thread, - (void *)sh_memory, + (void *)sh_memory, cpu_to_node(cpu), "svc_smc_hvc_shm_thread"); if (IS_ERR(sh_memory_task)) { @@ -897,7 +915,6 @@ struct stratix10_svc_chan *stratix10_svc_request_channe= l_byname( =20 spin_lock_irqsave(&chan->lock, flag); chan->scl =3D client; - chan->ctrl->num_active_client++; spin_unlock_irqrestore(&chan->lock, flag); =20 return chan; @@ -916,7 +933,6 @@ void stratix10_svc_free_channel(struct stratix10_svc_ch= an *chan) =20 spin_lock_irqsave(&chan->lock, flag); chan->scl =3D NULL; - chan->ctrl->num_active_client--; module_put(chan->ctrl->dev->driver->owner); spin_unlock_irqrestore(&chan->lock, flag); } @@ -947,24 +963,24 @@ int stratix10_svc_send(struct stratix10_svc_chan *cha= n, 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_create_on_node(svc_normal_to_secure_thread, - (void *)chan->ctrl, - cpu_to_node(cpu), - "svc_smc_hvc_thread"); - if (IS_ERR(chan->ctrl->task)) { + (void *)chan, + cpu_to_node(cpu), + "svc_smc_hvc_thread"); + if (IS_ERR(chan->task)) { dev_err(chan->ctrl->dev, "failed to create svc_smc_hvc_thread\n"); kfree(p_data); return -EINVAL; } - kthread_bind(chan->ctrl->task, cpu); - wake_up_process(chan->ctrl->task); + kthread_bind(chan->task, cpu); + wake_up_process(chan->task); } =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)) { @@ -999,12 +1015,16 @@ int stratix10_svc_send(struct stratix10_svc_chan *ch= an, 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 @@ -1025,12 +1045,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 @@ -1068,8 +1097,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; } @@ -1089,7 +1118,7 @@ void stratix10_svc_free_memory(struct stratix10_svc_c= han *chan, void *kaddr) list_for_each_entry(pmem, &svc_data_mem, node) if (pmem->vaddr =3D=3D kaddr) { gen_pool_free(chan->ctrl->genpool, - (unsigned long)kaddr, pmem->size); + (unsigned long)kaddr, pmem->size); pmem->vaddr =3D NULL; list_del(&pmem->node); return; @@ -1105,6 +1134,23 @@ static const struct of_device_id stratix10_svc_drv_m= atch[] =3D { {}, }; =20 +static DEFINE_MUTEX(mailbox_lock); + +static void stratix10_svc_free_channels(struct stratix10_svc_controller *c= trl) +{ + int i; + + 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; + } + + if (&ctrl->chans[i].svc_fifo) + kfifo_free(&ctrl->chans[i].svc_fifo); + } +} + static int stratix10_svc_drv_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -1152,35 +1198,50 @@ static int stratix10_svc_drv_probe(struct platform_= device *pdev) =20 controller->dev =3D dev; controller->num_chans =3D SVC_NUM_CHANNEL; - 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 + /* 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; - ret =3D kfifo_alloc(&controller->svc_fifo, fifo_size, GFP_KERNEL); - if (ret) { - dev_err(dev, "failed to allocate FIFO\n"); - goto err_destroy_pool; - } - spin_lock_init(&controller->svc_fifo_lock); =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 list_add_tail(&controller->node, &svc_ctrl); platform_set_drvdata(pdev, controller); @@ -1227,7 +1288,7 @@ static int stratix10_svc_drv_probe(struct platform_de= vice *pdev) err_unregister_dev: platform_device_unregister(svc->stratix10_svc_rsu); err_free_kfifo: - kfifo_free(&controller->svc_fifo); + stratix10_svc_free_channels(controller); err_destroy_pool: gen_pool_destroy(genpool); return ret; @@ -1241,11 +1302,7 @@ static int stratix10_svc_drv_remove(struct platform_= 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; - } + stratix10_svc_free_channels(ctrl); if (ctrl->genpool) gen_pool_destroy(ctrl->genpool); list_del(&ctrl->node); --=20 2.25.1 From nobody Sun Feb 8 09:13:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 297C1EB64D7 for ; Wed, 21 Jun 2023 06:50:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230116AbjFUGuL (ORCPT ); Wed, 21 Jun 2023 02:50:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231185AbjFUGtd (ORCPT ); Wed, 21 Jun 2023 02:49:33 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 587EF273A for ; Tue, 20 Jun 2023 23:47:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687330044; x=1718866044; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=FL4viQoh2/5cl+BmlljLrt/kkNS/dDDnPTDOgJdOpNY=; b=XTppZTDemd+B+3plsBRmvzPLxEDzdexsU41nh0+jVihLz/Scbp8a044U MXq4CRoEm1Aw9TcjtUOUF52c6UWiEbGBqHHizL8bLH+/pfZKb5GxgzNkb 8u3GxCb5amDcFCnYdLis1826FBRzgHMfyBdIXGCHJQ655Iy6nL9YfAuap ZXfnxjkaK5HP2fidVBhkDeFNggWhpUa1kR9ehOPik0p6GPCO/LKIPFW6q Nt1owTWFsv/7IdzCzbWgg/lfLyOO4f8oqcarxIQClT5cEpeZDRWG99g6l /BMear+xWUdiQfa7OnWJXzAhdXDzwoXCTFp4JTGHG6wmrdQoaFZEyXotD Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="389511916" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="389511916" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Jun 2023 23:47:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="779728091" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="779728091" Received: from unknown (HELO localhost.localdomain) ([10.226.216.90]) by fmsmga008.fm.intel.com with ESMTP; 20 Jun 2023 23:47:22 -0700 From: tien.sung.ang@intel.com To: Dinh Nguyen Cc: linux-kernel@vger.kernel.org, Ang Tien Sung Subject: [PATCH v2 2/2] firmware: stratix10-svc: fix bug in saving controller data Date: Wed, 21 Jun 2023 14:46:45 +0800 Message-Id: <20230621064645.1431883-3-tien.sung.ang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230621064645.1431883-1-tien.sung.ang@intel.com> References: <20230621064645.1431883-1-tien.sung.ang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Ang Tien Sung Fix the incorrect usage of platform_set_drvdata and dev_set_drvdata. They both are of the same data and overrides each other. This resulted in the rmmod of the svc driver to fail and throw a kernel panic for kthread_stop and fifo free. Fixes: b5dc75c915cd ("firmware: stratix10-svc: extend svc to support new RS= U features") Signed-off-by: Ang Tien Sung --- drivers/firmware/stratix10-svc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-= svc.c index ca713f39107e..60e08987c402 100644 --- a/drivers/firmware/stratix10-svc.c +++ b/drivers/firmware/stratix10-svc.c @@ -130,6 +130,7 @@ struct stratix10_svc_data { * @complete_status: state for completion * @invoke_fn: function to issue secure monitor call or hypervisor call * @sdm_lock: a mutex lock to allow only one pending sdm message per client + * @svc: manages the list of client svc drivers * * This struct is used to create communication channels for service client= s, to * handle secure monitor or hypervisor call. @@ -144,6 +145,7 @@ struct stratix10_svc_controller { svc_invoke_fn *invoke_fn; /* Enforces atomic command sending to SDM */ struct mutex *sdm_lock; + struct stratix10_svc *svc; }; =20 /** @@ -1252,6 +1254,7 @@ static int stratix10_svc_drv_probe(struct platform_de= vice *pdev) ret =3D -ENOMEM; goto err_free_kfifo; } + controller->svc =3D svc; =20 svc->stratix10_svc_rsu =3D platform_device_alloc(STRATIX10_RSU, 0); if (!svc->stratix10_svc_rsu) { @@ -1279,8 +1282,6 @@ static int stratix10_svc_drv_probe(struct platform_de= vice *pdev) goto err_unregister_dev; } =20 - dev_set_drvdata(dev, svc); - pr_info("Intel Service Layer Driver Initialized\n"); =20 return 0; @@ -1296,8 +1297,8 @@ static int stratix10_svc_drv_probe(struct platform_de= vice *pdev) =20 static int stratix10_svc_drv_remove(struct platform_device *pdev) { - struct stratix10_svc *svc =3D dev_get_drvdata(&pdev->dev); struct stratix10_svc_controller *ctrl =3D platform_get_drvdata(pdev); + struct stratix10_svc *svc =3D ctrl->svc; =20 platform_device_unregister(svc->intel_svc_fcs); platform_device_unregister(svc->stratix10_svc_rsu); --=20 2.25.1