Commit c7299705 authored by Charlene Liu's avatar Charlene Liu Committed by Alex Deucher

drm/amd/display: only polling VSync Phase within VSync peroroid

Signed-off-by: default avatarCharlene Liu <charlene.liu@amd.com>
Reviewed-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c9bb686b
...@@ -1862,13 +1862,13 @@ bool dc_link_set_abm_disable(const struct dc_link *link) ...@@ -1862,13 +1862,13 @@ bool dc_link_set_abm_disable(const struct dc_link *link)
} }
bool dc_link_set_psr_enable(const struct dc_link *link, bool enable) bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait)
{ {
struct dc *core_dc = link->ctx->dc; struct dc *core_dc = link->ctx->dc;
struct dmcu *dmcu = core_dc->res_pool->dmcu; struct dmcu *dmcu = core_dc->res_pool->dmcu;
if (dmcu != NULL && link->psr_enabled) if (dmcu != NULL && link->psr_enabled)
dmcu->funcs->set_psr_enable(dmcu, enable); dmcu->funcs->set_psr_enable(dmcu, enable, wait);
return true; return true;
} }
......
...@@ -1653,8 +1653,8 @@ static bool handle_hpd_irq_psr_sink(const struct dc_link *link) ...@@ -1653,8 +1653,8 @@ static bool handle_hpd_irq_psr_sink(const struct dc_link *link)
sizeof(psr_error_status.raw)); sizeof(psr_error_status.raw));
/* PSR error, disable and re-enable PSR */ /* PSR error, disable and re-enable PSR */
dc_link_set_psr_enable(link, false); dc_link_set_psr_enable(link, false, true);
dc_link_set_psr_enable(link, true); dc_link_set_psr_enable(link, true, true);
return true; return true;
} else if (psr_sink_psr_status.bits.SINK_SELF_REFRESH_STATUS == } else if (psr_sink_psr_status.bits.SINK_SELF_REFRESH_STATUS ==
......
...@@ -871,7 +871,7 @@ struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index); ...@@ -871,7 +871,7 @@ struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index);
bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level,
uint32_t frame_ramp, const struct dc_stream_state *stream); uint32_t frame_ramp, const struct dc_stream_state *stream);
bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable); bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait);
bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state);
......
...@@ -103,7 +103,7 @@ static void dce_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state) ...@@ -103,7 +103,7 @@ static void dce_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state)
REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0); REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0);
} }
static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait)
{ {
struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
unsigned int dmcu_max_retry_on_wait_reg_ready = 801; unsigned int dmcu_max_retry_on_wait_reg_ready = 801;
...@@ -127,17 +127,18 @@ static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) ...@@ -127,17 +127,18 @@ static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable)
/* notifyDMCUMsg */ /* notifyDMCUMsg */
REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1);
if (wait == true) {
for (retryCount = 0; retryCount <= 100; retryCount++) { for (retryCount = 0; retryCount <= 100; retryCount++) {
dce_get_dmcu_psr_state(dmcu, &psr_state); dce_get_dmcu_psr_state(dmcu, &psr_state);
if (enable) { if (enable) {
if (psr_state != 0) if (psr_state != 0)
break; break;
} else { } else {
if (psr_state == 0) if (psr_state == 0)
break; break;
}
dm_delay_in_microseconds(dmcu->ctx, 10);
} }
dm_delay_in_microseconds(dmcu->ctx, 10);
} }
} }
...@@ -338,7 +339,7 @@ static void dcn10_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state) ...@@ -338,7 +339,7 @@ static void dcn10_get_dmcu_psr_state(struct dmcu *dmcu, uint32_t *psr_state)
REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0); REG_UPDATE(DMCU_RAM_ACCESS_CTRL, IRAM_HOST_ACCESS_EN, 0);
} }
static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait)
{ {
struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
unsigned int dmcu_max_retry_on_wait_reg_ready = 801; unsigned int dmcu_max_retry_on_wait_reg_ready = 801;
...@@ -367,6 +368,7 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) ...@@ -367,6 +368,7 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable)
* Exit PSR may need to wait 1-2 frames to power up. Timeout after at * Exit PSR may need to wait 1-2 frames to power up. Timeout after at
* least a few frames. Should never hit the max retry assert below. * least a few frames. Should never hit the max retry assert below.
*/ */
if (wait == true) {
for (retryCount = 0; retryCount <= 1000; retryCount++) { for (retryCount = 0; retryCount <= 1000; retryCount++) {
dcn10_get_dmcu_psr_state(dmcu, &psr_state); dcn10_get_dmcu_psr_state(dmcu, &psr_state);
if (enable) { if (enable) {
...@@ -381,6 +383,7 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable) ...@@ -381,6 +383,7 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable)
/* assert if max retry hit */ /* assert if max retry hit */
ASSERT(retryCount <= 1000); ASSERT(retryCount <= 1000);
}
} }
static void dcn10_dmcu_setup_psr(struct dmcu *dmcu, static void dcn10_dmcu_setup_psr(struct dmcu *dmcu,
......
...@@ -37,7 +37,7 @@ struct dmcu_funcs { ...@@ -37,7 +37,7 @@ struct dmcu_funcs {
unsigned int start_offset, unsigned int start_offset,
const char *src, const char *src,
unsigned int bytes); unsigned int bytes);
void (*set_psr_enable)(struct dmcu *dmcu, bool enable); void (*set_psr_enable)(struct dmcu *dmcu, bool enable, bool wait);
void (*setup_psr)(struct dmcu *dmcu, void (*setup_psr)(struct dmcu *dmcu,
struct dc_link *link, struct dc_link *link,
struct psr_context *psr_context); struct psr_context *psr_context);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment