summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/display/intel_fbdev.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2024-06-12 23:47:06 +0300
committerVille Syrjälä <ville.syrjala@linux.intel.com>2024-06-24 17:09:50 +0300
commit195b7a0d2ebe5672a58210992f3629d19d5a95ae (patch)
tree7918d3662ad607f29ecebd03fba9e322f5dd19fb /drivers/gpu/drm/i915/display/intel_fbdev.c
parent1c5f18d88eae348cf45f90aaee7b361f593b0701 (diff)
downloadlinux-195b7a0d2ebe5672a58210992f3629d19d5a95ae.tar.xz
drm/i915: Introduce the plane->min_alignment() vfunc
Different hardware generations have different scanout alignment requirements. Introduce a new vfunc that will allow us to make that distinction without horrible if-ladders. For now we directly plug in the existing intel_surf_alignment() and intel_cursor_alignment() functions. For fbdev we (temporarily) introduce intel_fbdev_min_alignment() that simply queries the alignment from the primary plane of the first crtc. TODO: someone will need to fix xe's alignment handling Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240612204712.31404-4-ville.syrjala@linux.intel.com Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_fbdev.c')
-rw-r--r--drivers/gpu/drm/i915/display/intel_fbdev.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 37ae176bfeb0..6e5f88f20482 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -47,6 +47,7 @@
#include "gem/i915_gem_object.h"
#include "i915_drv.h"
+#include "intel_crtc.h"
#include "intel_display_types.h"
#include "intel_fb.h"
#include "intel_fb_pin.h"
@@ -172,6 +173,21 @@ static const struct fb_ops intelfb_ops = {
__diag_pop();
+static unsigned int intel_fbdev_min_alignment(const struct drm_framebuffer *fb)
+{
+ struct drm_i915_private *i915 = to_i915(fb->dev);
+ struct intel_plane *plane;
+ struct intel_crtc *crtc;
+
+ crtc = intel_first_crtc(i915);
+ if (!crtc)
+ return 0;
+
+ plane = to_intel_plane(crtc->base.primary);
+
+ return plane->min_alignment(plane, fb, 0);
+}
+
static int intelfb_create(struct drm_fb_helper *helper,
struct drm_fb_helper_surface_size *sizes)
{
@@ -228,8 +244,9 @@ static int intelfb_create(struct drm_fb_helper *helper,
* This also validates that any existing fb inherited from the
* BIOS is suitable for own access.
*/
- vma = intel_fb_pin_to_ggtt(&fb->base, false,
- &view, false, &flags);
+ vma = intel_fb_pin_to_ggtt(&fb->base, &view,
+ intel_fbdev_min_alignment(&fb->base), 0,
+ false, &flags);
if (IS_ERR(vma)) {
ret = PTR_ERR(vma);
goto out_unlock;