Lines Matching +full:version +full:- +full:major
1 // SPDX-License-Identifier: GPL-2.0-only
7 * Interface Over FF-A (DEN0138).
37 /* version encoding */
50 * as defined in FF-A specification:
52 * -for 32-bit: 0x8400006F or 0x84000070
53 * -for 64-bit: 0xC400006F or 0xC4000070
56 * w3-w7: Implementation defined, free to be used below
60 * Returns the version of the interface that is available
64 * w5-w7: Reserved (MBZ)
69 * w5: TPM service interface version
70 * Bits[31:16]: major version
71 * Bits[15:0]: minor version
72 * w6-w7: Reserved (MBZ)
75 * CRB_FFA_OK_RESULTS_RETURNED: The version of the interface has been
92 * -If the start function qualifier is 0, identifies the locality
94 * -If the start function qualifier is 1, identifies the locality
96 * w6-w7: Reserved (MBZ)
101 * w5-w7: Reserved (MBZ)
117 /* lock to protect sending of FF-A messages: */
140 rc = -ENOENT; in tpm_crb_ffa_to_linux_errno()
143 rc = -EPERM; in tpm_crb_ffa_to_linux_errno()
146 rc = -EINVAL; in tpm_crb_ffa_to_linux_errno()
149 rc = -ENOEXEC; in tpm_crb_ffa_to_linux_errno()
152 rc = -EEXIST; in tpm_crb_ffa_to_linux_errno()
155 rc = -EACCES; in tpm_crb_ffa_to_linux_errno()
158 rc = -ENOMEM; in tpm_crb_ffa_to_linux_errno()
161 rc = -EINVAL; in tpm_crb_ffa_to_linux_errno()
168 * tpm_crb_ffa_init - called by the CRB driver to do any needed initialization
172 * yet, returns -ENOENT in order to force a retry. If th ffa_crb
173 * driver had been probed but failed with an error, returns -ENODEV
185 tpm_crb_ffa = ERR_PTR(-ENODEV); in tpm_crb_ffa_init()
191 ret = -ENOENT; in tpm_crb_ffa_init()
194 ret = -ENODEV; in tpm_crb_ffa_init()
207 msg_ops = tpm_crb_ffa->ffa_dev->ops->msg_ops; in __tpm_crb_ffa_try_send_receive()
209 if (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) { in __tpm_crb_ffa_try_send_receive()
210 tpm_crb_ffa->direct_msg_data2 = (struct ffa_send_direct_data2){ in __tpm_crb_ffa_try_send_receive()
214 ret = msg_ops->sync_send_receive2(tpm_crb_ffa->ffa_dev, in __tpm_crb_ffa_try_send_receive()
215 &tpm_crb_ffa->direct_msg_data2); in __tpm_crb_ffa_try_send_receive()
217 ret = tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data2.data[0]); in __tpm_crb_ffa_try_send_receive()
219 tpm_crb_ffa->direct_msg_data = (struct ffa_send_direct_data){ in __tpm_crb_ffa_try_send_receive()
226 ret = msg_ops->sync_send_receive(tpm_crb_ffa->ffa_dev, in __tpm_crb_ffa_try_send_receive()
227 &tpm_crb_ffa->direct_msg_data); in __tpm_crb_ffa_try_send_receive()
229 ret = tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data.data1); in __tpm_crb_ffa_try_send_receive()
242 return -ENOENT; in __tpm_crb_ffa_send_receive()
249 if (ret != -EBUSY) in __tpm_crb_ffa_send_receive()
254 dev_warn(&tpm_crb_ffa->ffa_dev->dev, in __tpm_crb_ffa_send_receive()
264 * tpm_crb_ffa_get_interface_version() - gets the ABI version of the TPM service
265 * @major: Pointer to caller-allocated buffer to hold the major version
267 * @minor: Pointer to caller-allocated buffer to hold the minor version
270 * Returns the major and minor version of the ABI of the FF-A based TPM.
271 * Allows the caller to evaluate its compatibility with the version of
276 static int tpm_crb_ffa_get_interface_version(u16 *major, u16 *minor) in tpm_crb_ffa_get_interface_version() argument
281 return -ENOENT; in tpm_crb_ffa_get_interface_version()
284 return -ENODEV; in tpm_crb_ffa_get_interface_version()
286 if (!major || !minor) in tpm_crb_ffa_get_interface_version()
287 return -EINVAL; in tpm_crb_ffa_get_interface_version()
289 guard(mutex)(&tpm_crb_ffa->msg_data_lock); in tpm_crb_ffa_get_interface_version()
293 if (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) { in tpm_crb_ffa_get_interface_version()
294 *major = CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]); in tpm_crb_ffa_get_interface_version()
295 *minor = CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]); in tpm_crb_ffa_get_interface_version()
297 *major = CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); in tpm_crb_ffa_get_interface_version()
298 *minor = CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); in tpm_crb_ffa_get_interface_version()
306 * tpm_crb_ffa_start() - signals the TPM that a field has changed in the CRB
321 return -ENOENT; in tpm_crb_ffa_start()
324 return -ENODEV; in tpm_crb_ffa_start()
326 guard(mutex)(&tpm_crb_ffa->msg_data_lock); in tpm_crb_ffa_start()
339 return -EEXIST; in tpm_crb_ffa_probe()
341 tpm_crb_ffa = ERR_PTR(-ENODEV); // set tpm_crb_ffa so we can detect probe failure in tpm_crb_ffa_probe()
345 dev_warn(&ffa_dev->dev, "partition doesn't support direct message receive.\n"); in tpm_crb_ffa_probe()
346 return -EINVAL; in tpm_crb_ffa_probe()
351 return -ENOMEM; in tpm_crb_ffa_probe()
354 mutex_init(&tpm_crb_ffa->msg_data_lock); in tpm_crb_ffa_probe()
355 tpm_crb_ffa->ffa_dev = ffa_dev; in tpm_crb_ffa_probe()
358 /* if TPM is aarch32 use 32-bit SMCs */ in tpm_crb_ffa_probe()
360 ffa_dev->ops->msg_ops->mode_32bit_set(ffa_dev); in tpm_crb_ffa_probe()
362 /* verify compatibility of TPM service version number */ in tpm_crb_ffa_probe()
363 rc = tpm_crb_ffa_get_interface_version(&tpm_crb_ffa->major_version, in tpm_crb_ffa_probe()
364 &tpm_crb_ffa->minor_version); in tpm_crb_ffa_probe()
366 dev_err(&ffa_dev->dev, "failed to get crb interface version. rc:%d\n", rc); in tpm_crb_ffa_probe()
370 dev_info(&ffa_dev->dev, "ABI version %u.%u\n", tpm_crb_ffa->major_version, in tpm_crb_ffa_probe()
371 tpm_crb_ffa->minor_version); in tpm_crb_ffa_probe()
373 if (tpm_crb_ffa->major_version != CRB_FFA_VERSION_MAJOR || in tpm_crb_ffa_probe()
374 (tpm_crb_ffa->minor_version > 0 && in tpm_crb_ffa_probe()
375 tpm_crb_ffa->minor_version < CRB_FFA_VERSION_MINOR)) { in tpm_crb_ffa_probe()
376 dev_warn(&ffa_dev->dev, "Incompatible ABI version\n"); in tpm_crb_ffa_probe()
384 tpm_crb_ffa = ERR_PTR(-ENODEV); in tpm_crb_ffa_probe()
385 return -EINVAL; in tpm_crb_ffa_probe()
395 /* 17b862a4-1806-4faf-86b3-089a58353861 */
402 .name = "ffa-crb",