Lines Matching +full:max +full:- +full:msg +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/armada-37xx-rwtm-mailbox.h>
15 #include <linux/dma-mapping.h>
30 #define DRIVER_NAME "turris-mox-rwtm"
37 * https://gitlab.labs.nic.cz/turris/mox-boot-builder/tree/master/wtmi.
65 * struct mox_rwtm - driver private data structure
77 * @ram_size: RAM size of the device
120 return rwtm->mbox_client.dev; in rwtm_dev()
129 if (!rwtm->has_##cat) \
130 return -ENODATA; \
131 return sysfs_emit(buf, format, rwtm->name); \
156 return -EIO; in mox_get_status()
158 return -(int)MBOX_STS_VALUE(retval); in mox_get_status()
160 return -EOPNOTSUPP; in mox_get_status()
162 return -EIO; in mox_get_status()
169 struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev); in mox_rwtm_rx_callback()
170 struct armada_37xx_rwtm_rx_msg *msg = data; in mox_rwtm_rx_callback() local
172 if (completion_done(&rwtm->cmd_done)) in mox_rwtm_rx_callback()
175 rwtm->reply = *msg; in mox_rwtm_rx_callback()
176 complete(&rwtm->cmd_done); in mox_rwtm_rx_callback()
180 struct armada_37xx_rwtm_tx_msg *msg, in mox_rwtm_exec() argument
186 if (!msg) in mox_rwtm_exec()
187 msg = &_msg; in mox_rwtm_exec()
189 msg->command = cmd; in mox_rwtm_exec()
191 ret = mbox_send_message(rwtm->mbox, msg); in mox_rwtm_exec()
196 ret = wait_for_completion_interruptible(&rwtm->cmd_done); in mox_rwtm_exec()
200 if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) in mox_rwtm_exec()
201 return -ETIMEDOUT; in mox_rwtm_exec()
204 return mox_get_status(cmd, rwtm->reply.retval); in mox_rwtm_exec()
220 struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; in mox_get_board_info()
224 if (ret == -ENODATA) { in mox_get_board_info()
227 } else if (ret == -EOPNOTSUPP) { in mox_get_board_info()
233 rwtm->serial_number = reply->status[1]; in mox_get_board_info()
234 rwtm->serial_number <<= 32; in mox_get_board_info()
235 rwtm->serial_number |= reply->status[0]; in mox_get_board_info()
236 rwtm->board_version = reply->status[2]; in mox_get_board_info()
237 rwtm->ram_size = reply->status[3]; in mox_get_board_info()
238 reply_to_mac_addr(rwtm->mac_address1, reply->status[4], in mox_get_board_info()
239 reply->status[5]); in mox_get_board_info()
240 reply_to_mac_addr(rwtm->mac_address2, reply->status[6], in mox_get_board_info()
241 reply->status[7]); in mox_get_board_info()
242 rwtm->has_board_info = true; in mox_get_board_info()
245 rwtm->serial_number); in mox_get_board_info()
246 pr_info(" board version %i\n", rwtm->board_version); in mox_get_board_info()
247 pr_info(" burned RAM size %i MiB\n", rwtm->ram_size); in mox_get_board_info()
251 if (ret == -ENODATA) { in mox_get_board_info()
253 } else if (ret == -EOPNOTSUPP) { in mox_get_board_info()
259 u32 *s = reply->status; in mox_get_board_info()
261 rwtm->has_pubkey = true; in mox_get_board_info()
262 sprintf(rwtm->pubkey, in mox_get_board_info()
273 struct armada_37xx_rwtm_tx_msg msg = { in check_get_random_support() local
274 .args = { 1, rwtm->buf_phys, 4 }, in check_get_random_support()
277 return mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, false); in check_get_random_support()
280 static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) in mox_hwrng_read() argument
283 struct armada_37xx_rwtm_tx_msg msg = { in mox_hwrng_read() local
284 .args = { 1, rwtm->buf_phys, ALIGN(max, 4) }, in mox_hwrng_read()
288 max = min(max, RWTM_DMA_BUFFER_SIZE); in mox_hwrng_read()
291 if (!mutex_trylock(&rwtm->busy)) in mox_hwrng_read()
292 return -EBUSY; in mox_hwrng_read()
294 mutex_lock(&rwtm->busy); in mox_hwrng_read()
297 ret = mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, true); in mox_hwrng_read()
301 memcpy(data, rwtm->buf, max); in mox_hwrng_read()
302 ret = max; in mox_hwrng_read()
305 mutex_unlock(&rwtm->busy); in mox_hwrng_read()
312 file->private_data = inode->i_private; in rwtm_debug_open()
320 struct mox_rwtm *rwtm = file->private_data; in do_sign_read()
327 if (len < sizeof(rwtm->last_sig)) in do_sign_read()
328 return -EINVAL; in do_sign_read()
330 if (!rwtm->last_sig_done) in do_sign_read()
331 return -ENODATA; in do_sign_read()
333 ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, in do_sign_read()
334 sizeof(rwtm->last_sig)); in do_sign_read()
335 rwtm->last_sig_done = false; in do_sign_read()
343 struct mox_rwtm *rwtm = file->private_data; in do_sign_write()
344 struct armada_37xx_rwtm_tx_msg msg; in do_sign_write() local
349 return -EINVAL; in do_sign_write()
352 if (rwtm->last_sig_done) in do_sign_write()
353 return -EBUSY; in do_sign_write()
355 if (!mutex_trylock(&rwtm->busy)) in do_sign_write()
356 return -EBUSY; in do_sign_write()
361 * The input is an array of 17 32-bit words, the first (most in do_sign_write()
362 * significat) is 0, the rest 16 words are copied from the SHA-512 in do_sign_write()
369 memset(rwtm->buf, 0, sizeof(u32)); in do_sign_write()
370 ret = simple_write_to_buffer(rwtm->buf + sizeof(u32), in do_sign_write()
374 be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUMBER_WORDS); in do_sign_write()
376 msg.args[0] = 1; in do_sign_write()
377 msg.args[1] = rwtm->buf_phys; in do_sign_write()
378 msg.args[2] = rwtm->buf_phys + MOX_ECC_NUMBER_LEN; in do_sign_write()
379 msg.args[3] = rwtm->buf_phys + 2 * MOX_ECC_NUMBER_LEN; in do_sign_write()
381 ret = mox_rwtm_exec(rwtm, MBOX_CMD_SIGN, &msg, true); in do_sign_write()
390 memcpy(rwtm->last_sig, rwtm->buf + MOX_ECC_NUMBER_LEN, in do_sign_write()
391 sizeof(rwtm->last_sig)); in do_sign_write()
392 cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, in do_sign_write()
394 rwtm->last_sig_done = true; in do_sign_write()
396 mutex_unlock(&rwtm->busy); in do_sign_write()
399 mutex_unlock(&rwtm->busy); in do_sign_write()
419 root = debugfs_create_dir("turris-mox-rwtm", NULL); in rwtm_register_debugfs()
444 struct device *dev = &pdev->dev; in turris_mox_rwtm_probe()
449 return -ENOMEM; in turris_mox_rwtm_probe()
451 rwtm->buf = dmam_alloc_coherent(dev, RWTM_DMA_BUFFER_SIZE, in turris_mox_rwtm_probe()
452 &rwtm->buf_phys, GFP_KERNEL); in turris_mox_rwtm_probe()
453 if (!rwtm->buf) in turris_mox_rwtm_probe()
454 return -ENOMEM; in turris_mox_rwtm_probe()
458 ret = devm_mutex_init(dev, &rwtm->busy); in turris_mox_rwtm_probe()
462 init_completion(&rwtm->cmd_done); in turris_mox_rwtm_probe()
464 rwtm->mbox_client.dev = dev; in turris_mox_rwtm_probe()
465 rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback; in turris_mox_rwtm_probe()
467 rwtm->mbox = mbox_request_channel(&rwtm->mbox_client, 0); in turris_mox_rwtm_probe()
468 if (IS_ERR(rwtm->mbox)) in turris_mox_rwtm_probe()
469 return dev_err_probe(dev, PTR_ERR(rwtm->mbox), in turris_mox_rwtm_probe()
472 ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox); in turris_mox_rwtm_probe()
487 rwtm->hwrng.name = DRIVER_NAME "_hwrng"; in turris_mox_rwtm_probe()
488 rwtm->hwrng.read = mox_hwrng_read; in turris_mox_rwtm_probe()
490 ret = devm_hwrng_register(dev, &rwtm->hwrng); in turris_mox_rwtm_probe()
500 * /sys/firmware/turris-mox-rwtm to this device's sysfs directory. in turris_mox_rwtm_probe()
502 ret = sysfs_create_link(firmware_kobj, &dev->kobj, DRIVER_NAME); in turris_mox_rwtm_probe()
511 { .compatible = "cznic,turris-mox-rwtm", },
512 { .compatible = "marvell,armada-3700-rwtm-firmware", },