mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1002 B
49 lines
1002 B
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* cppc_msr.c: MSR Interface for CPPC |
|
* Copyright (c) 2016, Intel Corporation. |
|
*/ |
|
|
|
#include <acpi/cppc_acpi.h> |
|
#include <asm/msr.h> |
|
|
|
/* Refer to drivers/acpi/cppc_acpi.c for the description of functions */ |
|
|
|
bool cpc_ffh_supported(void) |
|
{ |
|
return true; |
|
} |
|
|
|
int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val) |
|
{ |
|
int err; |
|
|
|
err = rdmsrl_safe_on_cpu(cpunum, reg->address, val); |
|
if (!err) { |
|
u64 mask = GENMASK_ULL(reg->bit_offset + reg->bit_width - 1, |
|
reg->bit_offset); |
|
|
|
*val &= mask; |
|
*val >>= reg->bit_offset; |
|
} |
|
return err; |
|
} |
|
|
|
int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val) |
|
{ |
|
u64 rd_val; |
|
int err; |
|
|
|
err = rdmsrl_safe_on_cpu(cpunum, reg->address, &rd_val); |
|
if (!err) { |
|
u64 mask = GENMASK_ULL(reg->bit_offset + reg->bit_width - 1, |
|
reg->bit_offset); |
|
|
|
val <<= reg->bit_offset; |
|
val &= mask; |
|
rd_val &= ~mask; |
|
rd_val |= val; |
|
err = wrmsrl_safe_on_cpu(cpunum, reg->address, rd_val); |
|
} |
|
return err; |
|
}
|
|
|