#include "clk/clk_10_0_2_sh_mask.h"
 #include "renoir_ip_offset.h"
 
+#include "irq/dcn21/irq_service_dcn21.h"
 
 /* Constants */
 
        struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk;
        struct dc *dc = clk_mgr_base->ctx->dc;
        int display_count;
+       int irq_src;
        bool update_dppclk = false;
        bool update_dispclk = false;
        bool dpp_clock_lowered = false;
+       uint32_t hpd_state;
 
        struct dmcu *dmcu = clk_mgr_base->ctx->dc->res_pool->dmcu;
 
                if (clk_mgr_base->clks.pwr_state != DCN_PWR_STATE_LOW_POWER) {
 
                        display_count = rn_get_active_display_cnt_wa(dc, context);
+
+                       for (irq_src = DC_IRQ_SOURCE_HPD1; irq_src <= DC_IRQ_SOURCE_HPD5; irq_src++) {
+                               hpd_state = dal_get_hpd_state_dcn21(dc->res_pool->irqs, irq_src);
+                               if (hpd_state)
+                                       break;
+                       }
+
                        /* if we can go lower, go lower */
-                       if (display_count == 0) {
+                       if (display_count == 0 && !hpd_state) {
                                rn_vbios_smu_set_dcn_low_power_state(clk_mgr, DCN_PWR_STATE_LOW_POWER);
                                /* update power state */
                                clk_mgr_base->clks.pwr_state = DCN_PWR_STATE_LOW_POWER;
 
        return DC_IRQ_SOURCE_INVALID;
 }
 
+uint32_t dal_get_hpd_state_dcn21(struct irq_service *irq_service, enum dc_irq_source source)
+{
+       const struct irq_source_info *info;
+       uint32_t addr;
+       uint32_t value;
+       uint32_t current_status;
+
+       info = find_irq_source_info(irq_service, source);
+       if (!info)
+               return 0;
+
+       addr = info->status_reg;
+       if (!addr)
+               return 0;
+
+       value = dm_read_reg(irq_service->ctx, addr);
+       current_status =
+               get_reg_field_value(
+                       value,
+                       HPD0_DC_HPD_INT_STATUS,
+                       DC_HPD_SENSE);
+
+       return current_status;
+}
+
 static bool hpd_ack(
        struct irq_service *irq_service,
        const struct irq_source_info *info)
 
 struct irq_service *dal_irq_service_dcn21_create(
        struct irq_service_init_data *init_data);
 
+uint32_t dal_get_hpd_state_dcn21(struct irq_service *irq_service, enum dc_irq_source source);
+
 #endif
 
        *irq_service = NULL;
 }
 
-static const struct irq_source_info *find_irq_source_info(
+const struct irq_source_info *find_irq_source_info(
        struct irq_service *irq_service,
        enum dc_irq_source source)
 {
 
        const struct irq_service_funcs *funcs;
 };
 
+const struct irq_source_info *find_irq_source_info(
+       struct irq_service *irq_service,
+       enum dc_irq_source source);
+
 void dal_irq_service_construct(
        struct irq_service *irq_service,
        struct irq_service_init_data *init_data);