mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 14:44:10 +08:00
via-rng: enable secondary noise source on CPUs where it is present
In the padlock spec: "SRC Bits[9:8] Noise source select (I): These bits control the two noise sources on the processor that input bits to the accumulation buffers. On Nehemiah processors prior to stepping 8, these bits are reserved and undefined. The default RESET state is both bits = 0." Signed-off-by: Dave Jones <davej@redhat.com> Tested-by: Udo van den Heuvel <udovdh@xs4all.nl> Cc: Michael Buesch <mb@bu3sch.de> Cc: folkert van Heusden <folkert@vanheusden.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ece95912db
commit
11025e8552
@ -42,6 +42,8 @@ enum {
|
||||
VIA_STRFILT_ENABLE = (1 << 14),
|
||||
VIA_RAWBITS_ENABLE = (1 << 13),
|
||||
VIA_RNG_ENABLE = (1 << 6),
|
||||
VIA_NOISESRC1 = (1 << 8),
|
||||
VIA_NOISESRC2 = (1 << 9),
|
||||
VIA_XSTORE_CNT_MASK = 0x0F,
|
||||
|
||||
VIA_RNG_CHUNK_8 = 0x00, /* 64 rand bits, 64 stored bits */
|
||||
@ -119,6 +121,7 @@ static int via_rng_data_read(struct hwrng *rng, u32 *data)
|
||||
|
||||
static int via_rng_init(struct hwrng *rng)
|
||||
{
|
||||
struct cpuinfo_x86 *c = &cpu_data(0);
|
||||
u32 lo, hi, old_lo;
|
||||
|
||||
/* Control the RNG via MSR. Tread lightly and pay very close
|
||||
@ -134,6 +137,17 @@ static int via_rng_init(struct hwrng *rng)
|
||||
lo &= ~VIA_XSTORE_CNT_MASK;
|
||||
lo &= ~(VIA_STRFILT_ENABLE | VIA_STRFILT_FAIL | VIA_RAWBITS_ENABLE);
|
||||
lo |= VIA_RNG_ENABLE;
|
||||
lo |= VIA_NOISESRC1;
|
||||
|
||||
/* Enable secondary noise source on CPUs where it is present. */
|
||||
|
||||
/* Nehemiah stepping 8 and higher */
|
||||
if ((c->x86_model == 9) && (c->x86_mask > 7))
|
||||
lo |= VIA_NOISESRC2;
|
||||
|
||||
/* Esther */
|
||||
if (c->x86_model >= 10)
|
||||
lo |= VIA_NOISESRC2;
|
||||
|
||||
if (lo != old_lo)
|
||||
wrmsr(MSR_VIA_RNG, lo, hi);
|
||||
|
Loading…
Reference in New Issue
Block a user