9239f3e180
Add constants for the maximum size of the shadow-plane surface size. Useful for shadow planes with virtual screen sizes. The current sizes are 4096 scanlines with 4096 pixels each. This seems reasonable for current hardware, but can be increased as necessary. In simpledrm, set the maximum framebuffer size from the constants for shadow planes. Implements support for virtual screen sizes and page flipping on the fbdev console. v3: * use decimal numbers for shadow-plane constants (Noralf) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Acked-by: Noralf Trønnes <noralf@tronnes.org> Link: https://patchwork.freedesktop.org/patch/msgid/20211110103702.374-9-tzimmermann@suse.de
147 lines
5.3 KiB
C
147 lines
5.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#ifndef __DRM_GEM_ATOMIC_HELPER_H__
|
|
#define __DRM_GEM_ATOMIC_HELPER_H__
|
|
|
|
#include <linux/dma-buf-map.h>
|
|
|
|
#include <drm/drm_fourcc.h>
|
|
#include <drm/drm_plane.h>
|
|
|
|
struct drm_simple_display_pipe;
|
|
|
|
/*
|
|
* Plane Helpers
|
|
*/
|
|
|
|
int drm_gem_plane_helper_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state);
|
|
int drm_gem_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
|
|
struct drm_plane_state *plane_state);
|
|
|
|
/*
|
|
* Helpers for planes with shadow buffers
|
|
*/
|
|
|
|
/**
|
|
* DRM_SHADOW_PLANE_MAX_WIDTH - Maximum width of a plane's shadow buffer in pixels
|
|
*
|
|
* For drivers with shadow planes, the maximum width of the framebuffer is
|
|
* usually independent from hardware limitations. Drivers can initialize struct
|
|
* drm_mode_config.max_width from DRM_SHADOW_PLANE_MAX_WIDTH.
|
|
*/
|
|
#define DRM_SHADOW_PLANE_MAX_WIDTH (4096u)
|
|
|
|
/**
|
|
* DRM_SHADOW_PLANE_MAX_HEIGHT - Maximum height of a plane's shadow buffer in scanlines
|
|
*
|
|
* For drivers with shadow planes, the maximum height of the framebuffer is
|
|
* usually independent from hardware limitations. Drivers can initialize struct
|
|
* drm_mode_config.max_height from DRM_SHADOW_PLANE_MAX_HEIGHT.
|
|
*/
|
|
#define DRM_SHADOW_PLANE_MAX_HEIGHT (4096u)
|
|
|
|
/**
|
|
* struct drm_shadow_plane_state - plane state for planes with shadow buffers
|
|
*
|
|
* For planes that use a shadow buffer, struct drm_shadow_plane_state
|
|
* provides the regular plane state plus mappings of the shadow buffer
|
|
* into kernel address space.
|
|
*/
|
|
struct drm_shadow_plane_state {
|
|
/** @base: plane state */
|
|
struct drm_plane_state base;
|
|
|
|
/* Transitional state - do not export or duplicate */
|
|
|
|
/**
|
|
* @map: Mappings of the plane's framebuffer BOs in to kernel address space
|
|
*
|
|
* The memory mappings stored in map should be established in the plane's
|
|
* prepare_fb callback and removed in the cleanup_fb callback.
|
|
*/
|
|
struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
|
|
|
|
/**
|
|
* @data: Address of each framebuffer BO's data
|
|
*
|
|
* The address of the data stored in each mapping. This is different
|
|
* for framebuffers with non-zero offset fields.
|
|
*/
|
|
struct dma_buf_map data[DRM_FORMAT_MAX_PLANES];
|
|
};
|
|
|
|
/**
|
|
* to_drm_shadow_plane_state - upcasts from struct drm_plane_state
|
|
* @state: the plane state
|
|
*/
|
|
static inline struct drm_shadow_plane_state *
|
|
to_drm_shadow_plane_state(struct drm_plane_state *state)
|
|
{
|
|
return container_of(state, struct drm_shadow_plane_state, base);
|
|
}
|
|
|
|
void __drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane,
|
|
struct drm_shadow_plane_state *new_shadow_plane_state);
|
|
void __drm_gem_destroy_shadow_plane_state(struct drm_shadow_plane_state *shadow_plane_state);
|
|
void __drm_gem_reset_shadow_plane(struct drm_plane *plane,
|
|
struct drm_shadow_plane_state *shadow_plane_state);
|
|
|
|
void drm_gem_reset_shadow_plane(struct drm_plane *plane);
|
|
struct drm_plane_state *drm_gem_duplicate_shadow_plane_state(struct drm_plane *plane);
|
|
void drm_gem_destroy_shadow_plane_state(struct drm_plane *plane,
|
|
struct drm_plane_state *plane_state);
|
|
|
|
/**
|
|
* DRM_GEM_SHADOW_PLANE_FUNCS -
|
|
* Initializes struct drm_plane_funcs for shadow-buffered planes
|
|
*
|
|
* Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
|
|
* macro initializes struct drm_plane_funcs to use the rsp helper functions.
|
|
*/
|
|
#define DRM_GEM_SHADOW_PLANE_FUNCS \
|
|
.reset = drm_gem_reset_shadow_plane, \
|
|
.atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \
|
|
.atomic_destroy_state = drm_gem_destroy_shadow_plane_state
|
|
|
|
int drm_gem_prepare_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
|
void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
|
|
|
/**
|
|
* DRM_GEM_SHADOW_PLANE_HELPER_FUNCS -
|
|
* Initializes struct drm_plane_helper_funcs for shadow-buffered planes
|
|
*
|
|
* Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
|
|
* macro initializes struct drm_plane_helper_funcs to use the rsp helper
|
|
* functions.
|
|
*/
|
|
#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \
|
|
.prepare_fb = drm_gem_prepare_shadow_fb, \
|
|
.cleanup_fb = drm_gem_cleanup_shadow_fb
|
|
|
|
int drm_gem_simple_kms_prepare_shadow_fb(struct drm_simple_display_pipe *pipe,
|
|
struct drm_plane_state *plane_state);
|
|
void drm_gem_simple_kms_cleanup_shadow_fb(struct drm_simple_display_pipe *pipe,
|
|
struct drm_plane_state *plane_state);
|
|
void drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe);
|
|
struct drm_plane_state *
|
|
drm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe);
|
|
void drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pipe *pipe,
|
|
struct drm_plane_state *plane_state);
|
|
|
|
/**
|
|
* DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS -
|
|
* Initializes struct drm_simple_display_pipe_funcs for shadow-buffered planes
|
|
*
|
|
* Drivers may use GEM BOs as shadow buffers over the framebuffer memory. This
|
|
* macro initializes struct drm_simple_display_pipe_funcs to use the rsp helper
|
|
* functions.
|
|
*/
|
|
#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \
|
|
.prepare_fb = drm_gem_simple_kms_prepare_shadow_fb, \
|
|
.cleanup_fb = drm_gem_simple_kms_cleanup_shadow_fb, \
|
|
.reset_plane = drm_gem_simple_kms_reset_shadow_plane, \
|
|
.duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \
|
|
.destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state
|
|
|
|
#endif /* __DRM_GEM_ATOMIC_HELPER_H__ */
|