Commit 6d3daa9b authored by Sudeep Holla's avatar Sudeep Holla
Browse files

firmware: arm_ffa: Unregister bus notifier on teardown for FF-A v1.0

For FF-A v1.0 the driver registers a bus notifier to backfill UUID
matching, but the notifier was never unregistered on cleanup paths.
Track the registration state and unregister it during teardown and early
partition-setup failure.

Fixes: 9dd15934 ("firmware: arm_ffa: Move the FF-A v1.0 NULL UUID workaround to bus notifier")
Link: https://patch.msgid.link/20260428-ffa_fixes-v2-5-8595ae450034@kernel.org


Signed-off-by: default avatarSudeep Holla <sudeep.holla@kernel.org>
parent 9985d535
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ struct ffa_drv_info {
	bool mem_ops_native;
	bool msg_direct_req2_supp;
	bool bitmap_created;
	bool bus_notifier_registered;
	bool notif_enabled;
	unsigned int sched_recv_irq;
	unsigned int notif_pend_irq;
@@ -1630,6 +1631,15 @@ static struct notifier_block ffa_bus_nb = {
	.notifier_call = ffa_bus_notifier,
};

static void ffa_bus_notifier_unregister(void)
{
	if (!drv_info->bus_notifier_registered)
		return;

	bus_unregister_notifier(&ffa_bus_type, &ffa_bus_nb);
	drv_info->bus_notifier_registered = false;
}

static int ffa_xa_add_partition_info(struct ffa_device *dev)
{
	struct ffa_dev_part_info *info;
@@ -1713,6 +1723,8 @@ static void ffa_partitions_cleanup(void)
	struct list_head *phead;
	unsigned long idx;

	ffa_bus_notifier_unregister();

	/* Clean up/free all registered devices */
	ffa_devices_unregister();

@@ -1740,11 +1752,14 @@ static int ffa_setup_partitions(void)
		ret = bus_register_notifier(&ffa_bus_type, &ffa_bus_nb);
		if (ret)
			pr_err("Failed to register FF-A bus notifiers\n");
		else
			drv_info->bus_notifier_registered = true;
	}

	count = ffa_partition_probe(&uuid_null, &pbuf);
	if (count <= 0) {
		pr_info("%s: No partitions found, error %d\n", __func__, count);
		ffa_bus_notifier_unregister();
		return -EINVAL;
	}