[PATCH 23/32] hw_random/via-rng: Stop using 32-bit MSR interfaces

From: Juergen Gross

Date: Mon Jun 29 2026 - 02:10:19 EST


The 32-bit MSR interfaces rdmsr() and wrmsr() are planned to be
removed. Use the related 64-bit variants instead.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
drivers/char/hw_random/via-rng.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c
index a9a0a3b09c8b..b718e78d3c1c 100644
--- a/drivers/char/hw_random/via-rng.c
+++ b/drivers/char/hw_random/via-rng.c
@@ -129,7 +129,8 @@ 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;
+ u32 old_lo;
+ struct msr val;

/* VIA Nano CPUs don't have the MSR_VIA_RNG anymore. The RNG
* is always enabled if CPUID rng_en is set. There is no
@@ -150,32 +151,32 @@ static int via_rng_init(struct hwrng *rng)
* does not say to write them as zero, so I make a guess that
* we restore the values we find in the register.
*/
- rdmsr(MSR_VIA_RNG, lo, hi);
+ rdmsrq(MSR_VIA_RNG, val.q);

- old_lo = lo;
- lo &= ~(0x7f << VIA_STRFILT_CNT_SHIFT);
- lo &= ~VIA_XSTORE_CNT_MASK;
- lo &= ~(VIA_STRFILT_ENABLE | VIA_STRFILT_FAIL | VIA_RAWBITS_ENABLE);
- lo |= VIA_RNG_ENABLE;
- lo |= VIA_NOISESRC1;
+ old_lo = val.l;
+ val.l &= ~(0x7f << VIA_STRFILT_CNT_SHIFT);
+ val.l &= ~VIA_XSTORE_CNT_MASK;
+ val.l &= ~(VIA_STRFILT_ENABLE | VIA_STRFILT_FAIL | VIA_RAWBITS_ENABLE);
+ val.l |= VIA_RNG_ENABLE;
+ val.l |= VIA_NOISESRC1;

/* Enable secondary noise source on CPUs where it is present. */

/* Nehemiah stepping 8 and higher */
if ((c->x86_model == 9) && (c->x86_stepping > 7))
- lo |= VIA_NOISESRC2;
+ val.l |= VIA_NOISESRC2;

/* Esther */
if (c->x86_model >= 10)
- lo |= VIA_NOISESRC2;
+ val.l |= VIA_NOISESRC2;

- if (lo != old_lo)
- wrmsr(MSR_VIA_RNG, lo, hi);
+ if (val.l != old_lo)
+ wrmsrq(MSR_VIA_RNG, val.q);

/* perhaps-unnecessary sanity check; remove after testing if
unneeded */
- rdmsr(MSR_VIA_RNG, lo, hi);
- if ((lo & VIA_RNG_ENABLE) == 0) {
+ rdmsrq(MSR_VIA_RNG, val.q);
+ if ((val.l & VIA_RNG_ENABLE) == 0) {
pr_err(PFX "cannot enable VIA C3 RNG, aborting\n");
return -ENODEV;
}
--
2.54.0