void dc_allow_idle_optimizations(struct dc *dc, bool allow)
 {
-       if (dc->debug.disable_idle_power_optimizations)
+       if (dc->debug.disable_idle_power_optimizations ||
+               (dc->caps.ips_support && dc->config.disable_ips))
                return;
 
        if (dc->clk_mgr != NULL && dc->clk_mgr->funcs->is_smu_present)
                dc->idle_optimizations_allowed = allow;
 }
 
+bool dc_is_idle_power_optimized(struct dc *dc)
+{
+       uint32_t idle_state = 0;
+
+       if (dc->debug.disable_idle_power_optimizations)
+               return false;
+
+       if (dc->hwss.get_idle_state)
+               idle_state = dc->hwss.get_idle_state(dc);
+
+       if ((idle_state & DMUB_IPS1_ALLOW_MASK) ||
+               (idle_state & DMUB_IPS2_ALLOW_MASK))
+               return true;
+
+       return false;
+}
+
 /* set min and max memory clock to lowest and highest DPM level, respectively */
 void dc_unlock_memory_clock_frequency(struct dc *dc)
 {
 
                                struct dc_cursor_attributes *cursor_attr);
 
 void dc_allow_idle_optimizations(struct dc *dc, bool allow);
+bool dc_is_idle_power_optimized(struct dc *dc);
 
 /* set min and max memory clock to lowest and highest DPM level, respectively */
 void dc_unlock_memory_clock_frequency(struct dc *dc);