Commit a85b55ee authored by Yeoreum Yun's avatar Yeoreum Yun Committed by Jarkko Sakkinen
Browse files

tpm_ffa_crb: access tpm service over FF-A direct message request v2



For secure partition with multi service, tpm_ffa_crb can access tpm
service with direct message request v2 interface according to chapter 3.3,
TPM Service Command Response Buffer Interface Over FF-A specificationi v1.0 BET.

This patch reflects this spec to access tpm service over
FF-A direct message request v2 ABI.

Acked-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Signed-off-by: default avatarYeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
parent 8dc9c078
Loading
Loading
Loading
Loading
+40 −15
Original line number Diff line number Diff line
@@ -105,7 +105,10 @@ struct tpm_crb_ffa {
	u16 minor_version;
	/* lock to protect sending of FF-A messages: */
	struct mutex msg_data_lock;
	union {
		struct ffa_send_direct_data direct_msg_data;
		struct ffa_send_direct_data2 direct_msg_data2;
	};
};

static struct tpm_crb_ffa *tpm_crb_ffa;
@@ -185,6 +188,20 @@ static int __tpm_crb_ffa_send_recieve(unsigned long func_id,

	msg_ops = tpm_crb_ffa->ffa_dev->ops->msg_ops;

	if (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) {
		memset(&tpm_crb_ffa->direct_msg_data2, 0x00,
		       sizeof(struct ffa_send_direct_data2));

		tpm_crb_ffa->direct_msg_data2.data[0] = func_id;
		tpm_crb_ffa->direct_msg_data2.data[1] = a0;
		tpm_crb_ffa->direct_msg_data2.data[2] = a1;
		tpm_crb_ffa->direct_msg_data2.data[3] = a2;

		ret = msg_ops->sync_send_receive2(tpm_crb_ffa->ffa_dev,
				&tpm_crb_ffa->direct_msg_data2);
		if (!ret)
			ret = tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data2.data[0]);
	} else {
		memset(&tpm_crb_ffa->direct_msg_data, 0x00,
		       sizeof(struct ffa_send_direct_data));

@@ -197,6 +214,8 @@ static int __tpm_crb_ffa_send_recieve(unsigned long func_id,
				&tpm_crb_ffa->direct_msg_data);
		if (!ret)
			ret = tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data.data1);
	}


	return ret;
}
@@ -231,9 +250,14 @@ int tpm_crb_ffa_get_interface_version(u16 *major, u16 *minor)

	rc = __tpm_crb_ffa_send_recieve(CRB_FFA_GET_INTERFACE_VERSION, 0x00, 0x00, 0x00);
	if (!rc) {
		if (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) {
			*major = CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]);
			*minor = CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]);
		} else {
			*major = CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data.data2);
			*minor = CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data.data2);
		}
	}

	return rc;
}
@@ -277,7 +301,8 @@ static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev)

	tpm_crb_ffa = ERR_PTR(-ENODEV); // set tpm_crb_ffa so we can detect probe failure

	if (!ffa_partition_supports_direct_recv(ffa_dev)) {
	if (!ffa_partition_supports_direct_recv(ffa_dev) &&
	    !ffa_partition_supports_direct_req2_recv(ffa_dev)) {
		pr_err("TPM partition doesn't support direct message receive.\n");
		return -EINVAL;
	}