Blame view
include/drm/drm_framebuffer.h
10.3 KB
7520a277d 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 drm: Extract drm_... |
25 |
#include <linux/ctype.h> |
2513147dc drm: make drm_fra... |
26 27 |
#include <linux/list.h> #include <linux/sched.h> |
949619f32 drm: Extract drm_... |
28 |
#include <drm/drm_mode_object.h> |
7520a277d drm: Extract drm_... |
29 |
|
2513147dc drm: make drm_fra... |
30 |
struct drm_clip_rect; |
7520a277d drm: Extract drm_... |
31 |
struct drm_device; |
2513147dc drm: make drm_fra... |
32 |
struct drm_file; |
2471e7a53 drm: Forward-decl... |
33 |
struct drm_format_info; |
2513147dc drm: make drm_fra... |
34 35 |
struct drm_framebuffer; struct drm_gem_object; |
7520a277d 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 drm/kms-core: Use... |
46 47 |
* framebuffer successfully created by calling * &drm_mode_config_funcs.fb_create. Drivers must also call |
7520a277d 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 drm/doc: use pref... |
57 |
* GEM or TTM) valid for the passed-in &struct drm_file. This is used by |
7520a277d 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 drm/fb: document ... |
88 89 90 |
* Atomic drivers should use drm_atomic_helper_dirtyfb() to implement * this hook. * |
7520a277d 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 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 drm: Introduce dr... |
109 110 |
* userspace perspective. See drm_framebuffer_get() and * drm_framebuffer_put(). |
750fb8c43 drm/doc: Update d... |
111 112 113 |
* * The refcount is stored inside the mode object @base. */ |
7520a277d drm: Extract drm_... |
114 |
struct drm_framebuffer { |
750fb8c43 drm/doc: Update d... |
115 116 117 |
/** * @dev: DRM device this framebuffer belongs to */ |
7520a277d drm: Extract drm_... |
118 |
struct drm_device *dev; |
750fb8c43 drm/doc: Update d... |
119 |
/** |
d574528a6 drm/kms-core: Use... |
120 121 |
* @head: Place on the &drm_mode_config.fb_list, access protected by * &drm_mode_config.fb_lock. |
7520a277d drm: Extract drm_... |
122 123 |
*/ struct list_head head; |
750fb8c43 drm/doc: Update d... |
124 125 126 127 |
/** * @base: base modeset object structure, contains the reference count. */ |
7520a277d drm: Extract drm_... |
128 |
struct drm_mode_object base; |
8d44e9e69 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 drm/doc: Update d... |
134 |
/** |
e14c23c64 drm: Store a poin... |
135 136 137 138 |
* @format: framebuffer format information */ const struct drm_format_info *format; /** |
750fb8c43 drm/doc: Update d... |
139 140 |
* @funcs: framebuffer vfunc table */ |
7520a277d drm: Extract drm_... |
141 |
const struct drm_framebuffer_funcs *funcs; |
750fb8c43 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 drm: Extract drm_... |
146 |
unsigned int pitches[4]; |
750fb8c43 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 drm/doc: use pref... |
162 |
* instead done through the source rectangle in &struct drm_plane_state. |
750fb8c43 drm/doc: Update d... |
163 |
*/ |
7520a277d drm: Extract drm_... |
164 |
unsigned int offsets[4]; |
750fb8c43 drm/doc: Update d... |
165 |
/** |
bae781b25 drm: Nuke modifie... |
166 |
* @modifier: Data layout modifier. This is used to describe |
750fb8c43 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 drm: Nuke modifie... |
171 |
uint64_t modifier; |
750fb8c43 drm/doc: Update d... |
172 173 174 175 |
/** * @width: Logical width of the visible area of the framebuffer, in * pixels. */ |
7520a277d drm: Extract drm_... |
176 |
unsigned int width; |
750fb8c43 drm/doc: Update d... |
177 178 179 180 |
/** * @height: Logical height of the visible area of the framebuffer, in * pixels. */ |
7520a277d drm: Extract drm_... |
181 |
unsigned int height; |
750fb8c43 drm/doc: Update d... |
182 |
/** |
750fb8c43 drm/doc: Update d... |
183 184 185 |
* @flags: Framebuffer flags like DRM_MODE_FB_INTERLACED or * DRM_MODE_FB_MODIFIERS. */ |
7520a277d drm: Extract drm_... |
186 |
int flags; |
750fb8c43 drm/doc: Update d... |
187 |
/** |
750fb8c43 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 drm: Extract drm_... |
192 |
int hot_x; |
750fb8c43 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 drm: Extract drm_... |
198 |
int hot_y; |
750fb8c43 drm/doc: Update d... |
199 |
/** |
d574528a6 drm/kms-core: Use... |
200 |
* @filp_head: Placed on &drm_file.fbs, protected by &drm_file.fbs_lock. |
750fb8c43 drm/doc: Update d... |
201 |
*/ |
7520a277d drm: Extract drm_... |
202 |
struct list_head filp_head; |
4c3dbb2c3 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 drm: Extract drm_... |
210 |
}; |
afb21ea63 drm: Move a few m... |
211 |
#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) |
7520a277d 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 drm: Pass struct ... |
216 |
struct drm_file *file_priv, |
7520a277d 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 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 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 drm/framebuffer: ... |
251 |
static inline uint32_t drm_framebuffer_read_refcount(const struct drm_framebuffer *fb) |
7520a277d drm: Extract drm_... |
252 |
{ |
2c935bc57 locking/atomic, k... |
253 |
return kref_read(&fb->base.refcount); |
7520a277d drm: Extract drm_... |
254 |
} |
afb21ea63 drm: Move a few m... |
255 256 |
/** |
389f78b36 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 drm: Introduce dr... |
268 |
drm_framebuffer_get(fb); |
389f78b36 drm: Introduce dr... |
269 |
if (*p) |
a4a69da06 drm: Introduce dr... |
270 |
drm_framebuffer_put(*p); |
389f78b36 drm: Introduce dr... |
271 272 273 274 |
*p = fb; } /* |
afb21ea63 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 drm/kms-core: Use... |
279 280 |
* Iterate over all framebuffers of @dev. User must hold * &drm_mode_config.fb_lock. |
afb21ea63 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 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 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 drm/fb: fix kerne... |
304 |
* @block_width: width of a single afbc block |
55f7f7275 drm/core: Add drm... |
305 306 307 |
*/ u32 block_width; /** |
303973aae drm/fb: fix kerne... |
308 |
* @block_height: height of a single afbc block |
55f7f7275 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 drm/core: Add drm... |
327 328 329 |
}; #define fb_to_afbc_fb(x) container_of(x, struct drm_afbc_framebuffer, base) |
7520a277d drm: Extract drm_... |
330 |
#endif |