summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahadevan <mahap@codeaurora.org>2020-10-28 13:39:32 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-11-18 02:35:54 -0800
commit0bd0bd6669719001aafcab1f2bbab199bbf843f6 (patch)
tree348d3358d3f119819b7234a4f18864f82d0bd8d1
parent213d04499e661bed3b36a5294271706088a4964f (diff)
downloaddisplay-drivers-0bd0bd6669719001aafcab1f2bbab199bbf843f6.tar.gz
disp: msm: sde: add sysfs entry to alert retire frame event
Added sysfs entry on crtc to notify a retire frame event. It is added at same time of signaling retire fence, which indicates the start of new frame. Change-Id: Ie404fd155ff01ea954d0decbe8788c62d033a6fc Signed-off-by: Mahadevan <mahap@codeaurora.org>
-rw-r--r--msm/sde/sde_crtc.c34
-rw-r--r--msm/sde/sde_crtc.h4
2 files changed, 38 insertions, 0 deletions
diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c
index 395299fc..3a5988a5 100644
--- a/msm/sde/sde_crtc.c
+++ b/msm/sde/sde_crtc.c
@@ -379,14 +379,34 @@ static ssize_t vsync_event_show(struct device *device,
ktime_to_ns(sde_crtc->vblank_last_cb_time));
}
+static ssize_t retire_frame_event_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ struct drm_crtc *crtc;
+ struct sde_crtc *sde_crtc;
+
+ if (!device || !buf) {
+ SDE_ERROR("invalid input param(s)\n");
+ return -EAGAIN;
+ }
+
+ crtc = dev_get_drvdata(device);
+ sde_crtc = to_sde_crtc(crtc);
+ SDE_EVT32(DRMID(&sde_crtc->base));
+ return scnprintf(buf, PAGE_SIZE, "RETIRE_FRAME_TIME=%llu\n",
+ ktime_to_ns(sde_crtc->retire_frame_event_time));
+}
+
static DEVICE_ATTR_RO(vsync_event);
static DEVICE_ATTR_RO(measured_fps);
static DEVICE_ATTR_RW(fps_periodicity_ms);
+static DEVICE_ATTR_RO(retire_frame_event);
static struct attribute *sde_crtc_dev_attrs[] = {
&dev_attr_vsync_event.attr,
&dev_attr_measured_fps.attr,
&dev_attr_fps_periodicity_ms.attr,
+ &dev_attr_retire_frame_event.attr,
NULL
};
@@ -410,6 +430,8 @@ static void sde_crtc_destroy(struct drm_crtc *crtc)
if (sde_crtc->vsync_event_sf)
sysfs_put(sde_crtc->vsync_event_sf);
+ if (sde_crtc->retire_frame_event_sf)
+ sysfs_put(sde_crtc->retire_frame_event_sf);
if (sde_crtc->sysfs_dev)
device_unregister(sde_crtc->sysfs_dev);
@@ -2159,6 +2181,12 @@ static void sde_crtc_frame_event_cb(void *data, u32 event)
}
}
+ if ((event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE) &&
+ (sde_crtc && sde_crtc->retire_frame_event_sf)) {
+ sde_crtc->retire_frame_event_time = ktime_get();
+ sysfs_notify_dirent(sde_crtc->retire_frame_event_sf);
+ }
+
fevent->event = event;
fevent->crtc = crtc;
fevent->connector = cb_data->connector;
@@ -6258,6 +6286,12 @@ int sde_crtc_post_init(struct drm_device *dev, struct drm_crtc *crtc)
SDE_ERROR("crtc:%d vsync_event sysfs create failed\n",
crtc->base.id);
+ sde_crtc->retire_frame_event_sf = sysfs_get_dirent(
+ sde_crtc->sysfs_dev->kobj.sd, "retire_frame_event");
+ if (!sde_crtc->retire_frame_event_sf)
+ SDE_ERROR("crtc:%d retire frame event sysfs create failed\n",
+ crtc->base.id);
+
end:
return rc;
}
diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h
index add97c5e..8ac8b9b0 100644
--- a/msm/sde/sde_crtc.h
+++ b/msm/sde/sde_crtc.h
@@ -221,11 +221,13 @@ struct sde_crtc_misr_info {
* @debugfs_root : Parent of debugfs node
* @priv_handle : Pointer to external private handle, if present
* @vblank_cb_count : count of vblank callback since last reset
+ * @retire_frame_event_time : ktime at last retire frame event
* @play_count : frame count between crtc enable and disable
* @vblank_cb_time : ktime at vblank count reset
* @vblank_last_cb_time : ktime at last vblank notification
* @sysfs_dev : sysfs device node for crtc
* @vsync_event_sf : vsync event notifier sysfs device
+ * @retire_frame_event_sf :retire frame event notifier sysfs device
* @enabled : whether the SDE CRTC is currently enabled. updated in the
* commit-thread, not state-swap time which is earlier, so
* safe to make decisions on during VBLANK on/off work
@@ -295,10 +297,12 @@ struct sde_crtc {
u32 vblank_cb_count;
u64 play_count;
ktime_t vblank_cb_time;
+ ktime_t retire_frame_event_time;
ktime_t vblank_last_cb_time;
struct sde_crtc_fps_info fps_info;
struct device *sysfs_dev;
struct kernfs_node *vsync_event_sf;
+ struct kernfs_node *retire_frame_event_sf;
bool enabled;
bool ds_reconfig;