Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a706265 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: add sysfs entry to alert retire frame event"

parents 73506f69 0bd0bd66
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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;
}
+4 −0
Original line number Diff line number Diff line
@@ -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;