Received: by 2002:a05:7412:518d:b0:e2:908c:2ebd with SMTP id fn13csp402662rdb; Thu, 5 Oct 2023 09:06:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEusRaaA0Npe1D9VRr9d+73zehplEoNvkcqwRiXMorqDdTCiWox5LGlKQavUqf3oPtgRt8m X-Received: by 2002:a17:902:dacd:b0:1c7:54ee:c53c with SMTP id q13-20020a170902dacd00b001c754eec53cmr6292816plx.57.1696521981569; Thu, 05 Oct 2023 09:06:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696521981; cv=none; d=google.com; s=arc-20160816; b=BlX85yoRlT0btYVakRJqNJRdtwd4gwNrxxjc+xuD+xeNhyKXQ8f+lMB3GqDuK5T7Of FoYnUgSczSYJQx+B2KJ6Jci4M2EZ9jocPEICt0/r1YEwf3NVqiO1UytaxGn/yB6m/3Fg SHjV/rZjl4LkJvXarOQpRDmqu3BoOtKfPM0lC2XlHoRbgGL7l3ljkT2NjRWJzU0IlSIe mAYXq8q9EZIZFna/SdKUZ45ZkcPwIBtOK3K3Xtbzo0EJS4cbunZULUexbe48JoDdYq0i Gf4T1TMXjueHmlc3yzd/r1ZdV/1cjXKiDTbS9ETFUUNVViH32RHPvfQyE7PBWvndSvgG EQGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from; bh=1Tej/oSIM4q8imhxcbJ4qMQhc/238IuIJQNEoEZVMM0=; fh=iZJRvoZuVJp3Jcg3UWu0imuTLbH0nKChof8pDyzNHj4=; b=0lwKLmMgjzu0mCPFHVB9sejxAoaiVPazPXfv8rklrSuSJv///7aR/3qwtUSBvpkdrJ vCZduaOn0SRy4+MFbSvrFG30OkYr5sZ7bE9Q5IK4VrCwZNJii8j7AL7O9Ze5Isap2CKs UhQ+vGaOPhv9xvDRMWR6f1om+GzvObQi3WZwmvc8b+ERNTEsh2WphdS0ppDA4zN4SEkH CA+VS/uS60GtThKUD6AbmoWZjMV7i7PL6Ls8UD8iEYt2XVbSR6WzNx98/3447INWNLP4 IksGMju2LAVAjaNr6q5qt+Jb45Teyi/RZfMsivMTvU2uXbtjRsjZDWOwWkQsymHvLeun ZwMg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id c12-20020a170902d48c00b001c62161b18esi1825624plg.580.2023.10.05.09.06.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Oct 2023 09:06:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4765C82FABDD; Thu, 5 Oct 2023 09:05:33 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239885AbjJEQFO (ORCPT + 99 others); Thu, 5 Oct 2023 12:05:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34026 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234700AbjJEQDY (ORCPT ); Thu, 5 Oct 2023 12:03:24 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CC52618BBF for ; Thu, 5 Oct 2023 07:45:41 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 46ABB15BF; Thu, 5 Oct 2023 07:46:02 -0700 (PDT) Received: from e103737-lin.cambridge.arm.com (e103737-lin.cambridge.arm.com [10.1.197.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 44F8C3F641; Thu, 5 Oct 2023 07:45:22 -0700 (PDT) From: Sudeep Holla Date: Thu, 05 Oct 2023 15:45:05 +0100 Subject: [PATCH v4 12/17] firmware: arm_ffa: Add notification handling mechanism MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20231005-ffa_v1-1_notif-v4-12-cddd3237809c@arm.com> References: <20231005-ffa_v1-1_notif-v4-0-cddd3237809c@arm.com> In-Reply-To: <20231005-ffa_v1-1_notif-v4-0-cddd3237809c@arm.com> To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sudeep Holla , Marc Bonnici , Jens Wiklander , Coboy Chen , Lorenzo Pieralisi , Olivier Deprez X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4050; i=sudeep.holla@arm.com; h=from:subject:message-id; bh=GHIh6ClSLWjbfe+dbK9XBffuB6q16AXPdqCkeJlcuXE=; b=owEBbQKS/ZANAwAIAQBBurwxfuKYAcsmYgBlHsvypoEExryuzL9TlqjKcrV/X62vuDwcXQGTN A+YUdxhg4qJAjMEAAEIAB0WIQS6ceUSBvMeskPdk+EAQbq8MX7imAUCZR7L8gAKCRAAQbq8MX7i mDeFD/901XcmtIPEPA/bjc45RGEcElECvD2xcHIFEzydP8tYoOD68Z5I43vLBDzveQ95360VKDl wUCNdHj3d7NQ9xgrv1G/kSlyMdkt4H4DiNzIq/Z/0K6lxJD1RirhRlOUqdJQ6/MYzF5GCC29FEl XfcURhAXY2q1T6yrH8yz7N5fOfi+18MO11iKs/twtwb+6nCqznoCue4sBefC4ewqrAu/8fdh3aQ NFvgRgh2Ih1GiLUzjDO9nWDycMdMcra78eosR46uOydc3d0oOi6sus0JZUlBkU/w80cOOo1bsNk iEmkw6kMBugHB+npBBNVZgRRJKEfRIxoKjfP3LzRS8voe0KyhJdYutOF28Addnf818VFjtugfuG O+vNfJ1rSZPCXpBDFFXvMn7YK9dW6ZP5pLcgQTaHZI/njc9Sv88KQpCn99vd1GpPQB3h29lDf+j 7q3I2Ow5Dr+6I95FjWndkgBbhAPXcqttaqi7jNauOCEFsX3L8SQi+7tcthh0ZjhcsNa2pt1+PpM bIQqnPe07SMzI0aSRRwTlhvb1cVgJIINcHQy7XYLmOQw9R3sDJIOAgiDc9nkHa4GLQwSTrFNsw2 Ziq0cuX0y74ADM8wE537ofiX7S3BpGkJVAUne4Az9iUU+92cHHRC1UIOYUote06csWz8r5DFVz7 kCWTo3GBnqxNAFg== X-Developer-Key: i=sudeep.holla@arm.com; a=openpgp; fpr=7360A21742ADF5A11767C1C139CFD4755FE2D5B4 X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Thu, 05 Oct 2023 09:05:33 -0700 (PDT) With all the necessary plumbing in place, let us add handling the notifications as part of schedule receiver interrupt handler. In order to do so, we need to just register scheduling callback on behalf of the driver partition. Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/driver.c | 67 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 2a46052a280a..9dd5335001ee 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -103,6 +103,7 @@ struct ffa_drv_info { unsigned int cpuhp_state; struct ffa_pcpu_irq __percpu *irq_pcpu; struct workqueue_struct *notif_pcpu_wq; + struct work_struct notif_pcpu_work; struct work_struct irq_work; struct xarray partition_info; unsigned int partition_count; @@ -633,6 +634,10 @@ static int ffa_notification_bitmap_destroy(void) #define MAX_IDS_32 10 #define PER_VCPU_NOTIFICATION_FLAG BIT(0) +#define SECURE_PARTITION_BITMAP BIT(0) +#define NON_SECURE_VM_BITMAP BIT(1) +#define SPM_FRAMEWORK_BITMAP BIT(2) +#define NS_HYP_FRAMEWORK_BITMAP BIT(3) static int ffa_notification_bind_common(u16 dst_id, u64 bitmap, u32 flags, bool is_bind) @@ -1050,6 +1055,54 @@ static int ffa_notify_send(struct ffa_device *dev, int notify_id, BIT(notify_id)); } +static void handle_notif_callbacks(u64 bitmap, enum notify_type type) +{ + int notify_id; + struct notifier_cb_info *cb_info = NULL; + + for (notify_id = 0; notify_id <= FFA_MAX_NOTIFICATIONS && bitmap; + notify_id++, bitmap >>= 1) { + if (!(bitmap & 1)) + continue; + + mutex_lock(&drv_info->notify_lock); + cb_info = notifier_hash_node_get(notify_id, type); + mutex_unlock(&drv_info->notify_lock); + + if (cb_info && cb_info->cb) + cb_info->cb(notify_id, cb_info->cb_data); + } +} + +static void notif_pcpu_irq_work_fn(struct work_struct *work) +{ + int rc; + struct ffa_notify_bitmaps bitmaps; + + rc = ffa_notification_get(SECURE_PARTITION_BITMAP | + SPM_FRAMEWORK_BITMAP, &bitmaps); + if (rc) { + pr_err("Failed to retrieve notifications with %d!\n", rc); + return; + } + + handle_notif_callbacks(bitmaps.vm_map, NON_SECURE_VM); + handle_notif_callbacks(bitmaps.sp_map, SECURE_PARTITION); + handle_notif_callbacks(bitmaps.arch_map, FRAMEWORK); +} + +static void +ffa_self_notif_handle(u16 vcpu, bool is_per_vcpu, void *cb_data) +{ + struct ffa_drv_info *info = cb_data; + + if (!is_per_vcpu) + notif_pcpu_irq_work_fn(&info->notif_pcpu_work); + else + queue_work_on(vcpu, info->notif_pcpu_wq, + &info->notif_pcpu_work); +} + static const struct ffa_info_ops ffa_drv_info_ops = { .api_version_get = ffa_api_version_get, .partition_info_get = ffa_partition_info_get, @@ -1154,6 +1207,13 @@ static void ffa_setup_partitions(void) drv_info->partition_count = count; kfree(pbuf); + + /* Allocate for the host */ + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return; + xa_store(&drv_info->partition_info, drv_info->vm_id, info, GFP_KERNEL); + drv_info->partition_count++; } static void ffa_partitions_cleanup(void) @@ -1294,6 +1354,7 @@ static int ffa_init_pcpu_irq(unsigned int irq) } INIT_WORK(&drv_info->irq_work, ffa_sched_recv_irq_work_fn); + INIT_WORK(&drv_info->notif_pcpu_work, notif_pcpu_irq_work_fn); drv_info->notif_pcpu_wq = create_workqueue("ffa_pcpu_irq_notification"); if (!drv_info->notif_pcpu_wq) return -EINVAL; @@ -1352,7 +1413,11 @@ static int ffa_notifications_setup(void) hash_init(drv_info->notifier_hash); mutex_init(&drv_info->notify_lock); - return 0; + /* Register internal scheduling callback */ + ret = ffa_sched_recv_cb_update(drv_info->vm_id, ffa_self_notif_handle, + drv_info, true); + if (!ret) + return ret; cleanup: ffa_notifications_cleanup(); return ret; -- 2.42.0