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