static void amd_set_max_freq_ratio(void)
 {
        struct cppc_perf_caps perf_caps;
-       u64 highest_perf, nominal_perf;
+       u64 numerator, nominal_perf;
        u64 perf_ratio;
        int rc;
 
                return;
        }
 
-       highest_perf = amd_get_highest_perf();
+       rc = amd_get_boost_ratio_numerator(0, &numerator);
+       if (rc) {
+               pr_debug("Could not retrieve highest performance (%d)\n", rc);
+               return;
+       }
        nominal_perf = perf_caps.nominal_perf;
 
-       if (!highest_perf || !nominal_perf) {
-               pr_debug("Could not retrieve highest or nominal performance\n");
+       if (!nominal_perf) {
+               pr_debug("Could not retrieve nominal performance\n");
                return;
        }
 
-       perf_ratio = div_u64(highest_perf * SCHED_CAPACITY_SCALE, nominal_perf);
+       perf_ratio = div_u64(numerator * SCHED_CAPACITY_SCALE, nominal_perf);
        /* midpoint between max_boost and max_P */
        perf_ratio = (perf_ratio + SCHED_CAPACITY_SCALE) >> 1;
        if (!perf_ratio) {
        mutex_unlock(&freq_invariance_lock);
 }
 
-u32 amd_get_highest_perf(void)
+/**
+ * amd_get_boost_ratio_numerator: Get the numerator to use for boost ratio calculation
+ * @cpu: CPU to get numerator for.
+ * @numerator: Output variable for numerator.
+ *
+ * Determine the numerator to use for calculating the boost ratio on
+ * a CPU. On systems that support preferred cores, this will be a hardcoded
+ * value. On other systems this will the highest performance register value.
+ *
+ * Return: 0 for success, negative error code otherwise.
+ */
+int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator)
 {
        struct cpuinfo_x86 *c = &boot_cpu_data;
 
        if (c->x86 == 0x17 && ((c->x86_model >= 0x30 && c->x86_model < 0x40) ||
-                              (c->x86_model >= 0x70 && c->x86_model < 0x80)))
-               return 166;
+                              (c->x86_model >= 0x70 && c->x86_model < 0x80))) {
+               *numerator = 166;
+               return 0;
+       }
 
        if (c->x86 == 0x19 && ((c->x86_model >= 0x20 && c->x86_model < 0x30) ||
-                              (c->x86_model >= 0x40 && c->x86_model < 0x70)))
-               return 166;
+                              (c->x86_model >= 0x40 && c->x86_model < 0x70))) {
+               *numerator = 166;
+               return 0;
+       }
+       *numerator = 255;
 
-       return 255;
+       return 0;
 }
-EXPORT_SYMBOL_GPL(amd_get_highest_perf);
+EXPORT_SYMBOL_GPL(amd_get_boost_ratio_numerator);
 
                return 0;
        }
 
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
-               highest_perf = amd_get_highest_perf();
-       else
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
+               ret = amd_get_boost_ratio_numerator(cpu, &highest_perf);
+               if (ret) {
+                       pr_debug("CPU%d: Unable to get boost ratio numerator (%d)\n",
+                                cpu, ret);
+                       return 0;
+               }
+       } else {
                highest_perf = perf_caps.highest_perf;
+       }
 
        nominal_perf = perf_caps.nominal_perf;
 
 
 extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable);
 extern int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps);
 extern int cppc_set_auto_sel(int cpu, bool enable);
+extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator);
 #else /* !CONFIG_ACPI_CPPC_LIB */
 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf)
 {
 {
        return -EOPNOTSUPP;
 }
+static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator)
+{
+       return -EOPNOTSUPP;
+}
 #endif /* !CONFIG_ACPI_CPPC_LIB */
 
 #endif /* _CPPC_ACPI_H*/