Commit 3c3d6767 authored by Viresh Kumar's avatar Viresh Kumar Committed by Sudeep Holla
Browse files

firmware: arm_ffa: Refactor addition of partition information into XArray



Move the common code handling addition of the FF-A partition information
into the XArray as a new routine. No functional change.

Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Message-Id: <20250217-ffa_updates-v3-6-bd1d9de615e7@arm.com>
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent 7bc0f589
Loading
Loading
Loading
Loading
+22 −25
Original line number Diff line number Diff line
@@ -1423,11 +1423,30 @@ static struct notifier_block ffa_bus_nb = {
	.notifier_call = ffa_bus_notifier,
};

static int ffa_xa_add_partition_info(int vm_id)
{
	struct ffa_dev_part_info *info;
	int ret;

	info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info)
		return -ENOMEM;

	rwlock_init(&info->rw_lock);
	ret = xa_insert(&drv_info->partition_info, vm_id, info, GFP_KERNEL);
	if (ret) {
		pr_err("%s: failed to save partition ID 0x%x - ret:%d. Abort.\n",
		       __func__, vm_id, ret);
		kfree(info);
	}

	return ret;
}

static int ffa_setup_partitions(void)
{
	int count, idx, ret;
	struct ffa_device *ffa_dev;
	struct ffa_dev_part_info *info;
	struct ffa_partition_info *pbuf, *tpbuf;

	if (drv_info->version == FFA_VERSION_1_0) {
@@ -1461,39 +1480,17 @@ static int ffa_setup_partitions(void)
		    !(tpbuf->properties & FFA_PARTITION_AARCH64_EXEC))
			ffa_mode_32bit_set(ffa_dev);

		info = kzalloc(sizeof(*info), GFP_KERNEL);
		if (!info) {
		if (ffa_xa_add_partition_info(ffa_dev->vm_id)) {
			ffa_device_unregister(ffa_dev);
			continue;
		}
		rwlock_init(&info->rw_lock);
		ret = xa_insert(&drv_info->partition_info, tpbuf->id,
				info, GFP_KERNEL);
		if (ret) {
			pr_err("%s: failed to save partition ID 0x%x - ret:%d\n",
			       __func__, tpbuf->id, ret);
			ffa_device_unregister(ffa_dev);
			kfree(info);
		}
	}

	kfree(pbuf);

	/* Allocate for the host */
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info) {
		/* Already registered devices are freed on bus_exit */
		ffa_partitions_cleanup();
		return -ENOMEM;
	}

	rwlock_init(&info->rw_lock);
	ret = xa_insert(&drv_info->partition_info, drv_info->vm_id,
			info, GFP_KERNEL);
	ret = ffa_xa_add_partition_info(drv_info->vm_id);
	if (ret) {
		pr_err("%s: failed to save Host partition ID 0x%x - ret:%d. Abort.\n",
		       __func__, drv_info->vm_id, ret);
		kfree(info);
		/* Already registered devices are freed on bus_exit */
		ffa_partitions_cleanup();
	}