*
  *  EM_PERF_DOMAIN_MILLIWATTS: The power values are in milli-Watts or some
  *  other scale.
+ *
+ *  EM_PERF_DOMAIN_SKIP_INEFFICIENCIES: Skip inefficient states when estimating
+ *  energy consumption.
  */
 #define EM_PERF_DOMAIN_MILLIWATTS BIT(0)
+#define EM_PERF_DOMAIN_SKIP_INEFFICIENCIES BIT(1)
 
 #define em_span_cpus(em) (to_cpumask((em)->cpus))
 
                                bool milliwatts);
 void em_dev_unregister_perf_domain(struct device *dev);
 
+/**
+ * em_pd_get_efficient_state() - Get an efficient performance state from the EM
+ * @pd   : Performance domain for which we want an efficient frequency
+ * @freq : Frequency to map with the EM
+ *
+ * It is called from the scheduler code quite frequently and as a consequence
+ * doesn't implement any check.
+ *
+ * Return: An efficient performance state, high enough to meet @freq
+ * requirement.
+ */
+static inline
+struct em_perf_state *em_pd_get_efficient_state(struct em_perf_domain *pd,
+                                               unsigned long freq)
+{
+       struct em_perf_state *ps;
+       int i;
+
+       for (i = 0; i < pd->nr_perf_states; i++) {
+               ps = &pd->table[i];
+               if (ps->frequency >= freq) {
+                       if (pd->flags & EM_PERF_DOMAIN_SKIP_INEFFICIENCIES &&
+                           ps->flags & EM_PERF_STATE_INEFFICIENT)
+                               continue;
+                       break;
+               }
+       }
+
+       return ps;
+}
+
 /**
  * em_cpu_energy() - Estimates the energy consumed by the CPUs of a
  *             performance domain
 {
        unsigned long freq, scale_cpu;
        struct em_perf_state *ps;
-       int i, cpu;
+       int cpu;
 
        if (!sum_util)
                return 0;
         * Find the lowest performance state of the Energy Model above the
         * requested frequency.
         */
-       for (i = 0; i < pd->nr_perf_states; i++) {
-               ps = &pd->table[i];
-               if (ps->frequency >= freq)
-                       break;
-       }
+       ps = em_pd_get_efficient_state(pd, freq);
 
        /*
         * The capacity of a CPU in the domain at the performance state (ps)
 
 }
 DEFINE_SHOW_ATTRIBUTE(em_debug_units);
 
+static int em_debug_skip_inefficiencies_show(struct seq_file *s, void *unused)
+{
+       struct em_perf_domain *pd = s->private;
+       int enabled = (pd->flags & EM_PERF_DOMAIN_SKIP_INEFFICIENCIES) ? 1 : 0;
+
+       seq_printf(s, "%d\n", enabled);
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(em_debug_skip_inefficiencies);
+
 static void em_debug_create_pd(struct device *dev)
 {
        struct dentry *d;
                                    &em_debug_cpus_fops);
 
        debugfs_create_file("units", 0444, d, dev->em_pd, &em_debug_units_fops);
+       debugfs_create_file("skip-inefficiencies", 0444, d, dev->em_pd,
+                           &em_debug_skip_inefficiencies_fops);
 
        /* Create a sub-directory for each performance state */
        for (i = 0; i < dev->em_pd->nr_perf_states; i++)