Blame view

include/drm/drm_framebuffer.h 10.3 KB
7520a277d   Daniel Vetter   drm: Extract drm_...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * Copyright (c) 2016 Intel Corporation
   *
   * Permission to use, copy, modify, distribute, and sell this software and its
   * documentation for any purpose is hereby granted without fee, provided that
   * the above copyright notice appear in all copies and that both that copyright
   * notice and this permission notice appear in supporting documentation, and
   * that the name of the copyright holders not be used in advertising or
   * publicity pertaining to distribution of the software without specific,
   * written prior permission.  The copyright holders make no representations
   * about the suitability of this software for any purpose.  It is provided "as
   * is" without express or implied warranty.
   *
   * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
   * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
   * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
   * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
   * OF THIS SOFTWARE.
   */
  
  #ifndef __DRM_FRAMEBUFFER_H__
  #define __DRM_FRAMEBUFFER_H__
7520a277d   Daniel Vetter   drm: Extract drm_...
25
  #include <linux/ctype.h>
2513147dc   Sam Ravnborg   drm: make drm_fra...
26
27
  #include <linux/list.h>
  #include <linux/sched.h>
949619f32   Daniel Vetter   drm: Extract drm_...
28
  #include <drm/drm_mode_object.h>
7520a277d   Daniel Vetter   drm: Extract drm_...
29

2513147dc   Sam Ravnborg   drm: make drm_fra...
30
  struct drm_clip_rect;
7520a277d   Daniel Vetter   drm: Extract drm_...
31
  struct drm_device;
2513147dc   Sam Ravnborg   drm: make drm_fra...
32
  struct drm_file;
2471e7a53   Laurent Pinchart   drm: Forward-decl...
33
  struct drm_format_info;
2513147dc   Sam Ravnborg   drm: make drm_fra...
34
35
  struct drm_framebuffer;
  struct drm_gem_object;
7520a277d   Daniel Vetter   drm: Extract drm_...
36
37
38
39
40
41
42
43
44
45
  
  /**
   * struct drm_framebuffer_funcs - framebuffer hooks
   */
  struct drm_framebuffer_funcs {
  	/**
  	 * @destroy:
  	 *
  	 * Clean up framebuffer resources, specifically also unreference the
  	 * backing storage. The core guarantees to call this function for every
d574528a6   Daniel Vetter   drm/kms-core: Use...
46
47
  	 * framebuffer successfully created by calling
  	 * &drm_mode_config_funcs.fb_create. Drivers must also call
7520a277d   Daniel Vetter   drm: Extract drm_...
48
49
50
51
52
53
54
55
56
  	 * drm_framebuffer_cleanup() to release DRM core resources for this
  	 * framebuffer.
  	 */
  	void (*destroy)(struct drm_framebuffer *framebuffer);
  
  	/**
  	 * @create_handle:
  	 *
  	 * Create a buffer handle in the driver-specific buffer manager (either
ea0dd85a7   Daniel Vetter   drm/doc: use pref...
57
  	 * GEM or TTM) valid for the passed-in &struct drm_file. This is used by
7520a277d   Daniel Vetter   drm: Extract drm_...
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  	 * the core to implement the GETFB IOCTL, which returns (for
  	 * sufficiently priviledged user) also a native buffer handle. This can
  	 * be used for seamless transitions between modesetting clients by
  	 * copying the current screen contents to a private buffer and blending
  	 * between that and the new contents.
  	 *
  	 * GEM based drivers should call drm_gem_handle_create() to create the
  	 * handle.
  	 *
  	 * RETURNS:
  	 *
  	 * 0 on success or a negative error code on failure.
  	 */
  	int (*create_handle)(struct drm_framebuffer *fb,
  			     struct drm_file *file_priv,
  			     unsigned int *handle);
  	/**
  	 * @dirty:
  	 *
  	 * Optional callback for the dirty fb IOCTL.
  	 *
  	 * Userspace can notify the driver via this callback that an area of the
  	 * framebuffer has changed and should be flushed to the display
  	 * hardware. This can also be used internally, e.g. by the fbdev
  	 * emulation, though that's not the case currently.
  	 *
  	 * See documentation in drm_mode.h for the struct drm_mode_fb_dirty_cmd
  	 * for more information as all the semantics and arguments have a one to
  	 * one mapping on this function.
  	 *
ecf79e7ca   Daniel Vetter   drm/fb: document ...
88
89
90
  	 * Atomic drivers should use drm_atomic_helper_dirtyfb() to implement
  	 * this hook.
  	 *
7520a277d   Daniel Vetter   drm: Extract drm_...
91
92
93
94
95
96
97
98
99
  	 * RETURNS:
  	 *
  	 * 0 on success or a negative error code on failure.
  	 */
  	int (*dirty)(struct drm_framebuffer *framebuffer,
  		     struct drm_file *file_priv, unsigned flags,
  		     unsigned color, struct drm_clip_rect *clips,
  		     unsigned num_clips);
  };
750fb8c43   Daniel Vetter   drm/doc: Update d...
100
101
102
103
104
105
106
107
108
  /**
   * struct drm_framebuffer - frame buffer object
   *
   * Note that the fb is refcounted for the benefit of driver internals,
   * for example some hw, disabling a CRTC/plane is asynchronous, and
   * scanout does not actually complete until the next vblank.  So some
   * cleanup (like releasing the reference(s) on the backing GEM bo(s))
   * should be deferred.  In cases like this, the driver would like to
   * hold a ref to the fb even though it has already been removed from
a4a69da06   Thierry Reding   drm: Introduce dr...
109
110
   * userspace perspective. See drm_framebuffer_get() and
   * drm_framebuffer_put().
750fb8c43   Daniel Vetter   drm/doc: Update d...
111
112
113
   *
   * The refcount is stored inside the mode object @base.
   */
7520a277d   Daniel Vetter   drm: Extract drm_...
114
  struct drm_framebuffer {
750fb8c43   Daniel Vetter   drm/doc: Update d...
115
116
117
  	/**
  	 * @dev: DRM device this framebuffer belongs to
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
118
  	struct drm_device *dev;
750fb8c43   Daniel Vetter   drm/doc: Update d...
119
  	/**
d574528a6   Daniel Vetter   drm/kms-core: Use...
120
121
  	 * @head: Place on the &drm_mode_config.fb_list, access protected by
  	 * &drm_mode_config.fb_lock.
7520a277d   Daniel Vetter   drm: Extract drm_...
122
123
  	 */
  	struct list_head head;
750fb8c43   Daniel Vetter   drm/doc: Update d...
124
125
126
127
  
  	/**
  	 * @base: base modeset object structure, contains the reference count.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
128
  	struct drm_mode_object base;
8d44e9e69   Maarten Lankhorst   drm/framebuffer: ...
129
130
131
132
133
  
  	/**
  	 * @comm: Name of the process allocating the fb, used for fb dumping.
  	 */
  	char comm[TASK_COMM_LEN];
750fb8c43   Daniel Vetter   drm/doc: Update d...
134
  	/**
e14c23c64   Ville Syrjälä   drm: Store a poin...
135
136
137
138
  	 * @format: framebuffer format information
  	 */
  	const struct drm_format_info *format;
  	/**
750fb8c43   Daniel Vetter   drm/doc: Update d...
139
140
  	 * @funcs: framebuffer vfunc table
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
141
  	const struct drm_framebuffer_funcs *funcs;
750fb8c43   Daniel Vetter   drm/doc: Update d...
142
143
144
145
  	/**
  	 * @pitches: Line stride per buffer. For userspace created object this
  	 * is copied from drm_mode_fb_cmd2.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
146
  	unsigned int pitches[4];
750fb8c43   Daniel Vetter   drm/doc: Update d...
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  	/**
  	 * @offsets: Offset from buffer start to the actual pixel data in bytes,
  	 * per buffer. For userspace created object this is copied from
  	 * drm_mode_fb_cmd2.
  	 *
  	 * Note that this is a linear offset and does not take into account
  	 * tiling or buffer laytou per @modifier. It meant to be used when the
  	 * actual pixel data for this framebuffer plane starts at an offset,
  	 * e.g.  when multiple planes are allocated within the same backing
  	 * storage buffer object. For tiled layouts this generally means it
  	 * @offsets must at least be tile-size aligned, but hardware often has
  	 * stricter requirements.
  	 *
  	 * This should not be used to specifiy x/y pixel offsets into the buffer
  	 * data (even for linear buffers). Specifying an x/y pixel offset is
ea0dd85a7   Daniel Vetter   drm/doc: use pref...
162
  	 * instead done through the source rectangle in &struct drm_plane_state.
750fb8c43   Daniel Vetter   drm/doc: Update d...
163
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
164
  	unsigned int offsets[4];
750fb8c43   Daniel Vetter   drm/doc: Update d...
165
  	/**
bae781b25   Ville Syrjälä   drm: Nuke modifie...
166
  	 * @modifier: Data layout modifier. This is used to describe
750fb8c43   Daniel Vetter   drm/doc: Update d...
167
168
169
170
  	 * tiling, or also special layouts (like compression) of auxiliary
  	 * buffers. For userspace created object this is copied from
  	 * drm_mode_fb_cmd2.
  	 */
bae781b25   Ville Syrjälä   drm: Nuke modifie...
171
  	uint64_t modifier;
750fb8c43   Daniel Vetter   drm/doc: Update d...
172
173
174
175
  	/**
  	 * @width: Logical width of the visible area of the framebuffer, in
  	 * pixels.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
176
  	unsigned int width;
750fb8c43   Daniel Vetter   drm/doc: Update d...
177
178
179
180
  	/**
  	 * @height: Logical height of the visible area of the framebuffer, in
  	 * pixels.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
181
  	unsigned int height;
750fb8c43   Daniel Vetter   drm/doc: Update d...
182
  	/**
750fb8c43   Daniel Vetter   drm/doc: Update d...
183
184
185
  	 * @flags: Framebuffer flags like DRM_MODE_FB_INTERLACED or
  	 * DRM_MODE_FB_MODIFIERS.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
186
  	int flags;
750fb8c43   Daniel Vetter   drm/doc: Update d...
187
  	/**
750fb8c43   Daniel Vetter   drm/doc: Update d...
188
189
190
191
  	 * @hot_x: X coordinate of the cursor hotspot. Used by the legacy cursor
  	 * IOCTL when the driver supports cursor through a DRM_PLANE_TYPE_CURSOR
  	 * universal plane.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
192
  	int hot_x;
750fb8c43   Daniel Vetter   drm/doc: Update d...
193
194
195
196
197
  	/**
  	 * @hot_y: Y coordinate of the cursor hotspot. Used by the legacy cursor
  	 * IOCTL when the driver supports cursor through a DRM_PLANE_TYPE_CURSOR
  	 * universal plane.
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
198
  	int hot_y;
750fb8c43   Daniel Vetter   drm/doc: Update d...
199
  	/**
d574528a6   Daniel Vetter   drm/kms-core: Use...
200
  	 * @filp_head: Placed on &drm_file.fbs, protected by &drm_file.fbs_lock.
750fb8c43   Daniel Vetter   drm/doc: Update d...
201
  	 */
7520a277d   Daniel Vetter   drm: Extract drm_...
202
  	struct list_head filp_head;
4c3dbb2c3   Noralf Trønnes   drm: Add GEM back...
203
204
205
206
207
208
209
  	/**
  	 * @obj: GEM objects backing the framebuffer, one per plane (optional).
  	 *
  	 * This is used by the GEM framebuffer helpers, see e.g.
  	 * drm_gem_fb_create().
  	 */
  	struct drm_gem_object *obj[4];
7520a277d   Daniel Vetter   drm: Extract drm_...
210
  };
afb21ea63   Daniel Vetter   drm: Move a few m...
211
  #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
7520a277d   Daniel Vetter   drm: Extract drm_...
212
213
214
215
  int drm_framebuffer_init(struct drm_device *dev,
  			 struct drm_framebuffer *fb,
  			 const struct drm_framebuffer_funcs *funcs);
  struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
418da1721   Keith Packard   drm: Pass struct ...
216
  					       struct drm_file *file_priv,
7520a277d   Daniel Vetter   drm: Extract drm_...
217
218
219
220
221
222
  					       uint32_t id);
  void drm_framebuffer_remove(struct drm_framebuffer *fb);
  void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
  void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
  
  /**
a4a69da06   Thierry Reding   drm: Introduce dr...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
   * drm_framebuffer_get - acquire a framebuffer reference
   * @fb: DRM framebuffer
   *
   * This function increments the framebuffer's reference count.
   */
  static inline void drm_framebuffer_get(struct drm_framebuffer *fb)
  {
  	drm_mode_object_get(&fb->base);
  }
  
  /**
   * drm_framebuffer_put - release a framebuffer reference
   * @fb: DRM framebuffer
   *
   * This function decrements the framebuffer's reference count and frees the
   * framebuffer if the reference count drops to zero.
   */
  static inline void drm_framebuffer_put(struct drm_framebuffer *fb)
  {
  	drm_mode_object_put(&fb->base);
  }
  
  /**
7520a277d   Daniel Vetter   drm: Extract drm_...
246
247
248
249
250
   * drm_framebuffer_read_refcount - read the framebuffer reference count.
   * @fb: framebuffer
   *
   * This functions returns the framebuffer's reference count.
   */
6ff1086e2   Noralf Trønnes   drm/framebuffer: ...
251
  static inline uint32_t drm_framebuffer_read_refcount(const struct drm_framebuffer *fb)
7520a277d   Daniel Vetter   drm: Extract drm_...
252
  {
2c935bc57   Peter Zijlstra   locking/atomic, k...
253
  	return kref_read(&fb->base.refcount);
7520a277d   Daniel Vetter   drm: Extract drm_...
254
  }
afb21ea63   Daniel Vetter   drm: Move a few m...
255
256
  
  /**
389f78b36   Chris Wilson   drm: Introduce dr...
257
258
259
260
261
262
263
264
265
266
267
   * drm_framebuffer_assign - store a reference to the fb
   * @p: location to store framebuffer
   * @fb: new framebuffer (maybe NULL)
   *
   * This functions sets the location to store a reference to the framebuffer,
   * unreferencing the framebuffer that was previously stored in that location.
   */
  static inline void drm_framebuffer_assign(struct drm_framebuffer **p,
  					  struct drm_framebuffer *fb)
  {
  	if (fb)
a4a69da06   Thierry Reding   drm: Introduce dr...
268
  		drm_framebuffer_get(fb);
389f78b36   Chris Wilson   drm: Introduce dr...
269
  	if (*p)
a4a69da06   Thierry Reding   drm: Introduce dr...
270
  		drm_framebuffer_put(*p);
389f78b36   Chris Wilson   drm: Introduce dr...
271
272
273
274
  	*p = fb;
  }
  
  /*
afb21ea63   Daniel Vetter   drm: Move a few m...
275
276
277
278
   * drm_for_each_fb - iterate over all framebuffers
   * @fb: the loop cursor
   * @dev: the DRM device
   *
d574528a6   Daniel Vetter   drm/kms-core: Use...
279
280
   * Iterate over all framebuffers of @dev. User must hold
   * &drm_mode_config.fb_lock.
afb21ea63   Daniel Vetter   drm: Move a few m...
281
282
283
284
285
286
287
   */
  #define drm_for_each_fb(fb, dev) \
  	for (WARN_ON(!mutex_is_locked(&(dev)->mode_config.fb_lock)),		\
  	     fb = list_first_entry(&(dev)->mode_config.fb_list,	\
  					  struct drm_framebuffer, head);	\
  	     &fb->head != (&(dev)->mode_config.fb_list);			\
  	     fb = list_next_entry(fb, head))
8f8f6a6c3   Ville Syrjälä   drm: Add drm_fram...
288
289
290
291
292
  
  int drm_framebuffer_plane_width(int width,
  				const struct drm_framebuffer *fb, int plane);
  int drm_framebuffer_plane_height(int height,
  				 const struct drm_framebuffer *fb, int plane);
55f7f7275   Andrzej Pietrasiewicz   drm/core: Add drm...
293
294
295
296
297
298
299
300
301
302
303
  /**
   * struct drm_afbc_framebuffer - a special afbc frame buffer object
   *
   * A derived class of struct drm_framebuffer, dedicated for afbc use cases.
   */
  struct drm_afbc_framebuffer {
  	/**
  	 * @base: base framebuffer structure.
  	 */
  	struct drm_framebuffer base;
  	/**
303973aae   Sam Ravnborg   drm/fb: fix kerne...
304
  	 * @block_width: width of a single afbc block
55f7f7275   Andrzej Pietrasiewicz   drm/core: Add drm...
305
306
307
  	 */
  	u32 block_width;
  	/**
303973aae   Sam Ravnborg   drm/fb: fix kerne...
308
  	 * @block_height: height of a single afbc block
55f7f7275   Andrzej Pietrasiewicz   drm/core: Add drm...
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
  	 */
  	u32 block_height;
  	/**
  	 * @aligned_width: aligned frame buffer width
  	 */
  	u32 aligned_width;
  	/**
  	 * @aligned_height: aligned frame buffer height
  	 */
  	u32 aligned_height;
  	/**
  	 * @offset: offset of the first afbc header
  	 */
  	u32 offset;
  	/**
  	 * @afbc_size: minimum size of afbc buffer
  	 */
  	u32 afbc_size;
55f7f7275   Andrzej Pietrasiewicz   drm/core: Add drm...
327
328
329
  };
  
  #define fb_to_afbc_fb(x) container_of(x, struct drm_afbc_framebuffer, base)
7520a277d   Daniel Vetter   drm: Extract drm_...
330
  #endif