Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/*
  2 * Copyright 2016 Intel Corp.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice (including the next
 12 * paragraph) shall be included in all copies or substantial portions of the
 13 * Software.
 14 *
 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 18 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 21 * OTHER DEALINGS IN THE SOFTWARE.
 22 */
 23
 24#ifndef _DRM_IRQ_H_
 25#define _DRM_IRQ_H_
 26
 27#include <linux/seqlock.h>
 28
 29/**
 30 * struct drm_pending_vblank_event - pending vblank event tracking
 31 */
 32struct drm_pending_vblank_event {
 33	/**
 34	 * @base: Base structure for tracking pending DRM events.
 35	 */
 36	struct drm_pending_event base;
 37	/**
 38	 * @pipe: drm_crtc_index() of the &drm_crtc this event is for.
 39	 */
 40	unsigned int pipe;
 41	/**
 42	 * @event: Actual event which will be sent to userspace.
 43	 */
 44	struct drm_event_vblank event;
 45};
 46
 47/**
 48 * struct drm_vblank_crtc - vblank tracking for a CRTC
 49 *
 50 * This structure tracks the vblank state for one CRTC.
 51 *
 52 * Note that for historical reasons - the vblank handling code is still shared
 53 * with legacy/non-kms drivers - this is a free-standing structure not directly
 54 * connected to struct &drm_crtc. But all public interface functions are taking
 55 * a struct &drm_crtc to hide this implementation detail.
 56 */
 57struct drm_vblank_crtc {
 58	/**
 59	 * @dev: Pointer to the &drm_device.
 60	 */
 61	struct drm_device *dev;
 62	/**
 63	 * @queue: Wait queue for vblank waiters.
 64	 */
 65	wait_queue_head_t queue;	/**< VBLANK wait queue */
 66	/**
 67	 * @disable_timer: Disable timer for the delayed vblank disabling
 68	 * hysteresis logic. Vblank disabling is controlled through the
 69	 * drm_vblank_offdelay module option and the setting of the
 70	 * max_vblank_count value in the &drm_device structure.
 71	 */
 72	struct timer_list disable_timer;
 73
 74	/**
 75	 * @seqlock: Protect vblank count and time.
 76	 */
 77	seqlock_t seqlock;		/* protects vblank count and time */
 78
 79	/**
 80	 * @count: Current software vblank counter.
 81	 */
 82	u32 count;
 83	/**
 84	 * @time: Vblank timestamp corresponding to @count.
 85	 */
 86	struct timeval time;
 87
 88	/**
 89	 * @refcount: Number of users/waiters of the vblank interrupt. Only when
 90	 * this refcount reaches 0 can the hardware interrupt be disabled using
 91	 * @disable_timer.
 92	 */
 93	atomic_t refcount;		/* number of users of vblank interruptsper crtc */
 94	/**
 95	 * @last: Protected by dev->vbl_lock, used for wraparound handling.
 96	 */
 97	u32 last;
 98	/**
 99	 * @inmodeset: Tracks whether the vblank is disabled due to a modeset.
100	 * For legacy driver bit 2 additionally tracks whether an additional
101	 * temporary vblank reference has been acquired to paper over the
102	 * hardware counter resetting/jumping. KMS drivers should instead just
103	 * call drm_crtc_vblank_off() and drm_crtc_vblank_on(), which explicitly
104	 * save and restore the vblank count.
105	 */
106	unsigned int inmodeset;		/* Display driver is setting mode */
107	/**
108	 * @pipe: drm_crtc_index() of the &drm_crtc corresponding to this
109	 * structure.
110	 */
111	unsigned int pipe;
112	/**
113	 * @framedur_ns: Frame/Field duration in ns, used by
114	 * drm_calc_vbltimestamp_from_scanoutpos() and computed by
115	 * drm_calc_timestamping_constants().
116	 */
117	int framedur_ns;
118	/**
119	 * @linedur_ns: Line duration in ns, used by
120	 * drm_calc_vbltimestamp_from_scanoutpos() and computed by
121	 * drm_calc_timestamping_constants().
122	 */
123	int linedur_ns;
124	/**
125	 * @enabled: Tracks the enabling state of the corresponding &drm_crtc to
126	 * avoid double-disabling and hence corrupting saved state. Needed by
127	 * drivers not using atomic KMS, since those might go through their CRTC
128	 * disabling functions multiple times.
129	 */
130	bool enabled;
131};
132
133int drm_irq_install(struct drm_device *dev, int irq);
134int drm_irq_uninstall(struct drm_device *dev);
135
136int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs);
137u32 drm_crtc_vblank_count(struct drm_crtc *crtc);
138u32 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
139				   struct timeval *vblanktime);
140void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
141			       struct drm_pending_vblank_event *e);
142void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
143			      struct drm_pending_vblank_event *e);
144bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe);
145bool drm_crtc_handle_vblank(struct drm_crtc *crtc);
146int drm_crtc_vblank_get(struct drm_crtc *crtc);
147void drm_crtc_vblank_put(struct drm_crtc *crtc);
148void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe);
149void drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
150void drm_crtc_vblank_off(struct drm_crtc *crtc);
151void drm_crtc_vblank_reset(struct drm_crtc *crtc);
152void drm_crtc_vblank_on(struct drm_crtc *crtc);
153void drm_vblank_cleanup(struct drm_device *dev);
154u32 drm_accurate_vblank_count(struct drm_crtc *crtc);
155u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
156
157int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
158					  unsigned int pipe, int *max_error,
159					  struct timeval *vblank_time,
160					  unsigned flags,
161					  const struct drm_display_mode *mode);
162void drm_calc_timestamping_constants(struct drm_crtc *crtc,
163				     const struct drm_display_mode *mode);
164
165/**
166 * drm_crtc_vblank_waitqueue - get vblank waitqueue for the CRTC
167 * @crtc: which CRTC's vblank waitqueue to retrieve
168 *
169 * This function returns a pointer to the vblank waitqueue for the CRTC.
170 * Drivers can use this to implement vblank waits using wait_event() and related
171 * functions.
172 */
173static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc)
174{
175	return &crtc->dev->vblank[drm_crtc_index(crtc)].queue;
176}
177
178#endif