Commit eba1f35d authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter

drm: Move timestamping constants into drm_vblank_crtc

Collect the timestamping constants alongside the rest of the relevant
stuff under drm_vblank_crtc.

We can now get rid of the 'refcrtc' parameter to
drm_calc_vbltimestamp_from_scanoutpos().
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 94284037
...@@ -681,7 +681,7 @@ int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, ...@@ -681,7 +681,7 @@ int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
/* Helper routine in DRM core does all the work: */ /* Helper routine in DRM core does all the work: */
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
vblank_time, flags, vblank_time, flags,
drmcrtc, &drmcrtc->hwmode); &drmcrtc->hwmode);
} }
const struct drm_ioctl_desc amdgpu_ioctls_kms[] = { const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
......
...@@ -603,6 +603,7 @@ int drm_control(struct drm_device *dev, void *data, ...@@ -603,6 +603,7 @@ int drm_control(struct drm_device *dev, void *data,
void drm_calc_timestamping_constants(struct drm_crtc *crtc, void drm_calc_timestamping_constants(struct drm_crtc *crtc,
const struct drm_display_mode *mode) const struct drm_display_mode *mode)
{ {
struct drm_vblank_crtc *vblank = &crtc->dev->vblank[drm_crtc_index(crtc)];
int linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0; int linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0;
int dotclock = mode->crtc_clock; int dotclock = mode->crtc_clock;
...@@ -628,9 +629,9 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc, ...@@ -628,9 +629,9 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n", DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n",
crtc->base.id); crtc->base.id);
crtc->pixeldur_ns = pixeldur_ns; vblank->pixeldur_ns = pixeldur_ns;
crtc->linedur_ns = linedur_ns; vblank->linedur_ns = linedur_ns;
crtc->framedur_ns = framedur_ns; vblank->framedur_ns = framedur_ns;
DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n", DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
crtc->base.id, mode->crtc_htotal, crtc->base.id, mode->crtc_htotal,
...@@ -651,7 +652,6 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants); ...@@ -651,7 +652,6 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants);
* @flags: Flags to pass to driver: * @flags: Flags to pass to driver:
* 0 = Default, * 0 = Default,
* DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler
* @refcrtc: CRTC which defines scanout timing
* @mode: mode which defines the scanout timings * @mode: mode which defines the scanout timings
* *
* Implements calculation of exact vblank timestamps from given drm_display_mode * Implements calculation of exact vblank timestamps from given drm_display_mode
...@@ -692,9 +692,9 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, ...@@ -692,9 +692,9 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
int *max_error, int *max_error,
struct timeval *vblank_time, struct timeval *vblank_time,
unsigned flags, unsigned flags,
const struct drm_crtc *refcrtc,
const struct drm_display_mode *mode) const struct drm_display_mode *mode)
{ {
struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
struct timeval tv_etime; struct timeval tv_etime;
ktime_t stime, etime; ktime_t stime, etime;
int vbl_status; int vbl_status;
...@@ -714,9 +714,9 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, ...@@ -714,9 +714,9 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
} }
/* Durations of frames, lines, pixels in nanoseconds. */ /* Durations of frames, lines, pixels in nanoseconds. */
framedur_ns = refcrtc->framedur_ns; framedur_ns = vblank->framedur_ns;
linedur_ns = refcrtc->linedur_ns; linedur_ns = vblank->linedur_ns;
pixeldur_ns = refcrtc->pixeldur_ns; pixeldur_ns = vblank->pixeldur_ns;
/* If mode timing undefined, just return as no-op: /* If mode timing undefined, just return as no-op:
* Happens during initial modesetting of a crtc. * Happens during initial modesetting of a crtc.
......
...@@ -810,7 +810,6 @@ static int i915_get_vblank_timestamp(struct drm_device *dev, int pipe, ...@@ -810,7 +810,6 @@ static int i915_get_vblank_timestamp(struct drm_device *dev, int pipe,
/* Helper routine in DRM core does all the work: */ /* Helper routine in DRM core does all the work: */
return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error, return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
vblank_time, flags, vblank_time, flags,
crtc,
&crtc->hwmode); &crtc->hwmode);
} }
......
...@@ -103,6 +103,7 @@ nouveau_display_scanoutpos_head(struct drm_crtc *crtc, int *vpos, int *hpos, ...@@ -103,6 +103,7 @@ nouveau_display_scanoutpos_head(struct drm_crtc *crtc, int *vpos, int *hpos,
.base.head = nouveau_crtc(crtc)->index, .base.head = nouveau_crtc(crtc)->index,
}; };
struct nouveau_display *disp = nouveau_display(crtc->dev); struct nouveau_display *disp = nouveau_display(crtc->dev);
struct drm_vblank_crtc *vblank = &crtc->dev->vblank[drm_crtc_index(crtc)];
int ret, retry = 1; int ret, retry = 1;
do { do {
...@@ -116,7 +117,7 @@ nouveau_display_scanoutpos_head(struct drm_crtc *crtc, int *vpos, int *hpos, ...@@ -116,7 +117,7 @@ nouveau_display_scanoutpos_head(struct drm_crtc *crtc, int *vpos, int *hpos,
break; break;
} }
if (retry) ndelay(crtc->linedur_ns); if (retry) ndelay(vblank->linedur_ns);
} while (retry--); } while (retry--);
*hpos = args.scan.hline; *hpos = args.scan.hline;
...@@ -155,7 +156,7 @@ nouveau_display_vblstamp(struct drm_device *dev, int head, int *max_error, ...@@ -155,7 +156,7 @@ nouveau_display_vblstamp(struct drm_device *dev, int head, int *max_error,
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
if (nouveau_crtc(crtc)->index == head) { if (nouveau_crtc(crtc)->index == head) {
return drm_calc_vbltimestamp_from_scanoutpos(dev, return drm_calc_vbltimestamp_from_scanoutpos(dev,
head, max_error, time, flags, crtc, head, max_error, time, flags,
&crtc->hwmode); &crtc->hwmode);
} }
} }
......
...@@ -841,7 +841,7 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, ...@@ -841,7 +841,7 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
/* Helper routine in DRM core does all the work: */ /* Helper routine in DRM core does all the work: */
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
vblank_time, flags, vblank_time, flags,
drmcrtc, &drmcrtc->hwmode); &drmcrtc->hwmode);
} }
#define KMS_INVALID_IOCTL(name) \ #define KMS_INVALID_IOCTL(name) \
......
...@@ -701,6 +701,9 @@ struct drm_vblank_crtc { ...@@ -701,6 +701,9 @@ struct drm_vblank_crtc {
u32 last_wait; /* Last vblank seqno waited per CRTC */ u32 last_wait; /* Last vblank seqno waited per CRTC */
unsigned int inmodeset; /* Display driver is setting mode */ unsigned int inmodeset; /* Display driver is setting mode */
unsigned int pipe; /* crtc index */ unsigned int pipe; /* crtc index */
int framedur_ns; /* frame/field duration in ns */
int linedur_ns; /* line duration in ns */
int pixeldur_ns; /* pixel duration in ns */
bool enabled; /* so we don't call enable more than bool enabled; /* so we don't call enable more than
once per disable */ once per disable */
}; };
...@@ -951,7 +954,6 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, ...@@ -951,7 +954,6 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
unsigned int pipe, int *max_error, unsigned int pipe, int *max_error,
struct timeval *vblank_time, struct timeval *vblank_time,
unsigned flags, unsigned flags,
const struct drm_crtc *refcrtc,
const struct drm_display_mode *mode); const struct drm_display_mode *mode);
extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, extern void drm_calc_timestamping_constants(struct drm_crtc *crtc,
const struct drm_display_mode *mode); const struct drm_display_mode *mode);
......
...@@ -413,9 +413,6 @@ struct drm_crtc_funcs { ...@@ -413,9 +413,6 @@ struct drm_crtc_funcs {
* @funcs: CRTC control functions * @funcs: CRTC control functions
* @gamma_size: size of gamma ramp * @gamma_size: size of gamma ramp
* @gamma_store: gamma ramp values * @gamma_store: gamma ramp values
* @framedur_ns: precise frame timing
* @linedur_ns: precise line timing
* @pixeldur_ns: precise pixel timing
* @helper_private: mid-layer private data * @helper_private: mid-layer private data
* @properties: property tracking for this CRTC * @properties: property tracking for this CRTC
* @state: current atomic state for this CRTC * @state: current atomic state for this CRTC
...@@ -468,9 +465,6 @@ struct drm_crtc { ...@@ -468,9 +465,6 @@ struct drm_crtc {
uint32_t gamma_size; uint32_t gamma_size;
uint16_t *gamma_store; uint16_t *gamma_store;
/* Constants needed for precise vblank and swap timestamping. */
int framedur_ns, linedur_ns, pixeldur_ns;
/* if you are using the helper */ /* if you are using the helper */
const void *helper_private; const void *helper_private;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment