Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only 2 : : /* 3 : : * cppc_msr.c: MSR Interface for CPPC 4 : : * Copyright (c) 2016, Intel Corporation. 5 : : */ 6 : : 7 : : #include <acpi/cppc_acpi.h> 8 : : #include <asm/msr.h> 9 : : 10 : : /* Refer to drivers/acpi/cppc_acpi.c for the description of functions */ 11 : : 12 : 0 : bool cpc_ffh_supported(void) 13 : : { 14 : 0 : return true; 15 : : } 16 : : 17 : 0 : int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val) 18 : : { 19 : 0 : int err; 20 : : 21 : 0 : err = rdmsrl_safe_on_cpu(cpunum, reg->address, val); 22 [ # # ]: 0 : if (!err) { 23 : 0 : u64 mask = GENMASK_ULL(reg->bit_offset + reg->bit_width - 1, 24 : : reg->bit_offset); 25 : : 26 : 0 : *val &= mask; 27 : 0 : *val >>= reg->bit_offset; 28 : : } 29 : 0 : return err; 30 : : } 31 : : 32 : 0 : int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val) 33 : : { 34 : 0 : u64 rd_val; 35 : 0 : int err; 36 : : 37 : 0 : err = rdmsrl_safe_on_cpu(cpunum, reg->address, &rd_val); 38 [ # # ]: 0 : if (!err) { 39 : 0 : u64 mask = GENMASK_ULL(reg->bit_offset + reg->bit_width - 1, 40 : : reg->bit_offset); 41 : : 42 : 0 : val <<= reg->bit_offset; 43 : 0 : val &= mask; 44 : 0 : rd_val &= ~mask; 45 : 0 : rd_val |= val; 46 : 0 : err = wrmsrl_safe_on_cpu(cpunum, reg->address, rd_val); 47 : : } 48 : 0 : return err; 49 : : }