coretemp: use x86_msr_op for thermal MSR access

Reviewed by:	markj
Discussed with:	mav
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D31386
This commit is contained in:
Konstantin Belousov 2021-08-02 22:53:08 +03:00
parent d0bc4b4666
commit 4cc6fe1e5b

View File

@ -315,56 +315,31 @@ struct coretemp_args {
uint64_t val;
};
static void
coretemp_rdmsr(void *arg)
{
struct coretemp_args *args = arg;
args->val = rdmsr(args->msr);
}
static void
coretemp_wrmsr(void *arg)
{
struct coretemp_args *args = arg;
wrmsr(args->msr, args->val);
}
/*
* The digital temperature reading is located at bit 16
* of MSR_THERM_STATUS.
*
* There is a bit on that MSR that indicates whether the
* temperature is valid or not.
*
* The temperature is computed by subtracting the temperature
* reading by Tj(max).
*/
static uint64_t
coretemp_get_thermal_msr(int cpu)
{
struct coretemp_args args;
cpuset_t cpus;
uint64_t res;
/*
* The digital temperature reading is located at bit 16
* of MSR_THERM_STATUS.
*
* There is a bit on that MSR that indicates whether the
* temperature is valid or not.
*
* The temperature is computed by subtracting the temperature
* reading by Tj(max).
*/
args.msr = MSR_THERM_STATUS;
CPU_SETOF(cpu, &cpus);
smp_rendezvous_cpus(cpus, smp_no_rendezvous_barrier, coretemp_rdmsr,
smp_no_rendezvous_barrier, &args);
return (args.val);
x86_msr_op(MSR_THERM_STATUS, MSR_OP_RENDEZVOUS_ONE | MSR_OP_READ |
MSR_OP_CPUID(cpu), 0, &res);
return (res);
}
static void
coretemp_clear_thermal_msr(int cpu)
{
struct coretemp_args args;
cpuset_t cpus;
args.msr = MSR_THERM_STATUS;
args.val = 0;
CPU_SETOF(cpu, &cpus);
smp_rendezvous_cpus(cpus, smp_no_rendezvous_barrier, coretemp_wrmsr,
smp_no_rendezvous_barrier, &args);
x86_msr_op(MSR_THERM_STATUS, MSR_OP_RENDEZVOUS_ONE | MSR_OP_WRITE |
MSR_OP_CPUID(cpu), 0, NULL);
}
static int