Lines Matching refs:rwtm
89 struct mox_rwtm *rwtm; member
92 static inline struct kobject *rwtm_to_kobj(struct mox_rwtm *rwtm) in rwtm_to_kobj() argument
94 return &rwtm->kobj->kobj; in rwtm_to_kobj()
99 return container_of(kobj, struct mox_kobject, kobj)->rwtm; in to_rwtm()
112 static int mox_kobj_create(struct mox_rwtm *rwtm) in mox_kobj_create() argument
114 rwtm->kobj = kzalloc(sizeof(*rwtm->kobj), GFP_KERNEL); in mox_kobj_create()
115 if (!rwtm->kobj) in mox_kobj_create()
118 kobject_init(rwtm_to_kobj(rwtm), &mox_kobj_ktype); in mox_kobj_create()
119 if (kobject_add(rwtm_to_kobj(rwtm), firmware_kobj, "turris-mox-rwtm")) { in mox_kobj_create()
120 kobject_put(rwtm_to_kobj(rwtm)); in mox_kobj_create()
124 rwtm->kobj->rwtm = rwtm; in mox_kobj_create()
134 struct mox_rwtm *rwtm = to_rwtm(kobj); \
135 if (!rwtm->has_##cat) \
137 return sprintf(buf, format, rwtm->name); \
174 struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev); in mox_rwtm_rx_callback() local
177 rwtm->reply = *msg; in mox_rwtm_rx_callback()
178 complete(&rwtm->cmd_done); in mox_rwtm_rx_callback()
191 static int mox_get_board_info(struct mox_rwtm *rwtm) in mox_get_board_info() argument
194 struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; in mox_get_board_info()
198 ret = mbox_send_message(rwtm->mbox, &msg); in mox_get_board_info()
202 ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); in mox_get_board_info()
208 dev_warn(rwtm->dev, in mox_get_board_info()
211 dev_notice(rwtm->dev, in mox_get_board_info()
216 rwtm->serial_number = reply->status[1]; in mox_get_board_info()
217 rwtm->serial_number <<= 32; in mox_get_board_info()
218 rwtm->serial_number |= reply->status[0]; in mox_get_board_info()
219 rwtm->board_version = reply->status[2]; in mox_get_board_info()
220 rwtm->ram_size = reply->status[3]; in mox_get_board_info()
221 reply_to_mac_addr(rwtm->mac_address1, reply->status[4], in mox_get_board_info()
223 reply_to_mac_addr(rwtm->mac_address2, reply->status[6], in mox_get_board_info()
225 rwtm->has_board_info = 1; in mox_get_board_info()
228 rwtm->serial_number); in mox_get_board_info()
229 pr_info(" board version %i\n", rwtm->board_version); in mox_get_board_info()
230 pr_info(" burned RAM size %i MiB\n", rwtm->ram_size); in mox_get_board_info()
234 ret = mbox_send_message(rwtm->mbox, &msg); in mox_get_board_info()
238 ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); in mox_get_board_info()
244 dev_warn(rwtm->dev, "Board has no public key burned!\n"); in mox_get_board_info()
246 dev_notice(rwtm->dev, in mox_get_board_info()
253 rwtm->has_pubkey = 1; in mox_get_board_info()
254 sprintf(rwtm->pubkey, in mox_get_board_info()
263 static int check_get_random_support(struct mox_rwtm *rwtm) in check_get_random_support() argument
270 msg.args[1] = rwtm->buf_phys; in check_get_random_support()
273 ret = mbox_send_message(rwtm->mbox, &msg); in check_get_random_support()
277 ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); in check_get_random_support()
281 return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); in check_get_random_support()
286 struct mox_rwtm *rwtm = (struct mox_rwtm *) rng->priv; in mox_hwrng_read() local
295 msg.args[1] = rwtm->buf_phys; in mox_hwrng_read()
299 if (!mutex_trylock(&rwtm->busy)) in mox_hwrng_read()
302 mutex_lock(&rwtm->busy); in mox_hwrng_read()
305 ret = mbox_send_message(rwtm->mbox, &msg); in mox_hwrng_read()
309 ret = wait_for_completion_interruptible(&rwtm->cmd_done); in mox_hwrng_read()
313 ret = mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); in mox_hwrng_read()
317 memcpy(data, rwtm->buf, max); in mox_hwrng_read()
321 mutex_unlock(&rwtm->busy); in mox_hwrng_read()
336 struct mox_rwtm *rwtm = file->private_data; in do_sign_read() local
346 if (!rwtm->last_sig_done) in do_sign_read()
350 ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, 136); in do_sign_read()
351 rwtm->last_sig_done = 0; in do_sign_read()
359 struct mox_rwtm *rwtm = file->private_data; in do_sign_write() local
360 struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; in do_sign_write()
370 if (rwtm->last_sig_done) in do_sign_write()
373 if (!mutex_trylock(&rwtm->busy)) in do_sign_write()
387 memset(rwtm->buf, 0, 4); in do_sign_write()
388 ret = simple_write_to_buffer(rwtm->buf + 4, 64, &dummy, buf, len); in do_sign_write()
391 be32_to_cpu_array(rwtm->buf, rwtm->buf, 17); in do_sign_write()
395 msg.args[1] = rwtm->buf_phys; in do_sign_write()
396 msg.args[2] = rwtm->buf_phys + 68; in do_sign_write()
397 msg.args[3] = rwtm->buf_phys + 2 * 68; in do_sign_write()
398 ret = mbox_send_message(rwtm->mbox, &msg); in do_sign_write()
402 ret = wait_for_completion_interruptible(&rwtm->cmd_done); in do_sign_write()
415 memcpy(rwtm->last_sig, rwtm->buf + 68, 136); in do_sign_write()
416 cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, 34); in do_sign_write()
417 rwtm->last_sig_done = 1; in do_sign_write()
419 mutex_unlock(&rwtm->busy); in do_sign_write()
422 mutex_unlock(&rwtm->busy); in do_sign_write()
434 static int rwtm_register_debugfs(struct mox_rwtm *rwtm) in rwtm_register_debugfs() argument
443 entry = debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, in rwtm_register_debugfs()
448 rwtm->debugfs_root = root; in rwtm_register_debugfs()
456 static void rwtm_unregister_debugfs(struct mox_rwtm *rwtm) in rwtm_unregister_debugfs() argument
458 debugfs_remove_recursive(rwtm->debugfs_root); in rwtm_unregister_debugfs()
461 static inline int rwtm_register_debugfs(struct mox_rwtm *rwtm) in rwtm_register_debugfs() argument
466 static inline void rwtm_unregister_debugfs(struct mox_rwtm *rwtm) in rwtm_unregister_debugfs() argument
473 struct mox_rwtm *rwtm; in turris_mox_rwtm_probe() local
477 rwtm = devm_kzalloc(dev, sizeof(*rwtm), GFP_KERNEL); in turris_mox_rwtm_probe()
478 if (!rwtm) in turris_mox_rwtm_probe()
481 rwtm->dev = dev; in turris_mox_rwtm_probe()
482 rwtm->buf = dmam_alloc_coherent(dev, PAGE_SIZE, &rwtm->buf_phys, in turris_mox_rwtm_probe()
484 if (!rwtm->buf) in turris_mox_rwtm_probe()
487 ret = mox_kobj_create(rwtm); in turris_mox_rwtm_probe()
493 ret = sysfs_create_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); in turris_mox_rwtm_probe()
499 platform_set_drvdata(pdev, rwtm); in turris_mox_rwtm_probe()
501 mutex_init(&rwtm->busy); in turris_mox_rwtm_probe()
503 rwtm->mbox_client.dev = dev; in turris_mox_rwtm_probe()
504 rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback; in turris_mox_rwtm_probe()
506 rwtm->mbox = mbox_request_channel(&rwtm->mbox_client, 0); in turris_mox_rwtm_probe()
507 if (IS_ERR(rwtm->mbox)) { in turris_mox_rwtm_probe()
508 ret = PTR_ERR(rwtm->mbox); in turris_mox_rwtm_probe()
515 init_completion(&rwtm->cmd_done); in turris_mox_rwtm_probe()
517 ret = mox_get_board_info(rwtm); in turris_mox_rwtm_probe()
521 ret = check_get_random_support(rwtm); in turris_mox_rwtm_probe()
528 rwtm->hwrng.name = DRIVER_NAME "_hwrng"; in turris_mox_rwtm_probe()
529 rwtm->hwrng.read = mox_hwrng_read; in turris_mox_rwtm_probe()
530 rwtm->hwrng.priv = (unsigned long) rwtm; in turris_mox_rwtm_probe()
531 rwtm->hwrng.quality = 1024; in turris_mox_rwtm_probe()
533 ret = devm_hwrng_register(dev, &rwtm->hwrng); in turris_mox_rwtm_probe()
539 ret = rwtm_register_debugfs(rwtm); in turris_mox_rwtm_probe()
550 mbox_free_channel(rwtm->mbox); in turris_mox_rwtm_probe()
552 sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); in turris_mox_rwtm_probe()
554 kobject_put(rwtm_to_kobj(rwtm)); in turris_mox_rwtm_probe()
560 struct mox_rwtm *rwtm = platform_get_drvdata(pdev); in turris_mox_rwtm_remove() local
562 rwtm_unregister_debugfs(rwtm); in turris_mox_rwtm_remove()
563 sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); in turris_mox_rwtm_remove()
564 kobject_put(rwtm_to_kobj(rwtm)); in turris_mox_rwtm_remove()
565 mbox_free_channel(rwtm->mbox); in turris_mox_rwtm_remove()