Unverified Commit 91f92d70 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

Merge tag 'ffa-updates-5.19' of...

Merge tag 'ffa-updates-5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux into arm/drivers

Arm FF-A firmware driver updates/fixes for v5.19

Couple of fixes to handle fragmented memory descriptors and incorrect
UUID parameter passed to ffa_partition_probe. Another fix deals with
the incorrect use of ffa_device's driver_data by the core driver.
Apart from these fixes, there is an addition of ffa_dev_get_drvdata helper
function and its use in optee driver.

* tag 'ffa-updates-5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux:
  tee: optee: Use ffa_dev_get_drvdata to fetch driver_data
  firmware: arm_ffa: Add ffa_dev_get_drvdata helper function
  firmware: arm_ffa: Remove incorrect assignment of driver_data
  firmware: arm_ffa: Fix uuid parameter to ffa_partition_probe
  firmware: arm_ffa: Fix handling of fragmented memory descriptors

Link: https://lore.kernel.org/r/20220504112853.3491961-1-sudeep.holla@arm.com


Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents a37de2ad f3f3bdbd
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -398,11 +398,15 @@ static int ffa_mem_first_frag(u32 func_id, phys_addr_t buf, u32 buf_sz,
	if (ret.a0 == FFA_ERROR)
		return ffa_to_linux_errno((int)ret.a2);

	if (ret.a0 != FFA_SUCCESS)
		return -EOPNOTSUPP;

	if (ret.a0 == FFA_SUCCESS) {
		if (handle)
			*handle = PACK_HANDLE(ret.a2, ret.a3);
	} else if (ret.a0 == FFA_MEM_FRAG_RX) {
		if (handle)
			*handle = PACK_HANDLE(ret.a1, ret.a2);
	} else {
		return -EOPNOTSUPP;
	}

	return frag_len;
}
@@ -426,10 +430,12 @@ static int ffa_mem_next_frag(u64 handle, u32 frag_len)
	if (ret.a0 == FFA_ERROR)
		return ffa_to_linux_errno((int)ret.a2);

	if (ret.a0 != FFA_MEM_FRAG_RX)
		return -EOPNOTSUPP;

	if (ret.a0 == FFA_MEM_FRAG_RX)
		return ret.a3;
	else if (ret.a0 == FFA_SUCCESS)
		return 0;

	return -EOPNOTSUPP;
}

static int
@@ -582,7 +588,7 @@ static int ffa_partition_info_get(const char *uuid_str,
		return -ENODEV;
	}

	count = ffa_partition_probe(&uuid_null, &pbuf);
	count = ffa_partition_probe(&uuid, &pbuf);
	if (count <= 0)
		return -ENOENT;

@@ -688,8 +694,6 @@ static void ffa_setup_partitions(void)
			       __func__, tpbuf->id);
			continue;
		}

		ffa_dev_set_drvdata(ffa_dev, drv_info);
	}
	kfree(pbuf);
}
+1 −1
Original line number Diff line number Diff line
@@ -759,7 +759,7 @@ static const struct optee_ops optee_ffa_ops = {

static void optee_ffa_remove(struct ffa_device *ffa_dev)
{
	struct optee *optee = ffa_dev->dev.driver_data;
	struct optee *optee = ffa_dev_get_drvdata(ffa_dev);

	optee_remove_common(optee);

+6 −1
Original line number Diff line number Diff line
@@ -38,7 +38,12 @@ struct ffa_driver {

static inline void ffa_dev_set_drvdata(struct ffa_device *fdev, void *data)
{
	fdev->dev.driver_data = data;
	dev_set_drvdata(&fdev->dev, data);
}

static inline void *ffa_dev_get_drvdata(struct ffa_device *fdev)
{
	return dev_get_drvdata(&fdev->dev);
}

#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)