Merge "disp: msm: sde: wait for a vsync on suspend"

Bu işleme şunda yer alıyor:
qctecmdr
2023-10-10 18:29:23 -07:00
işlemeyi yapan: Gerrit - the friendly Code Review server
işleme 98e5faed01
3 değiştirilmiş dosya ile 40 ekleme ve 1 silme

Dosyayı Görüntüle

@@ -1619,6 +1619,27 @@ static void sde_encoder_control_te(struct sde_encoder_virt *sde_enc, bool enable
}
}
static void _sde_encoder_wait_for_vsync_on_autorefresh_busy(struct sde_encoder_phys *phys_enc)
{
u32 autorefresh_status;
int ret = 0;
if (!phys_enc || !phys_enc->hw_intf || !phys_enc->hw_intf->ops.get_autorefresh_status) {
SDE_ERROR("invalid params\n");
return;
}
autorefresh_status = phys_enc->hw_intf->ops.get_autorefresh_status(phys_enc->hw_intf);
if (autorefresh_status) {
ret = sde_encoder_wait_for_event(phys_enc->parent, MSM_ENC_VBLANK);
if (ret) {
autorefresh_status = phys_enc->hw_intf->ops.get_autorefresh_status(
phys_enc->hw_intf);
SDE_ERROR("wait for vblank timed out, autorefresh_status:%d\n",
autorefresh_status);
}
}
}
int sde_encoder_helper_switch_vsync(struct drm_encoder *drm_enc,
bool watchdog_te)
@@ -3694,8 +3715,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
for (i = 0; i < sde_enc->num_phys_encs; i++) {
struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
if (phys && phys->ops.disable_autorefresh)
if (phys && phys->ops.disable_autorefresh) {
phys->ops.disable_autorefresh(phys);
_sde_encoder_wait_for_vsync_on_autorefresh_busy(phys);
}
}
/* wait for idle */

Dosyayı Görüntüle

@@ -102,6 +102,7 @@
#define INTF_TEAR_LINE_COUNT 0x2B0
#define INTF_TEAR_AUTOREFRESH_CONFIG 0x2B4
#define INTF_TEAR_TEAR_DETECT_CTRL 0x2B8
#define INTF_TEAR_AUTOREFRESH_STATUS 0x2C0
#define INTF_TEAR_PROG_FETCH_START 0x2C4
#define INTF_TEAR_DSI_DMA_SCHD_CTRL0 0x2C8
#define INTF_TEAR_DSI_DMA_SCHD_CTRL1 0x2CC
@@ -827,6 +828,17 @@ static int sde_hw_intf_get_autorefresh_config(struct sde_hw_intf *intf,
return 0;
}
static u32 sde_hw_intf_get_autorefresh_status(struct sde_hw_intf *intf)
{
struct sde_hw_blk_reg_map *c;
u32 val;
c = &intf->hw;
val = SDE_REG_READ(c, INTF_TEAR_AUTOREFRESH_STATUS);
return val;
}
static int sde_hw_intf_poll_timeout_wr_ptr(struct sde_hw_intf *intf,
u32 timeout_us)
{
@@ -1095,6 +1107,8 @@ static void _setup_intf_ops(struct sde_hw_intf_ops *ops,
ops->get_vsync_info = sde_hw_intf_get_vsync_info;
ops->setup_autorefresh = sde_hw_intf_setup_autorefresh_config;
ops->get_autorefresh = sde_hw_intf_get_autorefresh_config;
ops->get_autorefresh_status =
sde_hw_intf_get_autorefresh_status;
ops->poll_timeout_wr_ptr = sde_hw_intf_poll_timeout_wr_ptr;
ops->vsync_sel = sde_hw_intf_vsync_sel;
ops->check_and_reset_tearcheck = sde_hw_intf_v1_check_and_reset_tearcheck;

Dosyayı Görüntüle

@@ -104,6 +104,7 @@ struct intf_wd_jitter_params {
* @get_wd_ltj_status: Read WD long term jitter status.
* @bind_pingpong_blk: enable/disable the connection with pingpong which will
* feed pixels to this interface
* @get_autorefresh_status: Check the status of autorefresh is busy or idle
*/
struct sde_hw_intf_ops {
void (*setup_timing_gen)(struct sde_hw_intf *intf,
@@ -147,6 +148,7 @@ struct sde_hw_intf_ops {
void (*bind_pingpong_blk)(struct sde_hw_intf *intf,
bool enable,
const enum sde_pingpong pp);
u32 (*get_autorefresh_status)(struct sde_hw_intf *intf);
/**
* enables vysnc generation and sets up init value of