Lines Matching +full:max +full:- +full:msg
1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/armada-37xx-rwtm-mailbox.h>
15 #include <linux/dma-mapping.h>
29 #include <linux/turris-signing-key.h>
32 #define DRIVER_NAME "turris-mox-rwtm"
39 * https://gitlab.labs.nic.cz/turris/mox-boot-builder/tree/master/wtmi.
70 * struct mox_rwtm - driver private data structure
112 return rwtm->mbox_client.dev; in rwtm_dev()
121 if (!rwtm->has_board_info) \
122 return -ENODATA; \
123 return sysfs_emit(buf, format, rwtm->name); \
146 return -EIO; in mox_get_status()
148 return -(int)MBOX_STS_VALUE(retval); in mox_get_status()
150 return -EOPNOTSUPP; in mox_get_status()
152 return -EIO; in mox_get_status()
159 struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev); in mox_rwtm_rx_callback()
160 struct armada_37xx_rwtm_rx_msg *msg = data; in mox_rwtm_rx_callback() local
162 if (completion_done(&rwtm->cmd_done)) in mox_rwtm_rx_callback()
165 rwtm->reply = *msg; in mox_rwtm_rx_callback()
166 complete(&rwtm->cmd_done); in mox_rwtm_rx_callback()
170 struct armada_37xx_rwtm_tx_msg *msg, in mox_rwtm_exec() argument
176 if (!msg) in mox_rwtm_exec()
177 msg = &_msg; in mox_rwtm_exec()
179 msg->command = cmd; in mox_rwtm_exec()
181 ret = mbox_send_message(rwtm->mbox, msg); in mox_rwtm_exec()
186 ret = wait_for_completion_interruptible(&rwtm->cmd_done); in mox_rwtm_exec()
190 if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) in mox_rwtm_exec()
191 return -ETIMEDOUT; in mox_rwtm_exec()
194 return mox_get_status(cmd, rwtm->reply.retval); in mox_rwtm_exec()
210 struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; in mox_get_board_info()
214 if (ret == -ENODATA) { in mox_get_board_info()
217 } else if (ret == -EOPNOTSUPP) { in mox_get_board_info()
223 rwtm->serial_number = reply->status[1]; in mox_get_board_info()
224 rwtm->serial_number <<= 32; in mox_get_board_info()
225 rwtm->serial_number |= reply->status[0]; in mox_get_board_info()
226 rwtm->board_version = reply->status[2]; in mox_get_board_info()
227 rwtm->ram_size = reply->status[3]; in mox_get_board_info()
228 reply_to_mac_addr(rwtm->mac_address1, reply->status[4], in mox_get_board_info()
229 reply->status[5]); in mox_get_board_info()
230 reply_to_mac_addr(rwtm->mac_address2, reply->status[6], in mox_get_board_info()
231 reply->status[7]); in mox_get_board_info()
232 rwtm->has_board_info = true; in mox_get_board_info()
235 rwtm->serial_number); in mox_get_board_info()
236 pr_info(" board version %i\n", rwtm->board_version); in mox_get_board_info()
237 pr_info(" burned RAM size %i MiB\n", rwtm->ram_size); in mox_get_board_info()
245 struct armada_37xx_rwtm_tx_msg msg = { in check_get_random_support() local
246 .args = { 1, rwtm->buf_phys, 4 }, in check_get_random_support()
249 return mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, false); in check_get_random_support()
252 static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) in mox_hwrng_read() argument
255 struct armada_37xx_rwtm_tx_msg msg = { in mox_hwrng_read() local
256 .args = { 1, rwtm->buf_phys, ALIGN(max, 4) }, in mox_hwrng_read()
260 max = min(max, RWTM_DMA_BUFFER_SIZE); in mox_hwrng_read()
263 if (!mutex_trylock(&rwtm->busy)) in mox_hwrng_read()
264 return -EBUSY; in mox_hwrng_read()
266 mutex_lock(&rwtm->busy); in mox_hwrng_read()
269 ret = mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, true); in mox_hwrng_read()
273 memcpy(data, rwtm->buf, max); in mox_hwrng_read()
274 ret = max; in mox_hwrng_read()
277 mutex_unlock(&rwtm->busy); in mox_hwrng_read()
295 __be32 tmp[MOX_ECC_NUM_WORDS - 1]; in mox_ecc_public_key_to_bin()
304 cpu_to_be32_array(tmp, src_rest, MOX_ECC_NUM_WORDS - 1); in mox_ecc_public_key_to_bin()
311 struct armada_37xx_rwtm_tx_msg msg = {}; in mox_rwtm_sign() local
315 guard(mutex)(&rwtm->busy); in mox_rwtm_sign()
319 * args[0] - must be 1 in mox_rwtm_sign()
320 * args[1] - address of message M to sign; message is a 521-bit number in mox_rwtm_sign()
321 * args[2] - address where the R part of the signature will be stored in mox_rwtm_sign()
322 * args[3] - address where the S part of the signature will be stored in mox_rwtm_sign()
324 * M, R and S are 521-bit numbers encoded as seventeen 32-bit words, in mox_rwtm_sign()
333 memset(rwtm->buf, 0, sizeof(u32)); in mox_rwtm_sign()
334 memcpy(rwtm->buf + sizeof(u32), data, SHA512_DIGEST_SIZE); in mox_rwtm_sign()
335 be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUM_WORDS); in mox_rwtm_sign()
337 msg.args[0] = 1; in mox_rwtm_sign()
338 msg.args[1] = rwtm->buf_phys; in mox_rwtm_sign()
339 msg.args[2] = rwtm->buf_phys + offset_r; in mox_rwtm_sign()
340 msg.args[3] = rwtm->buf_phys + offset_s; in mox_rwtm_sign()
342 ret = mox_rwtm_exec(rwtm, MBOX_CMD_SIGN, &msg, true); in mox_rwtm_sign()
347 mox_ecc_number_to_bin(signature, rwtm->buf + offset_r); in mox_rwtm_sign()
348 mox_ecc_number_to_bin(signature + MOX_ECC_NUM_LEN, rwtm->buf + offset_s); in mox_rwtm_sign()
357 return rwtm->pubkey; in mox_rwtm_get_public_key()
372 struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; in mox_register_signing_key()
377 if (ret == -ENODATA) { in mox_register_signing_key()
379 } else if (ret == -EOPNOTSUPP) { in mox_register_signing_key()
388 if (rwtm->has_board_info) in mox_register_signing_key()
389 sprintf(sn, "%016llX", rwtm->serial_number); in mox_register_signing_key()
393 mox_ecc_public_key_to_bin(rwtm->pubkey, ret, reply->status); in mox_register_signing_key()
428 struct device *dev = &pdev->dev; in turris_mox_rwtm_probe()
433 return -ENOMEM; in turris_mox_rwtm_probe()
435 rwtm->buf = dmam_alloc_coherent(dev, RWTM_DMA_BUFFER_SIZE, in turris_mox_rwtm_probe()
436 &rwtm->buf_phys, GFP_KERNEL); in turris_mox_rwtm_probe()
437 if (!rwtm->buf) in turris_mox_rwtm_probe()
438 return -ENOMEM; in turris_mox_rwtm_probe()
442 ret = devm_mutex_init(dev, &rwtm->busy); in turris_mox_rwtm_probe()
446 init_completion(&rwtm->cmd_done); in turris_mox_rwtm_probe()
448 rwtm->mbox_client.dev = dev; in turris_mox_rwtm_probe()
449 rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback; in turris_mox_rwtm_probe()
451 rwtm->mbox = mbox_request_channel(&rwtm->mbox_client, 0); in turris_mox_rwtm_probe()
452 if (IS_ERR(rwtm->mbox)) in turris_mox_rwtm_probe()
453 return dev_err_probe(dev, PTR_ERR(rwtm->mbox), in turris_mox_rwtm_probe()
456 ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox); in turris_mox_rwtm_probe()
475 rwtm->hwrng.name = DRIVER_NAME "_hwrng"; in turris_mox_rwtm_probe()
476 rwtm->hwrng.read = mox_hwrng_read; in turris_mox_rwtm_probe()
478 ret = devm_hwrng_register(dev, &rwtm->hwrng); in turris_mox_rwtm_probe()
486 * /sys/firmware/turris-mox-rwtm to this device's sysfs directory. in turris_mox_rwtm_probe()
488 ret = sysfs_create_link(firmware_kobj, &dev->kobj, DRIVER_NAME); in turris_mox_rwtm_probe()
497 { .compatible = "cznic,turris-mox-rwtm", },
498 { .compatible = "marvell,armada-3700-rwtm-firmware", },