diff options
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_crtc.c')
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_crtc.c | 34 |
1 files changed, 10 insertions, 24 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index d86c8cce3182..1b4dbe9e1c6d 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c | |||
@@ -151,10 +151,10 @@ int vc4_crtc_debugfs_regs(struct seq_file *m, void *unused) | |||
151 | } | 151 | } |
152 | #endif | 152 | #endif |
153 | 153 | ||
154 | int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | 154 | bool vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, |
155 | unsigned int flags, int *vpos, int *hpos, | 155 | bool in_vblank_irq, int *vpos, int *hpos, |
156 | ktime_t *stime, ktime_t *etime, | 156 | ktime_t *stime, ktime_t *etime, |
157 | const struct drm_display_mode *mode) | 157 | const struct drm_display_mode *mode) |
158 | { | 158 | { |
159 | struct vc4_dev *vc4 = to_vc4_dev(dev); | 159 | struct vc4_dev *vc4 = to_vc4_dev(dev); |
160 | struct drm_crtc *crtc = drm_crtc_from_index(dev, crtc_id); | 160 | struct drm_crtc *crtc = drm_crtc_from_index(dev, crtc_id); |
@@ -162,7 +162,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
162 | u32 val; | 162 | u32 val; |
163 | int fifo_lines; | 163 | int fifo_lines; |
164 | int vblank_lines; | 164 | int vblank_lines; |
165 | int ret = 0; | 165 | bool ret = false; |
166 | 166 | ||
167 | /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ | 167 | /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ |
168 | 168 | ||
@@ -198,7 +198,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
198 | fifo_lines = vc4_crtc->cob_size / mode->crtc_hdisplay; | 198 | fifo_lines = vc4_crtc->cob_size / mode->crtc_hdisplay; |
199 | 199 | ||
200 | if (fifo_lines > 0) | 200 | if (fifo_lines > 0) |
201 | ret |= DRM_SCANOUTPOS_VALID; | 201 | ret = true; |
202 | 202 | ||
203 | /* HVS more than fifo_lines into frame for compositing? */ | 203 | /* HVS more than fifo_lines into frame for compositing? */ |
204 | if (*vpos > fifo_lines) { | 204 | if (*vpos > fifo_lines) { |
@@ -216,7 +216,6 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
216 | */ | 216 | */ |
217 | *vpos -= fifo_lines + 1; | 217 | *vpos -= fifo_lines + 1; |
218 | 218 | ||
219 | ret |= DRM_SCANOUTPOS_ACCURATE; | ||
220 | return ret; | 219 | return ret; |
221 | } | 220 | } |
222 | 221 | ||
@@ -229,10 +228,9 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
229 | * We can't get meaningful readings wrt. scanline position of the PV | 228 | * We can't get meaningful readings wrt. scanline position of the PV |
230 | * and need to make things up in a approximative but consistent way. | 229 | * and need to make things up in a approximative but consistent way. |
231 | */ | 230 | */ |
232 | ret |= DRM_SCANOUTPOS_IN_VBLANK; | ||
233 | vblank_lines = mode->vtotal - mode->vdisplay; | 231 | vblank_lines = mode->vtotal - mode->vdisplay; |
234 | 232 | ||
235 | if (flags & DRM_CALLED_FROM_VBLIRQ) { | 233 | if (in_vblank_irq) { |
236 | /* | 234 | /* |
237 | * Assume the irq handler got called close to first | 235 | * Assume the irq handler got called close to first |
238 | * line of vblank, so PV has about a full vblank | 236 | * line of vblank, so PV has about a full vblank |
@@ -254,9 +252,10 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
254 | * we are at the very beginning of vblank, as the hvs just | 252 | * we are at the very beginning of vblank, as the hvs just |
255 | * started refilling, and the stime and etime timestamps | 253 | * started refilling, and the stime and etime timestamps |
256 | * truly correspond to start of vblank. | 254 | * truly correspond to start of vblank. |
255 | * | ||
256 | * Unfortunately there's no way to report this to upper levels | ||
257 | * and make it more useful. | ||
257 | */ | 258 | */ |
258 | if ((val & SCALER_DISPSTATX_FULL) != SCALER_DISPSTATX_FULL) | ||
259 | ret |= DRM_SCANOUTPOS_ACCURATE; | ||
260 | } else { | 259 | } else { |
261 | /* | 260 | /* |
262 | * No clue where we are inside vblank. Return a vpos of zero, | 261 | * No clue where we are inside vblank. Return a vpos of zero, |
@@ -270,19 +269,6 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, | |||
270 | return ret; | 269 | return ret; |
271 | } | 270 | } |
272 | 271 | ||
273 | int vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id, | ||
274 | int *max_error, struct timeval *vblank_time, | ||
275 | unsigned flags) | ||
276 | { | ||
277 | struct drm_crtc *crtc = drm_crtc_from_index(dev, crtc_id); | ||
278 | struct drm_crtc_state *state = crtc->state; | ||
279 | |||
280 | /* Helper routine in DRM core does all the work: */ | ||
281 | return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc_id, max_error, | ||
282 | vblank_time, flags, | ||
283 | &state->adjusted_mode); | ||
284 | } | ||
285 | |||
286 | static void vc4_crtc_destroy(struct drm_crtc *crtc) | 272 | static void vc4_crtc_destroy(struct drm_crtc *crtc) |
287 | { | 273 | { |
288 | drm_crtc_cleanup(crtc); | 274 | drm_crtc_cleanup(crtc); |