4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER START
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * The contents of this file are subject to the terms of the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Common Development and Distribution License (the "License").
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You may not use this file except in compliance with the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4496171313bed39e96f21bc2f9faf2868e267ae3girish * or http://www.opensolaris.org/os/licensing.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * See the License for the specific language governing permissions
4496171313bed39e96f21bc2f9faf2868e267ae3girish * and limitations under the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * When distributing Covered Code, include this CDDL HEADER in each
4496171313bed39e96f21bc2f9faf2868e267ae3girish * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * If applicable, add the following below this CDDL HEADER, with the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * fields enclosed by brackets "[]" replaced with your own identifying
4496171313bed39e96f21bc2f9faf2868e267ae3girish * information: Portions Copyright [yyyy] [name of copyright owner]
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER END
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifndef _SYS_N2RNG_H
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define _SYS_N2RNG_H
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/* skip following stuff when included in n2rng_hcall.s */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifndef _ASM
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/types.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/mutex.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/ksynch.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/sunddi.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/param.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/crypto/common.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/crypto/spi.h>
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#include <sys/mdesc.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* !_ASM */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifdef __cplusplus
4496171313bed39e96f21bc2f9faf2868e267ae3girishextern "C" {
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define HV_RNG_GET_DIAG_CONTROL 0x130
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define HV_RNG_CTL_READ 0x131
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define HV_RNG_CTL_WRITE 0x132
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define HV_RNG_DATA_READ_DIAG 0x133
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define HV_RNG_DATA_READ 0x134
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CTL_STATE_UNCONFIGURED 0
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CTL_STATE_CONFIGURED 1
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CTL_STATE_HEALTHCHECK 2
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CTL_STATE_ERROR 3
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define NRNGCTL 4
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_MAX_READ (128 * 1024) /* 128K bytes */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DRIVER "n2rng"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_MANUFACTURER_ID "SUNWn2rng"
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_BINDNAME_N2 "SUNW,n2-rng"
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_BINDNAME_VF "SUNW,vf-rng"
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define N2RNG_BINDNAME_KT "SUNW,kt-rng"
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_MAX_RNGS 4
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_INVALID_ID (-1)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifndef _ASM
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelketypedef enum {
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke N2RNG_CPU_UNKNOWN,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke N2RNG_CPU_N2,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu N2RNG_CPU_VF,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu N2RNG_CPU_KT
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke} n2rng_binding_t;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef union n2rngctl {
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t word;
4496171313bed39e96f21bc2f9faf2868e267ae3girish struct {
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_res : 39;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_cnt : 16;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_bypass : 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_vcoctl : 2;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_anlg_sel : 2;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_mode : 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t rnc_selbits : 3;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } fields;
4496171313bed39e96f21bc2f9faf2868e267ae3girish} n2rng_ctl_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct {
4496171313bed39e96f21bc2f9faf2868e267ae3girish n2rng_ctl_t ctlwds[NRNGCTL];
4496171313bed39e96f21bc2f9faf2868e267ae3girish} n2rng_setup_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#if defined(_KERNEL)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Our contiguous memory alignment requirement is
4496171313bed39e96f21bc2f9faf2868e267ae3girish * only for 8 bytes, however contig mem allocation
4496171313bed39e96f21bc2f9faf2868e267ae3girish * routines requirement minimum of 64.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CONTIG_ALIGNMENT 64
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Returns 1 only if the address range of a variable of type type at
4496171313bed39e96f21bc2f9faf2868e267ae3girish * ptr falls entirely on one page. Based on page size of 4K. May
4496171313bed39e96f21bc2f9faf2868e267ae3girish * give some false negatives on larger page sizes.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define CONTIGUOUS(ptr, type) \
4496171313bed39e96f21bc2f9faf2868e267ae3girish (((((uint64_t)(ptr)) ^ ((uint64_t)(ptr) + sizeof (type) -1)) \
4496171313bed39e96f21bc2f9faf2868e267ae3girish & PAGEMASK) == 0)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * The RNG hardware can send certain internal analog signals to an
4496171313bed39e96f21bc2f9faf2868e267ae3girish * external pin on the chip. Setting the rnc_anlg_sel bit to
4496171313bed39e96f21bc2f9faf2868e267ae3girish * N2RNG_NOANALOGOUT deselects all analog signals (perhaps selects
4496171313bed39e96f21bc2f9faf2868e267ae3girish * ground). Choosing any other value would aid an attacker with
4496171313bed39e96f21bc2f9faf2868e267ae3girish * physical access to the chip.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_NOANALOGOUT 0x2
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * There can only be N2_RNG_FIPS_INSTANCES concurrent RNG requsts from
4496171313bed39e96f21bc2f9faf2868e267ae3girish * the framework. Making this value large helps benchmarks. It
4496171313bed39e96f21bc2f9faf2868e267ae3girish * should probably come from a conf file, but for now it is hard
4496171313bed39e96f21bc2f9faf2868e267ae3girish * coded. The code computes i % N2RNG_FIPS_INSTANCES, which is more
4496171313bed39e96f21bc2f9faf2868e267ae3girish * efficient when N2RNG_FIPS_INSTANCES is a power of 2.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_FIPS_INSTANCES 8
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct fipsrandomstruct fipsrandomstruct_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girishstruct fipsrandomstruct {
4496171313bed39e96f21bc2f9faf2868e267ae3girish kmutex_t mtx;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t entropyhunger; /* RNGs generated with no entropy */
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint32_t XKEY[6]; /* one extra word for getentropy */
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita uint32_t x_jminus1[5]; /* store the last output */
4496171313bed39e96f21bc2f9faf2868e267ae3girish};
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct {
4496171313bed39e96f21bc2f9faf2868e267ae3girish /*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * volatile, since it is not protected by a mutex. (That is
4496171313bed39e96f21bc2f9faf2868e267ae3girish * okay since it is operated on and accessed via atomic ops.)
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish volatile unsigned int fips_round_robin_j;
4496171313bed39e96f21bc2f9faf2868e267ae3girish fipsrandomstruct_t fipsarray[N2RNG_FIPS_INSTANCES];
4496171313bed39e96f21bc2f9faf2868e267ae3girish} fips_ensemble_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke/*
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke * Device flags (n2rng_t.n_flags)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_CONTROL 0x00000001
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_FAILED 0x00000002
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_CONFIGURED 0x00000004
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_INITIALIZED 0x00000008
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_REGISTERED 0x00000010
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_setcontrol(n2rng) ((n2rng)->n_flags |= N2RNG_CONTROL)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_clrcontrol(n2rng) ((n2rng)->n_flags &= ~N2RNG_CONTROL)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_iscontrol(n2rng) ((n2rng)->n_flags & N2RNG_CONTROL)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_setfailed(n2rng) ((n2rng)->n_flags |= N2RNG_FAILED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_clrfailed(n2rng) ((n2rng)->n_flags &= ~N2RNG_FAILED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_isfailed(n2rng) ((n2rng)->n_flags & N2RNG_FAILED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_setconfigured(n2rng) ((n2rng)->n_flags |= N2RNG_CONFIGURED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_clrconfigured(n2rng) ((n2rng)->n_flags &= ~N2RNG_CONFIGURED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_isconfigured(n2rng) ((n2rng)->n_flags & N2RNG_CONFIGURED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_setinitialized(n2rng) ((n2rng)->n_flags |= N2RNG_INITIALIZED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_clrinitialized(n2rng) ((n2rng)->n_flags &= ~N2RNG_INITIALIZED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_isinitialized(n2rng) ((n2rng)->n_flags & N2RNG_INITIALIZED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_setregistered(n2rng) ((n2rng)->n_flags |= N2RNG_REGISTERED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_clrregistered(n2rng) ((n2rng)->n_flags &= ~N2RNG_REGISTERED)
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define n2rng_isregistered(n2rng) ((n2rng)->n_flags & N2RNG_REGISTERED)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DS_RNGBYTES 0
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DS_RNGJOBS 1
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DS_RNGHEALTHCHECKS 2
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DS_MAX 3
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_NOSC 3
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_BIASBITS 2
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_NBIASES (1 << N2RNG_BIASBITS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define N2RNG_CTLOPS (N2RNG_OSC + 1)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define N2RNG_PROP_NUM_UNITS "rng-#units"
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define SECOND 1000000 /* micro seconds */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct {
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t numvals;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t H1; /* in bits per bit << LOG_VAL_SCALE */
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t H2;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t Hinf;
4496171313bed39e96f21bc2f9faf2868e267ae3girish} n2rng_osc_perf_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef n2rng_osc_perf_t n2rng_osc_perf_table_t[N2RNG_NOSC][N2RNG_NBIASES];
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelketypedef struct {
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t bias;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t entropy;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke} n2rng_bias_info_t;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelketypedef struct {
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_bias_info_t n_bias_info[N2RNG_NOSC];
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_osc_perf_table_t n_perftable;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_setup_t n_preferred_config;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t n_rng_state; /* as last known in this drvr. */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke} rng_entry_t;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelketypedef struct {
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke int n_num_rngs;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke int n_num_rngs_online;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke rng_entry_t *n_rngs;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke clock_t n_hc_secs;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t n_watchdog_cycles;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t n_accumulate_cycles;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke} rng_ctl_data_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct n2rng {
4496171313bed39e96f21bc2f9faf2868e267ae3girish kmutex_t n_lock;
4496171313bed39e96f21bc2f9faf2868e267ae3girish dev_info_t *n_dip;
4496171313bed39e96f21bc2f9faf2868e267ae3girish unsigned n_flags; /* dev state flags */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint_t n_hvapi_major_version;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint_t n_hvapi_minor_version;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_binding_t n_binding;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke char *n_binding_name;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke rng_ctl_data_t *n_ctl_data; /* Only valid in ctl domain */
4496171313bed39e96f21bc2f9faf2868e267ae3girish kstat_t *n_ksp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t n_stats[DS_MAX];
4496171313bed39e96f21bc2f9faf2868e267ae3girish crypto_kcf_provider_handle_t n_prov;
4496171313bed39e96f21bc2f9faf2868e267ae3girish fips_ensemble_t n_frs;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke timeout_id_t n_timeout_id;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke md_t *n_mdp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t n_sticks_per_usec;
59ac0c1669407488b67ae9e273667a340dccc611davemq ddi_taskq_t *n_taskq;
4496171313bed39e96f21bc2f9faf2868e267ae3girish} n2rng_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
e3d6ebc24700cc84a56f7c08c0ec5fb9564a759bAn Buitypedef kstat_named_t n2rng_kstat_bias_t[N2RNG_MAX_RNGS][N2RNG_NOSC];
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishtypedef struct n2rng_stat n2rng_stat_t;
4496171313bed39e96f21bc2f9faf2868e267ae3girishstruct n2rng_stat {
4496171313bed39e96f21bc2f9faf2868e267ae3girish kstat_named_t ns_status;
4496171313bed39e96f21bc2f9faf2868e267ae3girish kstat_named_t ns_algs[DS_MAX];
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke kstat_named_t ns_rngstate[N2RNG_MAX_RNGS];
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_kstat_bias_t ns_rngbias;
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_kstat_bias_t ns_rngentropy;
4496171313bed39e96f21bc2f9faf2868e267ae3girish};
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_MODE_NORMAL 1
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_MODE_DIAGNOSTIC 0
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_DIAG_CHUNK_SIZE (N2RNG_MAX_READ / 8) /* as words */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define RNG_MAX_DATA_READ_ATTEMPTS 100
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_RETRY_HLCHK_USECS 100000 /* retry every .1 seconds */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_MAX_LOGIC_TEST_ATTEMPTS 3
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_MAX_BUSY_ATTEMPTS 100
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_MAX_BLOCK_ATTEMPTS 50000
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_RETRY_BUSY_DELAY 1
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_DEFAULT_ACCUMULATE_CYCLES 2048
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_CFG_RETRY_SECS 60 /* seconds between cfg retries */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_DEFAULT_HC_SECS 0 /* seconds between health checks */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define RNG_EXTRA_WATCHDOG_SECS 60 /* added to hc time for watchdog */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define LOG_ARG_SCALE 49
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define LOG_VAL_SCALE 32
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid n2rng_sort(uint64_t *data, int log2_size);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_noise_gen_preferred(n2rng_t *n2rng, int rngid);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_config_test(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_collect_diag_bits(n2rng_t *n2rng, int rngid,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_setup_t *collect_setupp, void *buffer, int numbytes,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke n2rng_setup_t *exit_setupp, uint64_t exitstate);
4496171313bed39e96f21bc2f9faf2868e267ae3girishint n2rng_getentropy(n2rng_t *n2rng, void *buffer, size_t size);
4496171313bed39e96f21bc2f9faf2868e267ae3girishint n2rng_fips_random_init(n2rng_t *n2rng, fipsrandomstruct_t *frsp);
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid n2rng_fips_random_fini(fipsrandomstruct_t *frsp);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_do_health_check(n2rng_t *n2rng, int rngid);
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid n2rng_renyi_entropy(uint64_t *buffer, int log2samples,
4496171313bed39e96f21bc2f9faf2868e267ae3girish n2rng_osc_perf_t *metricp);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t n2rng_read_ctl(n2rng_t *n2rng, int rngid, uint64_t ctlregs_pa,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t *state, uint64_t *tdelta, uint64_t *wdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t n2rng_ctl_wait(n2rng_t *n2rng, int rngid);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t n2rng_ctl_write(n2rng_t *n2rng, int rngid, uint64_t ctlregs_pa,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t newstate, uint64_t wtimeout, uint64_t *tdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t n2rng_data_read_diag(n2rng_t *n2rng, int rngid, uint64_t data_pa,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke size_t datalen, uint64_t *tdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t n2rng_check_ctl_access(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_config_retry(n2rng_t *n2rng, clock_t seconds);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#if defined(DEBUG)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DWARN 0x00000001
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DMA_ARGS 0x00000002
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DMA_LDST 0x00000004
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DNCS_QTAIL 0x00000008
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DATTACH 0x00000010
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define DCFG 0x00000020
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DMOD 0x00000040 /* _init/_fini/_info/attach/detach */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DENTRY 0x00000080 /* crypto routine entry/exit points */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define DHEALTH 0x00000100
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define DCHATTY 0x00000200
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke#define DKCF 0x00000400
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DALL 0xFFFFFFFF
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG0 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG1 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG2 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG3 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG4 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG5 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG6 n2rng_dprintf
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBGCALL(flag, func) { if (n2rng_dflagset(flag)) (void) func; }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid n2rng_dprintf(n2rng_t *, int, const char *, ...);
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid n2rng_dumphex(void *, int);
4496171313bed39e96f21bc2f9faf2868e267ae3girishint n2rng_dflagset(int);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#else /* !defined(DEBUG) */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG0(vca, lvl, fmt)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG1(vca, lvl, fmt, arg1)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG2(vca, lvl, fmt, arg1, arg2)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG3(vca, lvl, fmt, arg1, arg2, arg3)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG4(vca, lvl, fmt, arg1, arg2, arg3, arg4)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG5(vca, lvl, fmt, arg1, arg2, arg3, arg4, arg5)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBG6(vca, lvl, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define DBGCALL(flag, func)
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* !defined(DEBUG) */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke/*
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke * n2rng_kcf.c
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_herr2kerr(uint64_t);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_logic_test(n2rng_t *, int);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_noise_gen_test_set(void);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_init(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_uninit(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_register_provider(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeint n2rng_unregister_provider(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_failure(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_unconfigured(n2rng_t *n2rng);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * n2rng_debug.c
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_error(n2rng_t *, const char *, ...);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_diperror(dev_info_t *, const char *, ...);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkevoid n2rng_dipverror(dev_info_t *, const char *, va_list);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishuint64_t hv_rng_get_diag_control(void);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t hv_rng_ctl_read(uint64_t ctlregs_pa, uint64_t *state,
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t *tdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t hv_rng_ctl_read_v2(uint64_t ctlregs_pa, uint64_t rngid,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t *state, uint64_t *tdelta, uint64_t *wdelta, uint64_t *wstate);
4496171313bed39e96f21bc2f9faf2868e267ae3girishuint64_t hv_rng_ctl_write(uint64_t ctlregs_pa,
4496171313bed39e96f21bc2f9faf2868e267ae3girish uint64_t newstate, uint64_t wtimeout, uint64_t *tdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t hv_rng_ctl_write_v2(uint64_t ctlregs_pa,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke uint64_t newstate, uint64_t wtimeout, uint64_t rngid);
4496171313bed39e96f21bc2f9faf2868e267ae3girishuint64_t hv_rng_data_read_diag(uint64_t data_pa,
4496171313bed39e96f21bc2f9faf2868e267ae3girish size_t datalen, uint64_t *tdelta);
741c280d5486676df48cd5d5e8ed8d92eac714a8twelkeuint64_t hv_rng_data_read_diag_v2(uint64_t data_pa,
741c280d5486676df48cd5d5e8ed8d92eac714a8twelke size_t datalen, uint64_t rngid, uint64_t *tdelta);
4496171313bed39e96f21bc2f9faf2868e267ae3girishuint64_t hv_rng_data_read(uint64_t data_pa, uint64_t *tdelta);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita/*
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita * n2rng_post.c
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita */
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashitaint n2rng_fips_rng_post(void);
32e0ab73531b6e6e8957e9ecdbbd42603865f2d0Misaki Miyashita
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* _KERNEL */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* !_ASM */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifdef __cplusplus
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* _SYS_N2RNG_H */