n2rng.h revision 24f146696184cbe4b440179064a45dfddaad4cc4
1/* n2rng.h: Niagara2 RNG defines. 2 * 3 * Copyright (C) 2008 David S. Miller <davem@davemloft.net> 4 */ 5 6#ifndef _N2RNG_H 7#define _N2RNG_H 8 9#define RNG_CTL_WAIT 0x0000000001fffe00ULL /* Minimum wait time */ 10#define RNG_CTL_WAIT_SHIFT 9 11#define RNG_CTL_BYPASS 0x0000000000000100ULL /* VCO voltage source */ 12#define RNG_CTL_VCO 0x00000000000000c0ULL /* VCO rate control */ 13#define RNG_CTL_VCO_SHIFT 6 14#define RNG_CTL_ASEL 0x0000000000000030ULL /* Analog MUX select */ 15#define RNG_CTL_ASEL_SHIFT 4 16#define RNG_CTL_LFSR 0x0000000000000008ULL /* Use LFSR or plain shift */ 17#define RNG_CTL_ES3 0x0000000000000004ULL /* Enable entropy source 3 */ 18#define RNG_CTL_ES2 0x0000000000000002ULL /* Enable entropy source 2 */ 19#define RNG_CTL_ES1 0x0000000000000001ULL /* Enable entropy source 1 */ 20 21#define HV_FAST_RNG_GET_DIAG_CTL 0x130 22#define HV_FAST_RNG_CTL_READ 0x131 23#define HV_FAST_RNG_CTL_WRITE 0x132 24#define HV_FAST_RNG_DATA_READ_DIAG 0x133 25#define HV_FAST_RNG_DATA_READ 0x134 26 27#define HV_RNG_STATE_UNCONFIGURED 0 28#define HV_RNG_STATE_CONFIGURED 1 29#define HV_RNG_STATE_HEALTHCHECK 2 30#define HV_RNG_STATE_ERROR 3 31 32#define HV_RNG_NUM_CONTROL 4 33 34#ifndef __ASSEMBLY__ 35extern unsigned long sun4v_rng_get_diag_ctl(void); 36extern unsigned long sun4v_rng_ctl_read_v1(unsigned long ctl_regs_ra, 37 unsigned long *state, 38 unsigned long *tick_delta); 39extern unsigned long sun4v_rng_ctl_read_v2(unsigned long ctl_regs_ra, 40 unsigned long unit, 41 unsigned long *state, 42 unsigned long *tick_delta, 43 unsigned long *watchdog, 44 unsigned long *write_status); 45extern unsigned long sun4v_rng_ctl_write_v1(unsigned long ctl_regs_ra, 46 unsigned long state, 47 unsigned long write_timeout, 48 unsigned long *tick_delta); 49extern unsigned long sun4v_rng_ctl_write_v2(unsigned long ctl_regs_ra, 50 unsigned long state, 51 unsigned long write_timeout, 52 unsigned long unit); 53extern unsigned long sun4v_rng_data_read_diag_v1(unsigned long data_ra, 54 unsigned long len, 55 unsigned long *tick_delta); 56extern unsigned long sun4v_rng_data_read_diag_v2(unsigned long data_ra, 57 unsigned long len, 58 unsigned long unit, 59 unsigned long *tick_delta); 60extern unsigned long sun4v_rng_data_read(unsigned long data_ra, 61 unsigned long *tick_delta); 62 63struct n2rng_unit { 64 u64 control[HV_RNG_NUM_CONTROL]; 65}; 66 67struct n2rng { 68 struct platform_device *op; 69 70 unsigned long flags; 71#define N2RNG_FLAG_MULTI 0x00000001 /* Multi-unit capable RNG */ 72#define N2RNG_FLAG_CONTROL 0x00000002 /* Operating in control domain */ 73#define N2RNG_FLAG_READY 0x00000008 /* Ready for hw-rng layer */ 74#define N2RNG_FLAG_SHUTDOWN 0x00000010 /* Driver unregistering */ 75#define N2RNG_FLAG_BUFFER_VALID 0x00000020 /* u32 buffer holds valid data */ 76 77 int num_units; 78 struct n2rng_unit *units; 79 80 struct hwrng hwrng; 81 u32 buffer; 82 83 /* Registered hypervisor group API major and minor version. */ 84 unsigned long hvapi_major; 85 unsigned long hvapi_minor; 86 87 struct delayed_work work; 88 89 unsigned long hv_state; /* HV_RNG_STATE_foo */ 90 91 unsigned long health_check_sec; 92 unsigned long accum_cycles; 93 unsigned long wd_timeo; 94#define N2RNG_HEALTH_CHECK_SEC_DEFAULT 0 95#define N2RNG_ACCUM_CYCLES_DEFAULT 2048 96#define N2RNG_WD_TIMEO_DEFAULT 0 97 98 u64 scratch_control[HV_RNG_NUM_CONTROL]; 99 100#define SELFTEST_TICKS 38859 101#define SELFTEST_VAL ((u64)0xB8820C7BD387E32C) 102#define SELFTEST_POLY ((u64)0x231DCEE91262B8A3) 103#define SELFTEST_MATCH_GOAL 6 104#define SELFTEST_LOOPS_MAX 40000 105#define SELFTEST_BUFFER_WORDS 8 106 107 u64 test_data; 108 u64 test_control[HV_RNG_NUM_CONTROL]; 109 u64 test_buffer[SELFTEST_BUFFER_WORDS]; 110}; 111 112#define N2RNG_BLOCK_LIMIT 60000 113#define N2RNG_BUSY_LIMIT 100 114#define N2RNG_HCHECK_LIMIT 100 115 116#endif /* !(__ASSEMBLY__) */ 117 118#endif /* _N2RNG_H */ 119