summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClarence Ip <cip@codeaurora.org>2016-08-25 18:29:03 -0400
committerClarence Ip <cip@codeaurora.org>2016-09-12 15:42:37 -0400
commitc93c7b0138a16e0b267c4c276745fb31c4fa5c3a (patch)
treefa3a4d239aeab8262fb187fd81ac6cd4974f3869
parent593f3c3e66f76cc48ad295bcc990396e4e32fe13 (diff)
drm/msm/sde: determine output fence timing on create
Allow for output fence signal time to be determined during each fence create rather than at initialization. This provides for more flexibility to support use cases that require different signalling times. Change-Id: I2a9467c225e5632a01cd556553368d0990a94327 Signed-off-by: Clarence Ip <cip@codeaurora.org>
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.c17
-rw-r--r--drivers/gpu/drm/msm/sde/sde_crtc.c15
-rw-r--r--drivers/gpu/drm/msm/sde/sde_fence.c25
-rw-r--r--drivers/gpu/drm/msm/sde/sde_fence.h9
4 files changed, 30 insertions, 36 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c
index c9e55337e1b8..056cf60004f6 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.c
+++ b/drivers/gpu/drm/msm/sde/sde_connector.c
@@ -308,7 +308,13 @@ static int sde_connector_atomic_get_property(struct drm_connector *connector,
idx = msm_property_index(&c_conn->property_info, property);
if (idx == CONNECTOR_PROP_RETIRE_FENCE)
- rc = sde_fence_create(&c_conn->retire_fence, val);
+ /*
+ * Set a fence offset if not a virtual connector, so that the
+ * fence signals after one additional commit rather than at the
+ * end of the current one.
+ */
+ rc = sde_fence_create(&c_conn->retire_fence, val,
+ c_conn->connector_type != DRM_MODE_CONNECTOR_VIRTUAL);
else
/* get cached property value */
rc = msm_property_atomic_get(&c_conn->property_info,
@@ -512,14 +518,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
"conn%u",
c_conn->base.base.id);
- /*
- * Initialize retire fence support. Set fence offset to 0 for virtual
- * connectors so that the fence signals at the end of the current commit
- * and 1 for others so that the fence signals after one additional
- * commit.
- */
- rc = sde_fence_init(dev, &c_conn->retire_fence, c_conn->name,
- connector_type == DRM_MODE_CONNECTOR_VIRTUAL ? 0 : 1);
+ rc = sde_fence_init(dev, &c_conn->retire_fence, c_conn->name);
if (rc) {
SDE_ERROR("failed to init fence, %d\n", rc);
goto error_cleanup_conn;
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c
index 66329357a8e6..76732181cb98 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.c
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.c
@@ -1077,7 +1077,12 @@ static int sde_crtc_atomic_get_property(struct drm_crtc *crtc,
cstate = to_sde_crtc_state(state);
i = msm_property_index(&sde_crtc->property_info, property);
if (i == CRTC_PROP_OUTPUT_FENCE) {
- ret = sde_fence_create(&sde_crtc->output_fence, val);
+ /*
+ * Set output fence offset to zero so that fences
+ * returned during a commit will signal at the end
+ * of the same commit.
+ */
+ ret = sde_fence_create(&sde_crtc->output_fence, val, 0);
} else {
ret = msm_property_atomic_get(&sde_crtc->property_info,
cstate->property_values,
@@ -1205,12 +1210,8 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev,
/* save user friendly CRTC name for later */
snprintf(sde_crtc->name, SDE_CRTC_NAME_SIZE, "crtc%u", crtc->base.id);
- /*
- * Initialize output fence support. Set output fence offset to zero
- * so that fences returned during a commit will signal at the end of
- * the same commit.
- */
- sde_fence_init(dev, &sde_crtc->output_fence, sde_crtc->name, 0);
+ /* initialize output fence support */
+ sde_fence_init(dev, &sde_crtc->output_fence, sde_crtc->name);
/* initialize debugfs support */
_sde_crtc_init_debugfs(sde_crtc, kms);
diff --git a/drivers/gpu/drm/msm/sde/sde_fence.c b/drivers/gpu/drm/msm/sde/sde_fence.c
index e4eb89650ebb..0ddfd424a05a 100644
--- a/drivers/gpu/drm/msm/sde/sde_fence.c
+++ b/drivers/gpu/drm/msm/sde/sde_fence.c
@@ -96,8 +96,7 @@ exit:
int sde_fence_init(void *dev,
struct sde_fence *fence,
- const char *name,
- int offset)
+ const char *name)
{
if (!fence) {
SDE_ERROR("invalid argument(s)\n");
@@ -111,16 +110,6 @@ int sde_fence_init(void *dev,
}
fence->dev = dev;
-
- /*
- * Allow created fences to have a constant offset with respect
- * to the timeline. This allows us to delay the fence signalling
- * w.r.t. the commit completion (e.g., an offset of +1 would
- * cause fences returned during a particular commit to signal
- * after an additional delay of one commit, rather than at the
- * end of the current one.
- */
- fence->offset = (int32_t)offset;
fence->commit_count = 0;
fence->done_count = 0;
@@ -158,7 +147,7 @@ int sde_fence_prepare(struct sde_fence *fence)
return 0;
}
-int sde_fence_create(struct sde_fence *fence, uint64_t *val)
+int sde_fence_create(struct sde_fence *fence, uint64_t *val, int offset)
{
uint32_t trigger_value;
int fd, rc = -EINVAL;
@@ -167,8 +156,16 @@ int sde_fence_create(struct sde_fence *fence, uint64_t *val)
SDE_ERROR("invalid argument(s), fence %pK, pval %pK\n",
fence, val);
} else {
+ /*
+ * Allow created fences to have a constant offset with respect
+ * to the timeline. This allows us to delay the fence signalling
+ * w.r.t. the commit completion (e.g., an offset of +1 would
+ * cause fences returned during a particular commit to signal
+ * after an additional delay of one commit, rather than at the
+ * end of the current one.
+ */
mutex_lock(&fence->fence_lock);
- trigger_value = fence->commit_count + fence->offset;
+ trigger_value = fence->commit_count + (int32_t)offset;
fd = _sde_fence_create_fd(fence->timeline,
SDE_FENCE_TIMELINE_NAME(fence),
trigger_value);
diff --git a/drivers/gpu/drm/msm/sde/sde_fence.h b/drivers/gpu/drm/msm/sde/sde_fence.h
index f22868c127ed..c22f882bc32e 100644
--- a/drivers/gpu/drm/msm/sde/sde_fence.h
+++ b/drivers/gpu/drm/msm/sde/sde_fence.h
@@ -70,7 +70,6 @@ static inline int sde_sync_wait(void *fence, long timeout_ms)
* @dev: Pointer to drm device structure
* @commit_count: Number of detected commits since bootup
* @done_count: Number of completed commits since bootup
- * @offset: Timeline offset for sync point creation
* @fence_lock: Mutex object to protect local fence variables
*/
struct sde_fence {
@@ -78,7 +77,6 @@ struct sde_fence {
void *dev;
int32_t commit_count;
int32_t done_count;
- int32_t offset;
struct mutex fence_lock;
};
@@ -88,13 +86,11 @@ struct sde_fence {
* @dev: Pointer to drm device structure
* @fence: Pointer to crtc fence object
* @name: Timeline name
- * @offset: Fence signal commit offset, e.g., +1 to signal on next commit
* Returns: Zero on success
*/
int sde_fence_init(void *dev,
struct sde_fence *fence,
- const char *name,
- int offset);
+ const char *name);
/**
* sde_fence_deinit - deinit fence container
@@ -113,9 +109,10 @@ int sde_fence_prepare(struct sde_fence *fence);
* sde_fence_create - create output fence object
* @fence: Pointer fence container
* @val: Pointer to output value variable, fence fd will be placed here
+ * @offset: Fence signal commit offset, e.g., +1 to signal on next commit
* Returns: Zero on success
*/
-int sde_fence_create(struct sde_fence *fence, uint64_t *val);
+int sde_fence_create(struct sde_fence *fence, uint64_t *val, int offset);
/**
* sde_fence_signal - advance fence timeline to signal outstanding fences