@@ -114,6 +114,8 @@ struct amd_hfi_cpuinfo {
static DEFINE_PER_CPU(struct amd_hfi_cpuinfo, amd_hfi_cpuinfo) = {.class_index = -1};
+static DEFINE_MUTEX(hfi_cpuinfo_lock);
+
static int find_cpu_index_by_apicid(unsigned int target_apicid)
{
int cpu_index;
@@ -234,6 +236,31 @@ static void amd_hfi_remove(struct platform_device *pdev)
mutex_destroy(&dev->lock);
}
+static int amd_set_hfi_ipcc_score(struct amd_hfi_cpuinfo *hfi_cpuinfo, int cpu)
+{
+ for (int i = 0; i < hfi_cpuinfo->nr_class; i++)
+ WRITE_ONCE(hfi_cpuinfo->ipcc_scores[i],
+ hfi_cpuinfo->amd_hfi_classes[i].perf);
+
+ return 0;
+}
+
+static int update_hfi_ipcc_scores(void)
+{
+ int cpu;
+ int ret;
+
+ for_each_present_cpu(cpu) {
+ struct amd_hfi_cpuinfo *hfi_cpuinfo = per_cpu_ptr(&amd_hfi_cpuinfo, cpu);
+
+ ret = amd_set_hfi_ipcc_score(hfi_cpuinfo, cpu);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static int amd_hfi_metadata_parser(struct platform_device *pdev,
struct amd_hfi_data *amd_hfi_data)
{
@@ -317,6 +344,10 @@ static int amd_hfi_probe(struct platform_device *pdev)
if (ret)
return ret;
+ ret = update_hfi_ipcc_scores();
+ if (ret)
+ return ret;
+
return 0;
}