Cc: Jocelyn Falempe <[email protected]>
Signed-off-by: Jani Nikula <[email protected]>
---
.../drm/i915/display/intel_display_types.h | 1 -
drivers/gpu/drm/i915/display/intel_parent.c | 5 ++--
drivers/gpu/drm/i915/display/intel_parent.h | 3 ++-
drivers/gpu/drm/i915/display/intel_plane.c | 8 +++---
drivers/gpu/drm/i915/gem/i915_gem_panic.c | 26 +++++++++++--------
drivers/gpu/drm/xe/display/xe_panic.c | 15 ++++++-----
include/drm/intel/display_parent_interface.h | 3 ++-
7 files changed, 35 insertions(+), 26 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
b/drivers/gpu/drm/i915/display/intel_display_types.h
index c21e0c0ef0b1..234fae44fb16 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -150,7 +150,6 @@ struct intel_framebuffer {
unsigned int min_alignment;
unsigned int vtd_guard;
- unsigned int (*panic_tiling)(unsigned int x, unsigned int y, unsigned int width);
struct intel_panic *panic;
};
diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
index 0b2bc2d38442..a5e41ea66921 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -252,9 +252,10 @@ struct intel_panic *intel_parent_panic_alloc(struct
intel_display *display)
}
int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
- struct drm_scanout_buffer *sb, struct
drm_gem_object *obj)
+ struct drm_scanout_buffer *sb, struct
drm_gem_object *obj,
+ unsigned int (*tiling)(unsigned int x, unsigned
int y, unsigned int width))
{
- return display->parent->panic->setup(panic, sb, obj);
+ return display->parent->panic->setup(panic, sb, obj, tiling);
}
void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic)
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h
b/drivers/gpu/drm/i915/display/intel_parent.h
index 4197d1b1af61..595d4148b8eb 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -106,7 +106,8 @@ void intel_parent_overlay_cleanup(struct intel_display
*display);
/* panic */
struct intel_panic *intel_parent_panic_alloc(struct intel_display *display);
int intel_parent_panic_setup(struct intel_display *display, struct
intel_panic *panic,
- struct drm_scanout_buffer *sb, struct
drm_gem_object *obj);
+ struct drm_scanout_buffer *sb, struct
drm_gem_object *obj,
+ unsigned int (*tiling)(unsigned int x, unsigned
int y, unsigned int width));
void intel_parent_panic_finish(struct intel_display *display, struct
intel_panic *panic);
/* pc8 */
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c
b/drivers/gpu/drm/i915/display/intel_plane.c
index 75eae994433d..e2745b3be105 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -1580,17 +1580,17 @@ static int intel_get_scanout_buffer(struct drm_plane
*plane,
if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
intel_fbdev_get_map(display, &sb->map[0]);
} else {
+ unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned
int width) = NULL;
int ret;
/* Can't disable tiling if DPT is in use */
if (intel_fb_uses_dpt(&fb->base)) {
if (fb->base.format->cpp[0] != 4)
return -EOPNOTSUPP;
- fb->panic_tiling =
intel_get_tiling_func(fb->base.modifier);
- if (!fb->panic_tiling)
+ tiling = intel_get_tiling_func(fb->base.modifier);
+ if (!tiling)
return -EOPNOTSUPP;
}
- sb->private = fb;
- ret = intel_parent_panic_setup(display, fb->panic, sb, obj);
+ ret = intel_parent_panic_setup(display, fb->panic, sb, obj,
tiling);
if (ret)
return ret;
}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
index 001ccfbf7ab7..91389d36f101 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -5,7 +5,6 @@
#include <drm/drm_panic.h>
#include <drm/intel/display_parent_interface.h>
-#include "display/intel_display_types.h"
#include "i915_gem_object.h"
#include "i915_gem_panic.h"
@@ -13,6 +12,8 @@ struct intel_panic {
struct page **pages;
int page;
void *vaddr;
+
+ unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int
width);
};
static void i915_panic_kunmap(struct intel_panic *panic)
@@ -45,8 +46,8 @@ static struct page **i915_gem_object_panic_pages(struct
drm_i915_gem_object *obj
static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer
*sb, unsigned int x,
unsigned int y, u32 color)
{
- struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
- unsigned int offset = fb->panic_tiling(sb->width, x, y);
+ struct intel_panic *panic = sb->private;
+ unsigned int offset = panic->tiling(sb->width, x, y);
iosys_map_wr(&sb->map[0], offset, u32, color);
}
@@ -59,13 +60,12 @@ static void i915_gem_object_panic_map_set_pixel(struct
drm_scanout_buffer *sb, u
static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer
*sb, unsigned int x,
unsigned int y, u32 color)
{
+ struct intel_panic *panic = sb->private;
unsigned int new_page;
unsigned int offset;
- struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
- struct intel_panic *panic = fb->panic;
- if (fb->panic_tiling)
- offset = fb->panic_tiling(sb->width, x, y);
+ if (panic->tiling)
+ offset = panic->tiling(sb->width, x, y);
else
offset = y * sb->pitch[0] + x * sb->format->cpp[0];
@@ -98,14 +98,15 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
* pfn is not supported yet.
*/
static int i915_gem_object_panic_setup(struct intel_panic *panic, struct
drm_scanout_buffer *sb,
- struct drm_gem_object *_obj)
+ struct drm_gem_object *_obj,
+ unsigned int (*tiling)(unsigned int x,
unsigned int y, unsigned int width))
{
- struct intel_framebuffer *fb = sb->private;
- bool panic_tiling = fb->panic_tiling;
enum i915_map_type has_type;
struct drm_i915_gem_object *obj = to_intel_bo(_obj);
void *ptr;
+ sb->private = panic;
+
ptr = page_unpack_bits(obj->mm.mapping, &has_type);
if (ptr) {
if (i915_gem_object_has_iomem(obj))
@@ -113,8 +114,10 @@ static int i915_gem_object_panic_setup(struct intel_panic
*panic, struct drm_sca
else
iosys_map_set_vaddr(&sb->map[0], ptr);
- if (panic_tiling)
+ if (tiling) {
+ panic->tiling = tiling;
sb->set_pixel = i915_gem_object_panic_map_set_pixel;
+ }
return 0;
}
if (i915_gem_object_has_struct_page(obj)) {
@@ -122,6 +125,7 @@ static int i915_gem_object_panic_setup(struct intel_panic
*panic, struct drm_sca
if (!panic->pages)
return -ENOMEM;
panic->page = -1;
+ panic->tiling = tiling;
sb->set_pixel = i915_gem_object_panic_page_set_pixel;
return 0;
}
diff --git a/drivers/gpu/drm/xe/display/xe_panic.c
b/drivers/gpu/drm/xe/display/xe_panic.c
index 4b86760ec00a..12c6fb99015d 100644
--- a/drivers/gpu/drm/xe/display/xe_panic.c
+++ b/drivers/gpu/drm/xe/display/xe_panic.c
@@ -5,7 +5,6 @@
#include <drm/drm_panic.h>
#include <drm/intel/display_parent_interface.h>
-#include "intel_display_types.h"
#include "xe_bo.h"
#include "xe_panic.h"
#include "xe_res_cursor.h"
@@ -17,6 +16,7 @@ struct intel_panic {
int page;
struct xe_bo *bo;
+ unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int
width);
};
static void xe_panic_kunmap(struct intel_panic *panic)
@@ -37,14 +37,13 @@ static void xe_panic_kunmap(struct intel_panic *panic)
static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned
int x,
unsigned int y, u32 color)
{
- struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
- struct intel_panic *panic = fb->panic;
+ struct intel_panic *panic = sb->private;
struct xe_bo *bo = panic->bo;
unsigned int new_page;
unsigned int offset;
- if (fb->panic_tiling)
- offset = fb->panic_tiling(sb->width, x, y);
+ if (panic->tiling)
+ offset = panic->tiling(sb->width, x, y);
else
offset = y * sb->pitch[0] + x * sb->format->cpp[0];
@@ -86,7 +85,8 @@ static struct intel_panic *xe_panic_alloc(void)
}
static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
- struct drm_gem_object *obj)
+ struct drm_gem_object *obj,
+ unsigned int (*tiling)(unsigned int x, unsigned int
y, unsigned int width))
{
struct xe_bo *bo = gem_to_xe_bo(obj);
@@ -95,8 +95,11 @@ static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *
panic->page = -1;
panic->bo = bo;
+ panic->tiling = tiling;
+ sb->private = panic;
sb->set_pixel = xe_panic_page_set_pixel;
+
return 0;
}
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index b0362e231d84..de395df9ca30 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -168,7 +168,8 @@ struct intel_display_overlay_interface {
struct intel_display_panic_interface {
struct intel_panic *(*alloc)(void);
int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb,
- struct drm_gem_object *obj);
+ struct drm_gem_object *obj,
+ unsigned int (*tiling)(unsigned int x, unsigned int y,
unsigned int width));
void (*finish)(struct intel_panic *panic);
};