| From 33364855547e80e132ca4fbf61a48daa3c078434 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 2 Jan 2024 20:14:56 -0800 |
| Subject: thermal: intel: hfi: Refactor enabling code into helper functions |
| |
| From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> |
| |
| [ Upstream commit 8a8b6bb93c704776c4b05cb517c3fa8baffb72f5 ] |
| |
| In preparation for the addition of a suspend notifier, wrap the logic to |
| enable HFI and program its memory buffer into helper functions. Both the |
| CPU hotplug callback and the suspend notifier will use them. |
| |
| This refactoring does not introduce functional changes. |
| |
| Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Stable-dep-of: 97566d09fd02 ("thermal: intel: hfi: Add syscore callbacks for system-wide PM") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/thermal/intel/intel_hfi.c | 43 ++++++++++++++++--------------- |
| 1 file changed, 22 insertions(+), 21 deletions(-) |
| |
| diff --git a/drivers/thermal/intel/intel_hfi.c b/drivers/thermal/intel/intel_hfi.c |
| index a0640f762dc5..1a014595ed49 100644 |
| --- a/drivers/thermal/intel/intel_hfi.c |
| +++ b/drivers/thermal/intel/intel_hfi.c |
| @@ -338,6 +338,26 @@ static void init_hfi_instance(struct hfi_instance *hfi_instance) |
| hfi_instance->data = hfi_instance->hdr + hfi_features.hdr_size; |
| } |
| |
| +/* Caller must hold hfi_instance_lock. */ |
| +static void hfi_enable(void) |
| +{ |
| + u64 msr_val; |
| + |
| + rdmsrl(MSR_IA32_HW_FEEDBACK_CONFIG, msr_val); |
| + msr_val |= HW_FEEDBACK_CONFIG_HFI_ENABLE_BIT; |
| + wrmsrl(MSR_IA32_HW_FEEDBACK_CONFIG, msr_val); |
| +} |
| + |
| +static void hfi_set_hw_table(struct hfi_instance *hfi_instance) |
| +{ |
| + phys_addr_t hw_table_pa; |
| + u64 msr_val; |
| + |
| + hw_table_pa = virt_to_phys(hfi_instance->hw_table); |
| + msr_val = hw_table_pa | HW_FEEDBACK_PTR_VALID_BIT; |
| + wrmsrl(MSR_IA32_HW_FEEDBACK_PTR, msr_val); |
| +} |
| + |
| /** |
| * intel_hfi_online() - Enable HFI on @cpu |
| * @cpu: CPU in which the HFI will be enabled |
| @@ -355,8 +375,6 @@ void intel_hfi_online(unsigned int cpu) |
| { |
| struct hfi_instance *hfi_instance; |
| struct hfi_cpu_info *info; |
| - phys_addr_t hw_table_pa; |
| - u64 msr_val; |
| u16 die_id; |
| |
| /* Nothing to do if hfi_instances are missing. */ |
| @@ -400,8 +418,6 @@ void intel_hfi_online(unsigned int cpu) |
| if (!hfi_instance->hw_table) |
| goto unlock; |
| |
| - hw_table_pa = virt_to_phys(hfi_instance->hw_table); |
| - |
| /* |
| * Allocate memory to keep a local copy of the table that |
| * hardware generates. |
| @@ -411,16 +427,6 @@ void intel_hfi_online(unsigned int cpu) |
| if (!hfi_instance->local_table) |
| goto free_hw_table; |
| |
| - /* |
| - * Program the address of the feedback table of this die/package. On |
| - * some processors, hardware remembers the old address of the HFI table |
| - * even after having been reprogrammed and re-enabled. Thus, do not free |
| - * the pages allocated for the table or reprogram the hardware with a |
| - * new base address. Namely, program the hardware only once. |
| - */ |
| - msr_val = hw_table_pa | HW_FEEDBACK_PTR_VALID_BIT; |
| - wrmsrl(MSR_IA32_HW_FEEDBACK_PTR, msr_val); |
| - |
| init_hfi_instance(hfi_instance); |
| |
| INIT_DELAYED_WORK(&hfi_instance->update_work, hfi_update_work_fn); |
| @@ -429,13 +435,8 @@ void intel_hfi_online(unsigned int cpu) |
| |
| cpumask_set_cpu(cpu, hfi_instance->cpus); |
| |
| - /* |
| - * Enable the hardware feedback interface and never disable it. See |
| - * comment on programming the address of the table. |
| - */ |
| - rdmsrl(MSR_IA32_HW_FEEDBACK_CONFIG, msr_val); |
| - msr_val |= HW_FEEDBACK_CONFIG_HFI_ENABLE_BIT; |
| - wrmsrl(MSR_IA32_HW_FEEDBACK_CONFIG, msr_val); |
| + hfi_set_hw_table(hfi_instance); |
| + hfi_enable(); |
| |
| unlock: |
| mutex_unlock(&hfi_instance_lock); |
| -- |
| 2.43.0 |
| |