*             device). It can be a total power: static and dynamic.
  * @cost:      The cost coefficient associated with this level, used during
  *             energy calculation. Equal to: power * max_frequency / frequency
+ * @flags:     see "em_perf_state flags" description below.
  */
 struct em_perf_state {
        unsigned long frequency;
        unsigned long power;
        unsigned long cost;
+       unsigned long flags;
 };
 
+/*
+ * em_perf_state flags:
+ *
+ * EM_PERF_STATE_INEFFICIENT: The performance state is inefficient. There is
+ * in this em_perf_domain, another performance state with a higher frequency
+ * but a lower or equal power cost. Such inefficient states are ignored when
+ * using em_pd_get_efficient_*() functions.
+ */
+#define EM_PERF_STATE_INEFFICIENT BIT(0)
+
 /**
  * struct em_perf_domain - Performance domain
  * @table:             List of performance states, in ascending order
 
 /*
  * Energy Model of devices
  *
- * Copyright (c) 2018-2020, Arm ltd.
+ * Copyright (c) 2018-2021, Arm ltd.
  * Written by: Quentin Perret, Arm ltd.
  * Improvements provided by: Lukasz Luba, Arm ltd.
  */
        debugfs_create_ulong("frequency", 0444, d, &ps->frequency);
        debugfs_create_ulong("power", 0444, d, &ps->power);
        debugfs_create_ulong("cost", 0444, d, &ps->cost);
+       debugfs_create_ulong("inefficient", 0444, d, &ps->flags);
 }
 
 static int em_debug_cpus_show(struct seq_file *s, void *unused)
                table[i].cost = div64_u64(fmax * power_res,
                                          table[i].frequency);
                if (table[i].cost >= prev_cost) {
+                       table[i].flags = EM_PERF_STATE_INEFFICIENT;
                        dev_dbg(dev, "EM: OPP:%lu is inefficient\n",
                                table[i].frequency);
                } else {