Lines Matching refs:np

146 static unsigned long n2rng_control_settle_v2(struct n2rng *np, int unit)  in n2rng_control_settle_v2()  argument
148 unsigned long ra = __pa(&np->scratch_control[0]); in n2rng_control_settle_v2()
153 static unsigned long n2rng_write_ctl_one(struct n2rng *np, int unit, in n2rng_write_ctl_one() argument
161 if (np->hvapi_major == 1) { in n2rng_write_ctl_one()
168 hv_err = n2rng_control_settle_v2(np, unit); in n2rng_write_ctl_one()
200 static unsigned long n2rng_read_diag_data_one(struct n2rng *np, in n2rng_read_diag_data_one() argument
208 if (np->hvapi_major == 1) { in n2rng_read_diag_data_one()
219 static int n2rng_generic_read_diag_data(struct n2rng *np, in n2rng_generic_read_diag_data() argument
228 hv_err = n2rng_read_diag_data_one(np, unit, in n2rng_generic_read_diag_data()
248 static int n2rng_generic_write_control(struct n2rng *np, in n2rng_generic_write_control() argument
257 hv_err = n2rng_write_ctl_one(np, unit, state, control_ra, in n2rng_generic_write_control()
258 np->wd_timeo, &ticks); in n2rng_generic_write_control()
278 static int n2rng_try_read_ctl(struct n2rng *np) in n2rng_try_read_ctl() argument
283 if (np->hvapi_major == 1) { in n2rng_try_read_ctl()
326 static void n2rng_control_swstate_init(struct n2rng *np) in n2rng_control_swstate_init() argument
330 np->flags |= N2RNG_FLAG_CONTROL; in n2rng_control_swstate_init()
332 np->health_check_sec = N2RNG_HEALTH_CHECK_SEC_DEFAULT; in n2rng_control_swstate_init()
333 np->accum_cycles = N2RNG_ACCUM_CYCLES_DEFAULT; in n2rng_control_swstate_init()
334 np->wd_timeo = N2RNG_WD_TIMEO_DEFAULT; in n2rng_control_swstate_init()
336 for (i = 0; i < np->num_units; i++) { in n2rng_control_swstate_init()
337 struct n2rng_unit *up = &np->units[i]; in n2rng_control_swstate_init()
345 np->hv_state = HV_RNG_STATE_UNCONFIGURED; in n2rng_control_swstate_init()
348 static int n2rng_grab_diag_control(struct n2rng *np) in n2rng_grab_diag_control() argument
354 err = n2rng_try_read_ctl(np); in n2rng_grab_diag_control()
359 dev_err(&np->op->dev, in n2rng_grab_diag_control()
370 static int n2rng_init_control(struct n2rng *np) in n2rng_init_control() argument
372 int err = n2rng_grab_diag_control(np); in n2rng_init_control()
382 n2rng_control_swstate_init(np); in n2rng_init_control()
389 struct n2rng *np = (struct n2rng *) rng->priv; in n2rng_data_read() local
390 unsigned long ra = __pa(&np->test_data); in n2rng_data_read()
393 if (!(np->flags & N2RNG_FLAG_READY)) { in n2rng_data_read()
395 } else if (np->flags & N2RNG_FLAG_BUFFER_VALID) { in n2rng_data_read()
396 np->flags &= ~N2RNG_FLAG_BUFFER_VALID; in n2rng_data_read()
397 *data = np->buffer; in n2rng_data_read()
402 np->buffer = np->test_data >> 32; in n2rng_data_read()
403 *data = np->test_data & 0xffffffff; in n2rng_data_read()
406 dev_err(&np->op->dev, "RNG error, restesting\n"); in n2rng_data_read()
407 np->flags &= ~N2RNG_FLAG_READY; in n2rng_data_read()
408 if (!(np->flags & N2RNG_FLAG_SHUTDOWN)) in n2rng_data_read()
409 schedule_delayed_work(&np->work, 0); in n2rng_data_read()
422 static int n2rng_guest_check(struct n2rng *np) in n2rng_guest_check() argument
424 unsigned long ra = __pa(&np->test_data); in n2rng_guest_check()
429 static int n2rng_entropy_diag_read(struct n2rng *np, unsigned long unit, in n2rng_entropy_diag_read() argument
439 err = n2rng_generic_write_control(np, pre_ctl_ra, unit, pre_state); in n2rng_entropy_diag_read()
443 err = n2rng_generic_read_diag_data(np, unit, in n2rng_entropy_diag_read()
446 (void) n2rng_generic_write_control(np, post_ctl_ra, unit, in n2rng_entropy_diag_read()
467 static int n2rng_test_buffer_find(struct n2rng *np, u64 val) in n2rng_test_buffer_find() argument
473 if (np->test_buffer[i] == val) in n2rng_test_buffer_find()
479 static void n2rng_dump_test_buffer(struct n2rng *np) in n2rng_dump_test_buffer() argument
484 dev_err(&np->op->dev, "Test buffer slot %d [0x%016llx]\n", in n2rng_dump_test_buffer()
485 i, np->test_buffer[i]); in n2rng_dump_test_buffer()
488 static int n2rng_check_selftest_buffer(struct n2rng *np, unsigned long unit) in n2rng_check_selftest_buffer() argument
495 matches += n2rng_test_buffer_find(np, val); in n2rng_check_selftest_buffer()
504 dev_err(&np->op->dev, "Selftest failed on unit %lu\n", unit); in n2rng_check_selftest_buffer()
505 n2rng_dump_test_buffer(np); in n2rng_check_selftest_buffer()
507 dev_info(&np->op->dev, "Selftest passed on unit %lu\n", unit); in n2rng_check_selftest_buffer()
512 static int n2rng_control_selftest(struct n2rng *np, unsigned long unit) in n2rng_control_selftest() argument
516 np->test_control[0] = (0x2 << RNG_CTL_ASEL_SHIFT); in n2rng_control_selftest()
517 np->test_control[1] = (0x2 << RNG_CTL_ASEL_SHIFT); in n2rng_control_selftest()
518 np->test_control[2] = (0x2 << RNG_CTL_ASEL_SHIFT); in n2rng_control_selftest()
519 np->test_control[3] = ((0x2 << RNG_CTL_ASEL_SHIFT) | in n2rng_control_selftest()
524 err = n2rng_entropy_diag_read(np, unit, np->test_control, in n2rng_control_selftest()
526 np->test_buffer, in n2rng_control_selftest()
527 sizeof(np->test_buffer), in n2rng_control_selftest()
528 &np->units[unit].control[0], in n2rng_control_selftest()
529 np->hv_state); in n2rng_control_selftest()
533 return n2rng_check_selftest_buffer(np, unit); in n2rng_control_selftest()
536 static int n2rng_control_check(struct n2rng *np) in n2rng_control_check() argument
540 for (i = 0; i < np->num_units; i++) { in n2rng_control_check()
541 int err = n2rng_control_selftest(np, i); in n2rng_control_check()
551 static int n2rng_control_configure_units(struct n2rng *np) in n2rng_control_configure_units() argument
556 for (unit = 0; unit < np->num_units; unit++) { in n2rng_control_configure_units()
557 struct n2rng_unit *up = &np->units[unit]; in n2rng_control_configure_units()
562 base = ((np->accum_cycles << RNG_CTL_WAIT_SHIFT) | in n2rng_control_configure_units()
579 err = n2rng_generic_write_control(np, ctl_ra, unit, in n2rng_control_configure_units()
590 struct n2rng *np = container_of(work, struct n2rng, work.work); in n2rng_work() local
593 if (!(np->flags & N2RNG_FLAG_CONTROL)) { in n2rng_work()
594 err = n2rng_guest_check(np); in n2rng_work()
597 err = n2rng_control_check(np); in n2rng_work()
601 err = n2rng_control_configure_units(np); in n2rng_work()
605 np->flags |= N2RNG_FLAG_READY; in n2rng_work()
606 dev_info(&np->op->dev, "RNG ready\n"); in n2rng_work()
609 if (err && !(np->flags & N2RNG_FLAG_SHUTDOWN)) in n2rng_work()
610 schedule_delayed_work(&np->work, HZ * 2); in n2rng_work()
627 struct n2rng *np; in n2rng_probe() local
635 np = devm_kzalloc(&op->dev, sizeof(*np), GFP_KERNEL); in n2rng_probe()
636 if (!np) in n2rng_probe()
638 np->op = op; in n2rng_probe()
640 INIT_DELAYED_WORK(&np->work, n2rng_work); in n2rng_probe()
643 np->flags |= N2RNG_FLAG_MULTI; in n2rng_probe()
646 np->hvapi_major = 2; in n2rng_probe()
648 np->hvapi_major, in n2rng_probe()
649 &np->hvapi_minor)) { in n2rng_probe()
650 np->hvapi_major = 1; in n2rng_probe()
652 np->hvapi_major, in n2rng_probe()
653 &np->hvapi_minor)) { in n2rng_probe()
660 if (np->flags & N2RNG_FLAG_MULTI) { in n2rng_probe()
661 if (np->hvapi_major < 2) { in n2rng_probe()
664 np->hvapi_major); in n2rng_probe()
667 np->num_units = of_getintprop_default(op->dev.of_node, in n2rng_probe()
669 if (!np->num_units) { in n2rng_probe()
674 np->num_units = 1; in n2rng_probe()
677 np->hvapi_major, np->hvapi_minor); in n2rng_probe()
679 np->units = devm_kzalloc(&op->dev, in n2rng_probe()
680 sizeof(struct n2rng_unit) * np->num_units, in n2rng_probe()
683 if (!np->units) in n2rng_probe()
686 err = n2rng_init_control(np); in n2rng_probe()
691 ((np->flags & N2RNG_FLAG_MULTI) ? in n2rng_probe()
693 np->num_units); in n2rng_probe()
695 np->hwrng.name = "n2rng"; in n2rng_probe()
696 np->hwrng.data_read = n2rng_data_read; in n2rng_probe()
697 np->hwrng.priv = (unsigned long) np; in n2rng_probe()
699 err = hwrng_register(&np->hwrng); in n2rng_probe()
703 platform_set_drvdata(op, np); in n2rng_probe()
705 schedule_delayed_work(&np->work, 0); in n2rng_probe()
718 struct n2rng *np = platform_get_drvdata(op); in n2rng_remove() local
720 np->flags |= N2RNG_FLAG_SHUTDOWN; in n2rng_remove()
722 cancel_delayed_work_sync(&np->work); in n2rng_remove()
724 hwrng_unregister(&np->hwrng); in n2rng_remove()