return timespec64_to_ns(&time);
 }
 
+unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx,
+               unsigned long long current_time_stamp,
+               unsigned long long last_time_stamp)
+{
+       return current_time_stamp - last_time_stamp;
+}
+
 void dm_perf_trace_timestamp(const char *func_name, unsigned int line)
 {
 }
 
        struct link_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM];
 };
 
+struct time_stamp {
+       uint64_t edp_poweroff;
+       uint64_t edp_poweron;
+};
+
+struct link_trace {
+       struct time_stamp time_stamp;
+};
 /*
  * A link contains one or more sinks and their connected status.
  * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported.
 
        struct dc_link_status link_status;
 
+       struct link_trace link_trace;
 };
 
 const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link);
 
 
        if (power_up != is_panel_powered_on(hwseq)) {
                /* Send VBIOS command to prompt eDP panel power */
+               if (power_up) {
+                       unsigned long long current_ts = dm_get_timestamp(ctx);
+                       unsigned long long duration_in_ms =
+                                       dm_get_elapse_time_in_ns(
+                                                       ctx,
+                                                       current_ts,
+                                                       link->link_trace.time_stamp.edp_poweroff) / 1000000;
+                       unsigned long long wait_time_ms = 0;
+
+                       /* max 500ms from LCDVDD off to on */
+                       if (link->link_trace.time_stamp.edp_poweroff == 0)
+                               wait_time_ms = 500;
+                       else if (duration_in_ms < 500)
+                               wait_time_ms = 500 - duration_in_ms;
+
+                       if (wait_time_ms) {
+                               msleep(wait_time_ms);
+                               dm_output_to_console("%s: wait %lld ms to power on eDP.\n",
+                                               __func__, wait_time_ms);
+                       }
+
+               }
 
                DC_LOG_HW_RESUME_S3(
                                "%s: Panel Power action: %s\n",
                cntl.coherent = false;
                cntl.lanes_number = LANE_COUNT_FOUR;
                cntl.hpd_sel = link->link_enc->hpd_source;
-
                bp_result = link_transmitter_control(ctx->dc_bios, &cntl);
 
+               if (!power_up)
+                       /*save driver power off time stamp*/
+                       link->link_trace.time_stamp.edp_poweroff = dm_get_timestamp(ctx);
+               else
+                       link->link_trace.time_stamp.edp_poweron = dm_get_timestamp(ctx);
+
                if (bp_result != BP_RESULT_OK)
                        DC_LOG_ERROR(
                                        "%s: Panel Power bp_result: %d\n",
 
 
 unsigned long long dm_get_timestamp(struct dc_context *ctx);
 
+unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx,
+               unsigned long long current_time_stamp,
+               unsigned long long last_time_stamp);
+
 /*
  * performance tracing
  */