Commit 9239f3e1 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/simpledrm: Support virtual screen sizes

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarNoralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211110103702.374-9-tzimmermann@suse.de
parent 0dd80b48
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/of_clk.h> #include <linux/of_clk.h>
#include <linux/minmax.h>
#include <linux/platform_data/simplefb.h> #include <linux/platform_data/simplefb.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
...@@ -772,6 +773,7 @@ static int simpledrm_device_init_modeset(struct simpledrm_device *sdev) ...@@ -772,6 +773,7 @@ static int simpledrm_device_init_modeset(struct simpledrm_device *sdev)
struct drm_display_mode *mode = &sdev->mode; struct drm_display_mode *mode = &sdev->mode;
struct drm_connector *connector = &sdev->connector; struct drm_connector *connector = &sdev->connector;
struct drm_simple_display_pipe *pipe = &sdev->pipe; struct drm_simple_display_pipe *pipe = &sdev->pipe;
unsigned long max_width, max_height;
const uint32_t *formats; const uint32_t *formats;
size_t nformats; size_t nformats;
int ret; int ret;
...@@ -780,10 +782,13 @@ static int simpledrm_device_init_modeset(struct simpledrm_device *sdev) ...@@ -780,10 +782,13 @@ static int simpledrm_device_init_modeset(struct simpledrm_device *sdev)
if (ret) if (ret)
return ret; return ret;
max_width = max_t(unsigned long, mode->hdisplay, DRM_SHADOW_PLANE_MAX_WIDTH);
max_height = max_t(unsigned long, mode->vdisplay, DRM_SHADOW_PLANE_MAX_HEIGHT);
dev->mode_config.min_width = mode->hdisplay; dev->mode_config.min_width = mode->hdisplay;
dev->mode_config.max_width = mode->hdisplay; dev->mode_config.max_width = max_width;
dev->mode_config.min_height = mode->vdisplay; dev->mode_config.min_height = mode->vdisplay;
dev->mode_config.max_height = mode->vdisplay; dev->mode_config.max_height = max_height;
dev->mode_config.prefer_shadow_fbdev = true; dev->mode_config.prefer_shadow_fbdev = true;
dev->mode_config.preferred_depth = sdev->format->cpp[0] * 8; dev->mode_config.preferred_depth = sdev->format->cpp[0] * 8;
dev->mode_config.funcs = &simpledrm_mode_config_funcs; dev->mode_config.funcs = &simpledrm_mode_config_funcs;
......
...@@ -22,6 +22,24 @@ int drm_gem_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe, ...@@ -22,6 +22,24 @@ int drm_gem_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
* Helpers for planes with shadow buffers * 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 * struct drm_shadow_plane_state - plane state for planes with shadow buffers
* *
......
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