static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
                                int nr_states, struct em_data_callback *cb)
 {
-       unsigned long opp_eff, prev_opp_eff = ULONG_MAX;
-       unsigned long power, freq, prev_freq = 0;
+       unsigned long power, freq, prev_freq = 0, prev_cost = ULONG_MAX;
        struct em_perf_state *table;
        int i, ret;
        u64 fmax;
 
                table[i].power = power;
                table[i].frequency = prev_freq = freq;
-
-               /*
-                * The hertz/watts efficiency ratio should decrease as the
-                * frequency grows on sane platforms. But this isn't always
-                * true in practice so warn the user if a higher OPP is more
-                * power efficient than a lower one.
-                */
-               opp_eff = freq / power;
-               if (opp_eff >= prev_opp_eff)
-                       dev_dbg(dev, "EM: hertz/watts ratio non-monotonically decreasing: em_perf_state %d >= em_perf_state%d\n",
-                                       i, i - 1);
-               prev_opp_eff = opp_eff;
        }
 
        /* Compute the cost of each performance state. */
        fmax = (u64) table[nr_states - 1].frequency;
-       for (i = 0; i < nr_states; i++) {
+       for (i = nr_states - 1; i >= 0; i--) {
                unsigned long power_res = em_scale_power(table[i].power);
 
                table[i].cost = div64_u64(fmax * power_res,
                                          table[i].frequency);
+               if (table[i].cost >= prev_cost) {
+                       dev_dbg(dev, "EM: OPP:%lu is inefficient\n",
+                               table[i].frequency);
+               } else {
+                       prev_cost = table[i].cost;
+               }
        }
 
        pd->table = table;