Merge "disp: msm: sde: report AVR_STATUS in vsync_event sysfs node"

This commit is contained in:
qctecmdr
2021-04-02 17:42:22 -07:00
committed by Gerrit - the friendly Code Review server
7 changed files with 71 additions and 2 deletions

View File

@@ -388,6 +388,8 @@ static ssize_t vsync_event_show(struct device *device,
{
struct drm_crtc *crtc;
struct sde_crtc *sde_crtc;
struct drm_encoder *encoder;
int avr_status = -EPIPE;
if (!device || !buf) {
SDE_ERROR("invalid input param(s)\n");
@@ -396,8 +398,21 @@ static ssize_t vsync_event_show(struct device *device,
crtc = dev_get_drvdata(device);
sde_crtc = to_sde_crtc(crtc);
return scnprintf(buf, PAGE_SIZE, "VSYNC=%llu\n",
ktime_to_ns(sde_crtc->vblank_last_cb_time));
mutex_lock(&sde_crtc->crtc_lock);
if (sde_crtc->enabled) {
drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) {
if (sde_encoder_in_clone_mode(encoder))
continue;
avr_status = sde_encoder_get_avr_status(encoder);
break;
}
}
mutex_unlock(&sde_crtc->crtc_lock);
return scnprintf(buf, PAGE_SIZE, "VSYNC=%llu\nAVR_STATUS=%d\n",
ktime_to_ns(sde_crtc->vblank_last_cb_time), avr_status);
}
static ssize_t retire_frame_event_show(struct device *device,

View File

@@ -4378,6 +4378,27 @@ void sde_encoder_get_transfer_time(struct drm_encoder *drm_enc,
*transfer_time_us = info->mdp_transfer_time_us;
}
int sde_encoder_get_avr_status(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc;
struct sde_encoder_phys *master;
bool is_vid_mode;
if (!drm_enc)
return -EINVAL;
sde_enc = to_sde_encoder_virt(drm_enc);
master = sde_enc->cur_master;
is_vid_mode = sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CAP_VID_MODE);
if (!master || !is_vid_mode || !sde_connector_get_qsync_mode(master->connector))
return -ENODATA;
if (!master->hw_intf->ops.get_avr_status)
return -EOPNOTSUPP;
return master->hw_intf->ops.get_avr_status(master->hw_intf);
}
int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc,
struct drm_framebuffer *fb)
{

View File

@@ -392,6 +392,12 @@ enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder);
*/
u32 sde_encoder_get_frame_count(struct drm_encoder *encoder);
/**
* sde_encoder_get_avr_status - get combined avr_status from all intfs for given virt encoder
* @drm_enc: Pointer to drm encoder structure
*/
int sde_encoder_get_avr_status(struct drm_encoder *drm_enc);
/*
* sde_encoder_get_vblank_timestamp - get the last vsync timestamp
* @encoder: Pointer to drm encoder object

View File

@@ -2431,6 +2431,7 @@ static int sde_intf_parse_dt(struct device_node *np,
set_bit(SDE_INTF_WD_TIMER, &intf->features);
set_bit(SDE_INTF_RESET_COUNTER, &intf->features);
set_bit(SDE_INTF_VSYNC_TIMESTAMP, &intf->features);
set_bit(SDE_INTF_AVR_STATUS, &intf->features);
}
}

View File

@@ -508,6 +508,7 @@ enum {
* @SDE_INTF_STATUS INTF block has INTF_STATUS register
* @SDE_INTF_RESET_COUNTER INTF block has frame/line counter reset support
* @SDE_INTF_VSYNC_TIMESTAMP INTF block has vsync timestamp logged
* @SDE_INTF_AVR_STATUS INTF block has AVR_STATUS field in AVR_CONTROL register
* @SDE_INTF_MAX
*/
enum {
@@ -518,6 +519,7 @@ enum {
SDE_INTF_STATUS,
SDE_INTF_RESET_COUNTER,
SDE_INTF_VSYNC_TIMESTAMP,
SDE_INTF_AVR_STATUS,
SDE_INTF_MAX
};

View File

@@ -184,6 +184,20 @@ static void sde_hw_intf_avr_ctrl(struct sde_hw_intf *ctx,
SDE_REG_WRITE(c, INTF_AVR_MODE, avr_mode);
}
static u32 sde_hw_intf_get_avr_status(struct sde_hw_intf *ctx)
{
struct sde_hw_blk_reg_map *c;
u32 avr_ctrl;
if (!ctx)
return false;
c = &ctx->hw;
avr_ctrl = SDE_REG_READ(c, INTF_AVR_CONTROL);
return avr_ctrl >> 31;
}
static inline void _check_and_set_comp_bit(struct sde_hw_intf *ctx,
bool dsc_4hs_merge, bool compression_en, u32 *intf_cfg2)
{
@@ -868,6 +882,9 @@ static void _setup_intf_ops(struct sde_hw_intf_ops *ops,
if (cap & BIT(SDE_INTF_WD_TIMER))
ops->setup_vsync_source = sde_hw_intf_setup_vsync_source;
if (cap & BIT(SDE_INTF_AVR_STATUS))
ops->get_avr_status = sde_hw_intf_get_avr_status;
if (cap & BIT(SDE_INTF_TE)) {
ops->setup_tearcheck = sde_hw_intf_setup_te_config;
ops->enable_tearcheck = sde_hw_intf_enable_te;

View File

@@ -194,6 +194,13 @@ struct sde_hw_intf_ops {
void (*avr_ctrl)(struct sde_hw_intf *intf,
const struct intf_avr_params *avr_params);
/**
* Indicates the AVR armed status
*
* @return: false if a trigger is pending, else true while AVR is enabled
*/
u32 (*get_avr_status)(struct sde_hw_intf *intf);
/**
* Enable/disable 64 bit compressed data input to interface block
*/