/* bios scratch register communication */
        .is_accelerated_mode = bios_is_accelerated_mode,
+       .get_vga_enabled_displays = bios_get_vga_enabled_displays,
 
        .set_scratch_critical_state = bios_parser_set_scratch_critical_state,
 
 
        return bios_is_accelerated_mode(dcb);
 }
 
+static uint32_t bios_parser_get_vga_enabled_displays(
+       struct dc_bios *bios)
+{
+       return bios_get_vga_enabled_displays(bios);
+}
+
 
 /**
  * bios_parser_set_scratch_critical_state
 
 
        .is_accelerated_mode = bios_parser_is_accelerated_mode,
+       .get_vga_enabled_displays = bios_parser_get_vga_enabled_displays,
 
        .set_scratch_critical_state = bios_parser_set_scratch_critical_state,
 
 
        REG_UPDATE(BIOS_SCRATCH_6, S6_CRITICAL_STATE, critial_state);
 }
 
+uint32_t bios_get_vga_enabled_displays(
+       struct dc_bios *bios)
+{
+       uint32_t active_disp = 1;
 
+       if (bios->regs->BIOS_SCRATCH_3) /*follow up with other asic, todo*/
+               active_disp = REG_READ(BIOS_SCRATCH_3) & 0XFFFF;
+       return active_disp;
+}
 
 
 bool bios_is_accelerated_mode(struct dc_bios *bios);
 void bios_set_scratch_acc_mode_change(struct dc_bios *bios);
 void bios_set_scratch_critical_state(struct dc_bios *bios, bool state);
+uint32_t bios_get_vga_enabled_displays(struct dc_bios *bios);
 
 #define GET_IMAGE(type, offset) ((type *) bios_get_image(&bp->base, offset, sizeof(type)))
 
 
                struct dc_bios *bios);
        bool (*is_accelerated_mode)(
                struct dc_bios *bios);
+       uint32_t (*get_vga_enabled_displays)(
+               struct dc_bios *bios);
        void (*get_bios_event_info)(
                struct dc_bios *bios,
                struct bios_event_info *info);
 };
 
 struct bios_registers {
+       uint32_t BIOS_SCRATCH_3;
        uint32_t BIOS_SCRATCH_6;
 };
 
 
  */
 void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
 {
+       struct dc_bios *dcb = dc->ctx->dc_bios;
        struct dc_link *edp_link_to_turnoff = get_link_for_edp_not_in_use(dc, context);
 
        struct dc_link *edp_link = get_link_for_edp(dc);
-
-       if (edp_link)
-               /*we need turn off backlight before DP_blank and encoder powered down*/
-               dc->hwss.edp_backlight_control(edp_link, false);
-
-       power_down_all_hw_blocks(dc);
-       disable_vga_and_power_gate_all_controllers(dc);
-
-       if (edp_link_to_turnoff)
-               dc->hwss.edp_power_control(edp_link_to_turnoff, false);
-
+       if (dcb->funcs->get_vga_enabled_displays(dc->ctx->dc_bios) != 0) {
+               if (edp_link_to_turnoff) {
+                       /*we need turn off backlight before DP_blank and encoder powered down, todo add optimization*/
+                       dc->hwss.edp_backlight_control(edp_link, false);
+               }
+               /*resume from S3, no vbios posting, no need to power down again*/
+               power_down_all_hw_blocks(dc);
+               disable_vga_and_power_gate_all_controllers(dc);
+               if (edp_link_to_turnoff)
+                       dc->hwss.edp_power_control(edp_link_to_turnoff, false);
+       }
        bios_set_scratch_acc_mode_change(dc->ctx->dc_bios);
 }
 
 
 
 
 static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
                NBIO_SR(BIOS_SCRATCH_6)
 };