1
This is a draft of drm_panic support for i915.
1
This is a draft of drm_panic support for i915.
2
2
3
I've tested it on the 4 intel laptops I have at my disposal.
3
I've tested it on the 4 intel laptops I have at my disposal.
4
* Haswell with 128MB of eDRAM.
4
* Haswell with 128MB of eDRAM.
5
* Comet Lake.
5
* Comet Lake i7-10850H
6
* Alder Lake (with DPT, and Y-tiling).
6
* Raptor Lake i7-1370P (with DPT, and Y-tiling).
7
* Lunar Lake (with DPT, and 4-tiling, and using the Xe driver.
7
* Lunar Lake Ultra 5 228V (with DPT, and 4-tiling, and using the Xe driver.
8
8
9
I tested panic in both fbdev console and gnome desktop.
9
I tested panic in both fbdev console and gnome desktop.
10
10
11
Best regards,
11
Best regards,
12
12
...
...
19
19
20
v4:
20
v4:
21
* Add support for Xe driver, which shares most of the code.
21
* Add support for Xe driver, which shares most of the code.
22
* Add support for 4-tiled framebuffer found in newest GPU.
22
* Add support for 4-tiled framebuffer found in newest GPU.
23
23
24
v5:
25
* Rebase on top of git@gitlab.freedesktop.org:drm/i915/kernel.git drm-intel-next
26
* Use struct intel_display instead of drm_i915_private.
27
* Use iosys_map for intel_bo_panic_map().
28
29
v6:
30
* Rebase on top of git@gitlab.freedesktop.org:drm/i915/kernel.git drm-intel-next
31
* Use struct intel_display instead of drm_i915_private for intel_atomic_plane.c
32
24
Jocelyn Falempe (8):
33
Jocelyn Falempe (8):
25
drm/i915/fbdev: Add intel_fbdev_get_map()
34
drm/i915/fbdev: Add intel_fbdev_get_map()
26
drm/i915/display/i9xx: Add a disable_tiling() for i9xx planes
35
drm/i915/display/i9xx: Add a disable_tiling() for i9xx planes
27
drm/i915/display: Add a disable_tiling() for skl planes
36
drm/i915/display: Add a disable_tiling() for skl planes
28
drm/i915/gem: Add i915_gem_object_panic_map()
37
drm/i915/gem: Add i915_gem_object_panic_map()
29
drm/i915/display: Add drm_panic support
38
drm/i915/display: Add drm_panic support
30
drm/i915/display: Flush the front buffer in panic handler
39
drm/i915/display: Flush the front buffer in panic handler
31
drm/i915/display: Add drm_panic support for Y-tiling with DPT
40
drm/i915/display: Add drm_panic support for Y-tiling with DPT
32
drm/i915: Add drm_panic support for 4-tiling with DPT
41
drm/i915/display: Add drm_panic support for 4-tiling with DPT
33
42
34
drivers/gpu/drm/i915/display/i9xx_plane.c | 23 +++
43
drivers/gpu/drm/i915/display/i9xx_plane.c | 23 +++
35
.../gpu/drm/i915/display/intel_atomic_plane.c | 177 +++++++++++++++++-
44
.../gpu/drm/i915/display/intel_atomic_plane.c | 169 +++++++++++++++++-
36
drivers/gpu/drm/i915/display/intel_bo.c | 10 +
45
drivers/gpu/drm/i915/display/intel_bo.c | 5 +
37
drivers/gpu/drm/i915/display/intel_bo.h | 2 +
46
drivers/gpu/drm/i915/display/intel_bo.h | 1 +
38
.../drm/i915/display/intel_display_types.h | 2 +
47
.../drm/i915/display/intel_display_types.h | 2 +
39
drivers/gpu/drm/i915/display/intel_fb_pin.c | 5 +
48
drivers/gpu/drm/i915/display/intel_fb_pin.c | 5 +
40
drivers/gpu/drm/i915/display/intel_fb_pin.h | 2 +
49
drivers/gpu/drm/i915/display/intel_fb_pin.h | 2 +
41
drivers/gpu/drm/i915/display/intel_fbdev.c | 5 +
50
drivers/gpu/drm/i915/display/intel_fbdev.c | 5 +
42
drivers/gpu/drm/i915/display/intel_fbdev.h | 6 +
51
drivers/gpu/drm/i915/display/intel_fbdev.h | 6 +-
43
.../drm/i915/display/skl_universal_plane.c | 27 +++
52
.../drm/i915/display/skl_universal_plane.c | 27 +++
44
drivers/gpu/drm/i915/gem/i915_gem_object.h | 2 +
53
drivers/gpu/drm/i915/gem/i915_gem_object.h | 2 +
45
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 25 +++
54
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 29 +++
46
drivers/gpu/drm/i915/i915_vma.h | 5 +
55
drivers/gpu/drm/i915/i915_vma.h | 5 +
47
drivers/gpu/drm/xe/display/intel_bo.c | 17 ++
56
drivers/gpu/drm/xe/display/intel_bo.c | 10 ++
48
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +
57
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +
49
15 files changed, 312 insertions(+), 1 deletion(-)
58
15 files changed, 294 insertions(+), 2 deletions(-)
50
59
51
60
52
base-commit: ff3881cc6a588f8cd714c9ffbbcc9ef6b02c8d0f
61
base-commit: 010363c4618920838ca8777fdabd46871d289bf9
53
--
62
--
54
2.47.1
63
2.49.0
diff view generated by jsdifflib
...
...
4
requires a few functions to access fbdev->vma->iomap.
4
requires a few functions to access fbdev->vma->iomap.
5
5
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
7
---
7
---
8
8
9
10
v2:
9
v2:
11
* Add intel_fb_get_vaddr() and i915_vma_get_iomap() to build with Xe driver.
10
* Add intel_fb_get_vaddr() and i915_vma_get_iomap() to build with Xe driver.
12
11
13
v4:
12
v4:
14
* rename to get_map(), and return the struct iosys_map mapping.
13
* rename to get_map(), and return the struct iosys_map mapping.
15
* implement the Xe variant.
14
* implement the Xe variant.
16
15
17
drivers/gpu/drm/i915/display/intel_fb_pin.c | 5 +++++
16
drivers/gpu/drm/i915/display/intel_fb_pin.c | 5 +++++
18
drivers/gpu/drm/i915/display/intel_fb_pin.h | 2 ++
17
drivers/gpu/drm/i915/display/intel_fb_pin.h | 2 ++
19
drivers/gpu/drm/i915/display/intel_fbdev.c | 5 +++++
18
drivers/gpu/drm/i915/display/intel_fbdev.c | 5 +++++
20
drivers/gpu/drm/i915/display/intel_fbdev.h | 6 ++++++
19
drivers/gpu/drm/i915/display/intel_fbdev.h | 6 +++++-
21
drivers/gpu/drm/i915/i915_vma.h | 5 +++++
20
drivers/gpu/drm/i915/i915_vma.h | 5 +++++
22
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +++++
21
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +++++
23
6 files changed, 28 insertions(+)
22
6 files changed, 27 insertions(+), 1 deletion(-)
24
23
25
diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.c b/drivers/gpu/drm/i915/display/intel_fb_pin.c
24
diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.c b/drivers/gpu/drm/i915/display/intel_fb_pin.c
26
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
27
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.c
26
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.c
28
+++ b/drivers/gpu/drm/i915/display/intel_fb_pin.c
27
+++ b/drivers/gpu/drm/i915/display/intel_fb_pin.c
...
...
46
+struct iosys_map;
45
+struct iosys_map;
47
46
48
struct i915_vma *
47
struct i915_vma *
49
intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,
48
intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,
50
@@ -XXX,XX +XXX,XX @@ void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags);
49
@@ -XXX,XX +XXX,XX @@ void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags);
51
50
int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
52
int intel_plane_pin_fb(struct intel_plane_state *plane_state);
51
         const struct intel_plane_state *old_plane_state);
53
void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
52
void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
54
+void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map);
53
+void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map);
55
54
56
#endif
55
#endif
57
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
56
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
58
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
59
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
58
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
60
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
59
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
61
@@ -XXX,XX +XXX,XX @@ struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev)
60
@@ -XXX,XX +XXX,XX @@ struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev)
62
61
{
63
    return to_intel_framebuffer(fbdev->helper.fb);
62
    return fbdev ? fbdev->vma : NULL;
64
}
63
}
65
+
64
+
66
+void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
65
+void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
67
+{
66
+{
68
+    intel_fb_get_map(fbdev->vma, map);
67
+    intel_fb_get_map(fbdev->vma, map);
69
+}
68
+}
70
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h b/drivers/gpu/drm/i915/display/intel_fbdev.h
69
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h b/drivers/gpu/drm/i915/display/intel_fbdev.h
71
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
72
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
71
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
73
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
72
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
74
@@ -XXX,XX +XXX,XX @@ struct drm_device;
73
@@ -XXX,XX +XXX,XX @@ struct drm_fb_helper_surface_size;
75
struct drm_i915_private;
74
struct drm_i915_private;
76
struct intel_fbdev;
75
struct intel_fbdev;
77
struct intel_framebuffer;
76
struct intel_framebuffer;
78
+struct iosys_map;
77
+struct iosys_map;
79
78
80
#ifdef CONFIG_DRM_FBDEV_EMULATION
79
#ifdef CONFIG_DRM_FBDEV_EMULATION
80
int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
81
@@ -XXX,XX +XXX,XX @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
81
void intel_fbdev_setup(struct drm_i915_private *dev_priv);
82
void intel_fbdev_setup(struct drm_i915_private *dev_priv);
82
void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous);
83
struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
83
struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
84
struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev);
85
-
84
+void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map);
86
+void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map);
85
#else
87
#else
86
static inline void intel_fbdev_setup(struct drm_i915_private *dev_priv)
88
#define INTEL_FBDEV_DRIVER_OPS \
87
{
89
    .fbdev_probe = NULL
88
@@ -XXX,XX +XXX,XX @@ static inline struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbd
90
@@ -XXX,XX +XXX,XX @@ static inline struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev
89
{
90
    return NULL;
91
    return NULL;
91
}
92
}
92
+
93
93
+static inline void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
94
+static inline void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
94
+{
95
+{
95
+}
96
+}
96
#endif
97
#endif
97
98
...
...
124
+void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
125
+void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
125
+{
126
+{
126
+    *map = vma->bo->vmap;
127
+    *map = vma->bo->vmap;
127
+}
128
+}
128
--
129
--
129
2.47.1
130
2.49.0
diff view generated by jsdifflib
...
...
16
    .format_mod_supported = i8xx_plane_format_mod_supported,
16
    .format_mod_supported = i8xx_plane_format_mod_supported,
17
};
17
};
18
18
19
+static void i9xx_disable_tiling(struct intel_plane *plane)
19
+static void i9xx_disable_tiling(struct intel_plane *plane)
20
+{
20
+{
21
+    struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
21
+    struct intel_display *display = to_intel_display(plane);
22
+    enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
22
+    enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
23
+    u32 dspcntr;
23
+    u32 dspcntr;
24
+    u32 reg;
24
+    u32 reg;
25
+
25
+
26
+    dspcntr = intel_de_read_fw(dev_priv, DSPCNTR(dev_priv, i9xx_plane));
26
+    dspcntr = intel_de_read_fw(display, DSPCNTR(display, i9xx_plane));
27
+    dspcntr &= ~DISP_TILED;
27
+    dspcntr &= ~DISP_TILED;
28
+    intel_de_write_fw(dev_priv, DSPCNTR(dev_priv, i9xx_plane), dspcntr);
28
+    intel_de_write_fw(display, DSPCNTR(display, i9xx_plane), dspcntr);
29
+
29
+
30
+    if (DISPLAY_VER(dev_priv) >= 4) {
30
+    if (DISPLAY_VER(display) >= 4) {
31
+        reg = intel_de_read_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane));
31
+        reg = intel_de_read_fw(display, DSPSURF(display, i9xx_plane));
32
+        intel_de_write_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane), reg);
32
+        intel_de_write_fw(display, DSPSURF(display, i9xx_plane), reg);
33
+
33
+
34
+    } else {
34
+    } else {
35
+        reg = intel_de_read_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane));
35
+        reg = intel_de_read_fw(display, DSPADDR(display, i9xx_plane));
36
+        intel_de_write_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane), reg);
36
+        intel_de_write_fw(display, DSPADDR(display, i9xx_plane), reg);
37
+    }
37
+    }
38
+}
38
+}
39
+
39
+
40
struct intel_plane *
40
struct intel_plane *
41
intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
41
intel_primary_plane_create(struct intel_display *display, enum pipe pipe)
42
{
42
{
43
@@ -XXX,XX +XXX,XX @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
43
@@ -XXX,XX +XXX,XX @@ intel_primary_plane_create(struct intel_display *display, enum pipe pipe)
44
        plane->disable_flip_done = ilk_primary_disable_flip_done;
44
        }
45
    }
45
    }
46
46
47
+    plane->disable_tiling = i9xx_disable_tiling;
47
+    plane->disable_tiling = i9xx_disable_tiling;
48
+
48
+
49
    modifiers = intel_fb_plane_get_modifiers(dev_priv, INTEL_PLANE_CAP_TILING_X);
49
    modifiers = intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_TILING_X);
50
50
51
    if (DISPLAY_VER(dev_priv) >= 5 || IS_G4X(dev_priv))
51
    if (DISPLAY_VER(display) >= 5 || display->platform.g4x)
52
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
52
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
53
index XXXXXXX..XXXXXXX 100644
53
index XXXXXXX..XXXXXXX 100644
54
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
54
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
55
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
55
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
56
@@ -XXX,XX +XXX,XX @@ struct intel_plane {
56
@@ -XXX,XX +XXX,XX @@ struct intel_plane {
...
...
61
+    void (*disable_tiling)(struct intel_plane *plane);
61
+    void (*disable_tiling)(struct intel_plane *plane);
62
};
62
};
63
63
64
#define to_intel_atomic_state(x) container_of(x, struct intel_atomic_state, base)
64
#define to_intel_atomic_state(x) container_of(x, struct intel_atomic_state, base)
65
--
65
--
66
2.47.1
66
2.49.0
diff view generated by jsdifflib
...
...
9
9
10
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
10
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
12
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
13
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
13
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
14
@@ -XXX,XX +XXX,XX @@ static u8 skl_get_plane_caps(struct drm_i915_private *i915,
14
@@ -XXX,XX +XXX,XX @@ static u8 tgl_plane_caps(struct intel_display *display,
15
    return caps;
15
    return caps;
16
}
16
}
17
17
18
+static void skl_disable_tiling(struct intel_plane *plane)
18
+static void skl_disable_tiling(struct intel_plane *plane)
19
+{
19
+{
20
+    struct intel_plane_state *state = to_intel_plane_state(plane->base.state);
21
+    struct intel_display *display = to_intel_display(plane);
22
+    u32 stride = state->view.color_plane[0].scanout_stride / 64;
20
+    u32 plane_ctl;
23
+    u32 plane_ctl;
21
+    struct intel_plane_state *state = to_intel_plane_state(plane->base.state);
22
+    struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
23
+    u32 stride = state->view.color_plane[0].scanout_stride / 64;
24
+
24
+
25
+    plane_ctl = intel_de_read(dev_priv, PLANE_CTL(plane->pipe, plane->id));
25
+    plane_ctl = intel_de_read(display, PLANE_CTL(plane->pipe, plane->id));
26
+    plane_ctl &= ~PLANE_CTL_TILED_MASK;
26
+    plane_ctl &= ~PLANE_CTL_TILED_MASK;
27
+
27
+
28
+    intel_de_write_fw(dev_priv, PLANE_STRIDE(plane->pipe, plane->id),
28
+    intel_de_write_fw(display, PLANE_STRIDE(plane->pipe, plane->id),
29
+             PLANE_STRIDE_(stride));
29
+             PLANE_STRIDE_(stride));
30
+
30
+
31
+    intel_de_write_fw(dev_priv, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
31
+    intel_de_write_fw(display, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
32
+
32
+
33
+    intel_de_write_fw(dev_priv, PLANE_SURF(plane->pipe, plane->id),
33
+    intel_de_write_fw(display, PLANE_SURF(plane->pipe, plane->id),
34
+             skl_plane_surf(state, 0));
34
+             skl_plane_surf(state, 0));
35
+}
35
+}
36
+
36
+
37
struct intel_plane *
37
struct intel_plane *
38
skl_universal_plane_create(struct drm_i915_private *dev_priv,
38
skl_universal_plane_create(struct intel_display *display,
39
             enum pipe pipe, enum plane_id plane_id)
39
             enum pipe pipe, enum plane_id plane_id)
40
@@ -XXX,XX +XXX,XX @@ skl_universal_plane_create(struct drm_i915_private *dev_priv,
40
@@ -XXX,XX +XXX,XX @@ skl_universal_plane_create(struct intel_display *display,
41
        plane->max_height = skl_plane_max_height;
41
        plane->max_height = skl_plane_max_height;
42
        plane->min_cdclk = skl_plane_min_cdclk;
42
        plane->min_cdclk = skl_plane_min_cdclk;
43
    }
43
    }
44
+    plane->disable_tiling = skl_disable_tiling;
44
+    plane->disable_tiling = skl_disable_tiling;
45
45
46
    if (DISPLAY_VER(dev_priv) >= 13)
46
    if (DISPLAY_VER(display) >= 13)
47
        plane->max_stride = adl_plane_max_stride;
47
        plane->max_stride = adl_plane_max_stride;
48
--
48
--
49
2.47.1
49
2.49.0
diff view generated by jsdifflib
1
Prepare the work for drm_panic support. This is used to map the
1
Prepare the work for drm_panic support. This is used to map the
2
current framebuffer, so the CPU can overwrite it with the panic
2
current framebuffer, so the CPU can overwrite it with the panic
3
message.
3
message.
4
4
5
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
5
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
6
---
6
---
7
drivers/gpu/drm/i915/display/intel_bo.c | 10 +++++++++
7
8
drivers/gpu/drm/i915/display/intel_bo.h | 2 ++
8
v5:
9
* Use iosys_map for intel_bo_panic_map().
10
11
drivers/gpu/drm/i915/display/intel_bo.c | 5 ++++
12
drivers/gpu/drm/i915/display/intel_bo.h | 1 +
9
drivers/gpu/drm/i915/gem/i915_gem_object.h | 2 ++
13
drivers/gpu/drm/i915/gem/i915_gem_object.h | 2 ++
10
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 25 ++++++++++++++++++++++
14
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 29 ++++++++++++++++++++++
11
drivers/gpu/drm/xe/display/intel_bo.c | 17 +++++++++++++++
15
drivers/gpu/drm/xe/display/intel_bo.c | 10 ++++++++
12
5 files changed, 56 insertions(+)
16
5 files changed, 47 insertions(+)
13
17
14
diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
18
diff --git a/drivers/gpu/drm/i915/display/intel_bo.c b/drivers/gpu/drm/i915/display/intel_bo.c
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/drivers/gpu/drm/i915/display/intel_bo.c
20
--- a/drivers/gpu/drm/i915/display/intel_bo.c
17
+++ b/drivers/gpu/drm/i915/display/intel_bo.c
21
+++ b/drivers/gpu/drm/i915/display/intel_bo.c
18
@@ -XXX,XX +XXX,XX @@ bool intel_bo_is_shmem(struct drm_gem_object *obj)
19
    return i915_gem_object_is_shmem(to_intel_bo(obj));
20
}
21
22
+bool intel_bo_has_iomem(struct drm_gem_object *obj)
23
+{
24
+    return i915_gem_object_has_iomem(to_intel_bo(obj));
25
+}
26
+
27
bool intel_bo_is_protected(struct drm_gem_object *obj)
28
{
29
    return i915_gem_object_is_protected(to_intel_bo(obj));
30
@@ -XXX,XX +XXX,XX @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
22
@@ -XXX,XX +XXX,XX @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
31
{
23
{
32
    i915_debugfs_describe_obj(m, to_intel_bo(obj));
24
    i915_debugfs_describe_obj(m, to_intel_bo(obj));
33
}
25
}
34
+
26
+
35
+void *intel_bo_panic_map(struct drm_gem_object *obj)
27
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map)
36
+{
28
+{
37
+    return i915_gem_object_panic_map(to_intel_bo(obj));
29
+    i915_gem_object_panic_map(to_intel_bo(obj), map);
38
+}
30
+}
39
diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
31
diff --git a/drivers/gpu/drm/i915/display/intel_bo.h b/drivers/gpu/drm/i915/display/intel_bo.h
40
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
41
--- a/drivers/gpu/drm/i915/display/intel_bo.h
33
--- a/drivers/gpu/drm/i915/display/intel_bo.h
42
+++ b/drivers/gpu/drm/i915/display/intel_bo.h
34
+++ b/drivers/gpu/drm/i915/display/intel_bo.h
43
@@ -XXX,XX +XXX,XX @@ struct vm_area_struct;
44
bool intel_bo_is_tiled(struct drm_gem_object *obj);
45
bool intel_bo_is_userptr(struct drm_gem_object *obj);
46
bool intel_bo_is_shmem(struct drm_gem_object *obj);
47
+bool intel_bo_has_iomem(struct drm_gem_object *obj);
48
bool intel_bo_is_protected(struct drm_gem_object *obj);
49
void intel_bo_flush_if_display(struct drm_gem_object *obj);
50
int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
51
@@ -XXX,XX +XXX,XX @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
35
@@ -XXX,XX +XXX,XX @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
52
                         struct intel_frontbuffer *front);
36
                         struct intel_frontbuffer *front);
53
37
54
void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
38
void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
55
+void *intel_bo_panic_map(struct drm_gem_object *obj);
39
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map);
56
40
57
#endif /* __INTEL_BO__ */
41
#endif /* __INTEL_BO__ */
58
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
42
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
59
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
60
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
44
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
61
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
45
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
62
@@ -XXX,XX +XXX,XX @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
46
@@ -XXX,XX +XXX,XX @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
63
int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
47
int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
64
int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
48
int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
65
49
66
+void *i915_gem_object_panic_map(struct drm_i915_gem_object *obj);
50
+void i915_gem_object_panic_map(struct drm_i915_gem_object *obj, struct iosys_map *map);
67
+
51
+
68
/**
52
/**
69
* i915_gem_object_pin_map - return a contiguous mapping of the entire object
53
* i915_gem_object_pin_map - return a contiguous mapping of the entire object
70
* @obj: the object to map into kernel address space
54
* @obj: the object to map into kernel address space
71
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
55
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
...
...
77
}
61
}
78
62
79
+/* Map the current framebuffer for CPU access. Called from panic handler, so no
63
+/* Map the current framebuffer for CPU access. Called from panic handler, so no
80
+ * need to pin or cleanup.
64
+ * need to pin or cleanup.
81
+ */
65
+ */
82
+void *i915_gem_object_panic_map(struct drm_i915_gem_object *obj)
66
+void i915_gem_object_panic_map(struct drm_i915_gem_object *obj, struct iosys_map *map)
83
+{
67
+{
84
+    enum i915_map_type has_type;
68
+    enum i915_map_type has_type;
85
+    void *ptr;
69
+    void *ptr;
86
+
70
+
87
+    ptr = page_unpack_bits(obj->mm.mapping, &has_type);
71
+    ptr = page_unpack_bits(obj->mm.mapping, &has_type);
88
+
72
+
89
+    if (ptr)
90
+        return ptr;
91
+
73
+
92
+    if (i915_gem_object_has_struct_page(obj))
74
+    if (!ptr) {
93
+        ptr = i915_gem_object_map_page(obj, I915_MAP_WB);
75
+        if (i915_gem_object_has_struct_page(obj))
76
+            ptr = i915_gem_object_map_page(obj, I915_MAP_WB);
77
+        else
78
+            ptr = i915_gem_object_map_pfn(obj, I915_MAP_WB);
79
+
80
+        if (IS_ERR(ptr))
81
+            return;
82
+
83
+        obj->mm.mapping = page_pack_bits(ptr, I915_MAP_WB);
84
+    }
85
+
86
+    if (i915_gem_object_has_iomem(obj))
87
+        iosys_map_set_vaddr_iomem(map, (void __iomem *) ptr);
94
+    else
88
+    else
95
+        ptr = i915_gem_object_map_pfn(obj, I915_MAP_WB);
89
+        iosys_map_set_vaddr(map, ptr);
96
+
97
+    if (IS_ERR(ptr))
98
+        return NULL;
99
+
100
+    obj->mm.mapping = page_pack_bits(ptr, I915_MAP_WB);
101
+    return ptr;
102
+}
90
+}
103
+
91
+
104
/* get, pin, and map the pages of the object into kernel space */
92
/* get, pin, and map the pages of the object into kernel space */
105
void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
93
void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
106
             enum i915_map_type type)
94
             enum i915_map_type type)
107
diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
95
diff --git a/drivers/gpu/drm/xe/display/intel_bo.c b/drivers/gpu/drm/xe/display/intel_bo.c
108
index XXXXXXX..XXXXXXX 100644
96
index XXXXXXX..XXXXXXX 100644
109
--- a/drivers/gpu/drm/xe/display/intel_bo.c
97
--- a/drivers/gpu/drm/xe/display/intel_bo.c
110
+++ b/drivers/gpu/drm/xe/display/intel_bo.c
98
+++ b/drivers/gpu/drm/xe/display/intel_bo.c
111
@@ -XXX,XX +XXX,XX @@ bool intel_bo_is_shmem(struct drm_gem_object *obj)
112
    return false;
113
}
114
115
+bool intel_bo_has_iomem(struct drm_gem_object *obj)
116
+{
117
+    return false;
118
+}
119
+
120
bool intel_bo_is_protected(struct drm_gem_object *obj)
121
{
122
    return false;
123
@@ -XXX,XX +XXX,XX @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
99
@@ -XXX,XX +XXX,XX @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
124
{
100
{
125
    /* FIXME */
101
    /* FIXME */
126
}
102
}
127
+
103
+
128
+void *intel_bo_panic_map(struct drm_gem_object *obj)
104
+void intel_bo_panic_map(struct drm_gem_object *obj, struct iosys_map *map)
129
+{
105
+{
130
+    struct xe_bo *bo = gem_to_xe_bo(obj);
106
+    struct xe_bo *bo = gem_to_xe_bo(obj);
131
+    struct iosys_map map;
132
+    int ret;
107
+    int ret;
133
+
108
+
134
+    ret = ttm_bo_vmap(&bo->ttm, &map);
109
+    ret = ttm_bo_vmap(&bo->ttm, map);
135
+    if (ret)
110
+    if (ret)
136
+        return NULL;
111
+        iosys_map_clear(map);
137
+    return map.vaddr;
138
+}
112
+}
139
--
113
--
140
2.47.1
114
2.49.0
diff view generated by jsdifflib
1
This adds drm_panic support for a wide range of Intel GPU. I've
1
This adds drm_panic support for a wide range of Intel GPU. I've
2
tested it only on 3 laptops, Haswell (with 128MB of eDRAM),
2
tested it only on 4 laptops, Haswell (with 128MB of eDRAM),
3
Comet Lake, and Lunar Lake.
3
Comet Lake, Raptor Lake, and Lunar Lake.
4
For hardware using DPT, it's not possible to disable tiling, as you
4
For hardware using DPT, it's not possible to disable tiling, as you
5
will need to reconfigure the way the GPU is accessing the
5
will need to reconfigure the way the GPU is accessing the
6
framebuffer.
6
framebuffer.
7
7
8
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
8
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
9
---
9
---
10
10
11
v4:
11
v4:
12
* Add support for Xe driver.
12
* Add support for Xe driver.
13
14
v6:
15
* Use struct intel_display instead of drm_i915_private for intel_atomic_plane.c
13
16
14
.../gpu/drm/i915/display/intel_atomic_plane.c | 88 ++++++++++++++++++-
17
.../gpu/drm/i915/display/intel_atomic_plane.c | 79 ++++++++++++++++++-
15
1 file changed, 87 insertions(+), 1 deletion(-)
18
1 file changed, 78 insertions(+), 1 deletion(-)
16
19
17
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
20
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
22
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
20
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
23
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
...
...
24
#include <linux/dma-resv.h>
27
#include <linux/dma-resv.h>
25
+#include <linux/iosys-map.h>
28
+#include <linux/iosys-map.h>
26
29
27
#include <drm/drm_atomic_helper.h>
30
#include <drm/drm_atomic_helper.h>
28
#include <drm/drm_blend.h>
31
#include <drm/drm_blend.h>
32
#include <drm/drm_damage_helper.h>
29
+#include <drm/drm_cache.h>
33
+#include <drm/drm_cache.h>
30
#include <drm/drm_fourcc.h>
34
#include <drm/drm_fourcc.h>
31
#include <drm/drm_gem.h>
35
#include <drm/drm_gem.h>
32
#include <drm/drm_gem_atomic_helper.h>
36
#include <drm/drm_gem_atomic_helper.h>
33
+#include <drm/drm_panic.h>
37
+#include <drm/drm_panic.h>
34
38
35
#include "i915_drv.h"
39
#include "gem/i915_gem_object.h"
36
#include "i915_config.h"
40
#include "i915_config.h"
41
@@ -XXX,XX +XXX,XX @@
42
#include "i915_vma.h"
37
#include "i9xx_plane_regs.h"
43
#include "i9xx_plane_regs.h"
38
#include "intel_atomic_plane.h"
44
#include "intel_atomic_plane.h"
39
+#include "intel_bo.h"
45
+#include "intel_bo.h"
40
#include "intel_cdclk.h"
46
#include "intel_cdclk.h"
41
#include "intel_cursor.h"
47
#include "intel_cursor.h"
...
...
44
#include "intel_display_types.h"
50
#include "intel_display_types.h"
45
#include "intel_fb.h"
51
#include "intel_fb.h"
46
#include "intel_fb_pin.h"
52
#include "intel_fb_pin.h"
47
+#include "intel_fbdev.h"
53
+#include "intel_fbdev.h"
48
#include "skl_scaler.h"
54
#include "skl_scaler.h"
55
#include "skl_universal_plane.h"
49
#include "skl_watermark.h"
56
#include "skl_watermark.h"
50
51
@@ -XXX,XX +XXX,XX @@ intel_cleanup_plane_fb(struct drm_plane *plane,
57
@@ -XXX,XX +XXX,XX @@ intel_cleanup_plane_fb(struct drm_plane *plane,
52
    intel_plane_unpin_fb(old_plane_state);
58
    intel_plane_unpin_fb(old_plane_state);
53
}
59
}
54
60
55
+/* Only used by drm_panic get_scanout_buffer() and panic_flush(), so it is
61
+/* Only used by drm_panic get_scanout_buffer() and panic_flush(), so it is
...
...
58
+static struct iosys_map panic_map;
64
+static struct iosys_map panic_map;
59
+
65
+
60
+static void intel_panic_flush(struct drm_plane *plane)
66
+static void intel_panic_flush(struct drm_plane *plane)
61
+{
67
+{
62
+    struct intel_plane_state *plane_state = to_intel_plane_state(plane->state);
68
+    struct intel_plane_state *plane_state = to_intel_plane_state(plane->state);
63
+    struct drm_i915_private *dev_priv = to_i915(plane->dev);
69
+    struct intel_plane *iplane = to_intel_plane(plane);
70
+    struct intel_display *display = to_intel_display(iplane);
64
+    struct drm_framebuffer *fb = plane_state->hw.fb;
71
+    struct drm_framebuffer *fb = plane_state->hw.fb;
65
+    struct intel_plane *iplane = to_intel_plane(plane);
66
+
72
+
67
+    /* Force a cache flush, otherwise the new pixels won't show up */
73
+    /* Force a cache flush, otherwise the new pixels won't show up */
68
+    drm_clflush_virt_range(panic_map.vaddr, fb->height * fb->pitches[0]);
74
+    drm_clflush_virt_range(panic_map.vaddr, fb->height * fb->pitches[0]);
69
+
75
+
70
+    /* Don't disable tiling if it's the fbdev framebuffer.*/
76
+    /* Don't disable tiling if it's the fbdev framebuffer.*/
71
+    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(dev_priv->display.fbdev.fbdev))
77
+    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
72
+        return;
78
+        return;
73
+
79
+
74
+    if (fb->modifier && iplane->disable_tiling)
80
+    if (fb->modifier && iplane->disable_tiling)
75
+        iplane->disable_tiling(iplane);
81
+        iplane->disable_tiling(iplane);
76
+}
82
+}
...
...
79
+                 struct drm_scanout_buffer *sb)
85
+                 struct drm_scanout_buffer *sb)
80
+{
86
+{
81
+    struct intel_plane_state *plane_state;
87
+    struct intel_plane_state *plane_state;
82
+    struct drm_gem_object *obj;
88
+    struct drm_gem_object *obj;
83
+    struct drm_framebuffer *fb;
89
+    struct drm_framebuffer *fb;
84
+    struct drm_i915_private *dev_priv = to_i915(plane->dev);
90
+    struct intel_display *display = to_intel_display(plane->dev);
85
+
91
+
86
+    if (!plane->state || !plane->state->fb || !plane->state->visible)
92
+    if (!plane->state || !plane->state->fb || !plane->state->visible)
87
+        return -ENODEV;
93
+        return -ENODEV;
88
+
94
+
89
+    plane_state = to_intel_plane_state(plane->state);
95
+    plane_state = to_intel_plane_state(plane->state);
90
+    fb = plane_state->hw.fb;
96
+    fb = plane_state->hw.fb;
91
+    obj = intel_fb_bo(fb);
97
+    obj = intel_fb_bo(fb);
92
+    if (!obj)
98
+    if (!obj)
93
+        return -ENODEV;
99
+        return -ENODEV;
94
+
100
+
95
+    iosys_map_clear(&panic_map);
101
+    iosys_map_clear(&panic_map);
96
+    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(dev_priv->display.fbdev.fbdev)) {
102
+    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
97
+        intel_fbdev_get_map(dev_priv->display.fbdev.fbdev, &panic_map);
103
+        intel_fbdev_get_map(display->fbdev.fbdev, &panic_map);
98
+        if (iosys_map_is_null(&panic_map))
99
+            return -ENOMEM;
100
+    } else {
104
+    } else {
101
+        void *ptr;
102
+        /* Can't disable tiling if DPT is in use */
105
+        /* Can't disable tiling if DPT is in use */
103
+        if (intel_fb_uses_dpt(fb))
106
+        if (intel_fb_uses_dpt(fb))
104
+            return -EOPNOTSUPP;
107
+            return -EOPNOTSUPP;
105
+
108
+
106
+        ptr = intel_bo_panic_map(obj);
109
+        intel_bo_panic_map(obj, &panic_map);
107
+        if (!ptr)
108
+            return -ENOMEM;
109
+
110
+        if (intel_bo_has_iomem(obj))
111
+            iosys_map_set_vaddr_iomem(&panic_map, ptr);
112
+        else
113
+            iosys_map_set_vaddr(&panic_map, ptr);
114
+
115
+    }
110
+    }
111
+    if (iosys_map_is_null(&panic_map))
112
+        return -ENOMEM;
116
+
113
+
117
+    sb->map[0] = panic_map;
114
+    sb->map[0] = panic_map;
118
+    sb->width = fb->width;
115
+    sb->width = fb->width;
119
+    sb->height = fb->height;
116
+    sb->height = fb->height;
120
+    sb->format = fb->format;
117
+    sb->format = fb->format;
...
...
144
+        drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
141
+        drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
145
}
142
}
146
143
147
void intel_plane_init_cursor_vblank_work(struct intel_plane_state *old_plane_state,
144
void intel_plane_init_cursor_vblank_work(struct intel_plane_state *old_plane_state,
148
--
145
--
149
2.47.1
146
2.49.0
diff view generated by jsdifflib
...
...
4
It's probably not safe to do that in the panic handler, but that's
4
It's probably not safe to do that in the panic handler, but that's
5
still better than nothing.
5
still better than nothing.
6
6
7
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
7
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
8
---
8
---
9
drivers/gpu/drm/i915/display/intel_atomic_plane.c | 9 ++++++++-
9
drivers/gpu/drm/i915/display/intel_atomic_plane.c | 7 +++++++
10
1 file changed, 8 insertions(+), 1 deletion(-)
10
1 file changed, 7 insertions(+)
11
11
12
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
12
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
13
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
14
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
15
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
15
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
16
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@
17
#include "intel_fb.h"
17
#include "intel_fb.h"
18
#include "intel_fb_pin.h"
18
#include "intel_fb_pin.h"
19
#include "intel_fbdev.h"
19
#include "intel_fbdev.h"
20
+#include "intel_frontbuffer.h"
20
+#include "intel_frontbuffer.h"
21
#include "skl_scaler.h"
21
#include "skl_scaler.h"
22
#include "skl_universal_plane.h"
22
#include "skl_watermark.h"
23
#include "skl_watermark.h"
23
24
@@ -XXX,XX +XXX,XX @@ static void intel_panic_flush(struct drm_plane *plane)
24
@@ -XXX,XX +XXX,XX @@ static void intel_panic_flush(struct drm_plane *plane)
25
    drm_clflush_virt_range(panic_map.vaddr, fb->height * fb->pitches[0]);
26
25
27
    /* Don't disable tiling if it's the fbdev framebuffer.*/
26
    /* Don't disable tiling if it's the fbdev framebuffer.*/
28
-    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(dev_priv->display.fbdev.fbdev))
27
    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
29
+    if (to_intel_framebuffer(fb) == intel_fbdev_framebuffer(dev_priv->display.fbdev.fbdev)) {
30
+        struct intel_frontbuffer *front = to_intel_frontbuffer(fb);
28
+        struct intel_frontbuffer *front = to_intel_frontbuffer(fb);
31
+        struct drm_gem_object *obj = intel_fb_bo(fb);
29
+        struct drm_gem_object *obj = intel_fb_bo(fb);
32
+
30
+
33
+        intel_bo_flush_if_display(obj);
31
+        intel_bo_flush_if_display(obj);
34
+        intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
32
+        intel_frontbuffer_flush(front, ORIGIN_DIRTYFB);
35
        return;
33
        return;
36
+    }
34
+    }
37
35
38
    if (fb->modifier && iplane->disable_tiling)
36
    if (fb->modifier && iplane->disable_tiling)
39
        iplane->disable_tiling(iplane);
37
        iplane->disable_tiling(iplane);
40
--
38
--
41
2.47.1
39
2.49.0
diff view generated by jsdifflib
1
On Alderlake and later, it's not possible to disable tiling when DPT
1
On Alder Lake and later, it's not possible to disable tiling when DPT
2
is enabled.
2
is enabled.
3
So this commit implements Y-Tiling support, to still be able to draw
3
So this commit implements Y-Tiling support, to still be able to draw
4
the panic screen.
4
the panic screen.
5
5
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
7
---
7
---
8
.../gpu/drm/i915/display/intel_atomic_plane.c | 70 +++++++++++++++++--
8
.../gpu/drm/i915/display/intel_atomic_plane.c | 69 ++++++++++++++++++-
9
.../drm/i915/display/skl_universal_plane.c | 17 +++--
9
.../drm/i915/display/skl_universal_plane.c | 15 ++--
10
2 files changed, 78 insertions(+), 9 deletions(-)
10
2 files changed, 77 insertions(+), 7 deletions(-)
11
11
12
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
12
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
13
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
14
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
15
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
15
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
...
...
81
+
81
+
82
static int intel_get_scanout_buffer(struct drm_plane *plane,
82
static int intel_get_scanout_buffer(struct drm_plane *plane,
83
                 struct drm_scanout_buffer *sb)
83
                 struct drm_scanout_buffer *sb)
84
{
84
{
85
@@ -XXX,XX +XXX,XX @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
85
@@ -XXX,XX +XXX,XX @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
86
        intel_fbdev_get_map(display->fbdev.fbdev, &panic_map);
86
    } else {
87
    } else {
87
        void *ptr;
88
        /* Can't disable tiling if DPT is in use */
88
        /* Can't disable tiling if DPT is in use */
89
-        if (intel_fb_uses_dpt(fb))
89
-        if (intel_fb_uses_dpt(fb))
90
-            return -EOPNOTSUPP;
90
-            return -EOPNOTSUPP;
91
-
92
+        if (intel_fb_uses_dpt(fb)) {
91
+        if (intel_fb_uses_dpt(fb)) {
93
+            if (fb->format->cpp[0] != 4)
92
+            if (fb->format->cpp[0] != 4)
94
+                return -EOPNOTSUPP;
93
+                return -EOPNOTSUPP;
95
+            sb->set_pixel = intel_get_tiling_func(fb->modifier);
94
+            sb->set_pixel = intel_get_tiling_func(fb->modifier);
96
+            if (!sb->set_pixel)
95
+            if (!sb->set_pixel)
97
+                return -EOPNOTSUPP;
96
+                return -EOPNOTSUPP;
98
+        }
97
+        }
99
        ptr = intel_bo_panic_map(obj);
98
100
        if (!ptr)
99
        intel_bo_panic_map(obj, &panic_map);
101
            return -ENOMEM;
100
    }
102
@@ -XXX,XX +XXX,XX @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
101
@@ -XXX,XX +XXX,XX @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
103
    sb->map[0] = panic_map;
102
    sb->map[0] = panic_map;
104
    sb->width = fb->width;
103
    sb->width = fb->width;
105
    sb->height = fb->height;
104
    sb->height = fb->height;
106
-    sb->format = fb->format;
105
-    sb->format = fb->format;
...
...
113
    return 0;
112
    return 0;
114
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
113
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c
115
index XXXXXXX..XXXXXXX 100644
114
index XXXXXXX..XXXXXXX 100644
116
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
115
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
117
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
116
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
118
@@ -XXX,XX +XXX,XX @@ static u8 skl_get_plane_caps(struct drm_i915_private *i915,
117
@@ -XXX,XX +XXX,XX @@ static void skl_disable_tiling(struct intel_plane *plane)
119
120
static void skl_disable_tiling(struct intel_plane *plane)
121
{
118
{
122
-    u32 plane_ctl;
123
    struct intel_plane_state *state = to_intel_plane_state(plane->base.state);
119
    struct intel_plane_state *state = to_intel_plane_state(plane->base.state);
124
    struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
120
    struct intel_display *display = to_intel_display(plane);
125
-    u32 stride = state->view.color_plane[0].scanout_stride / 64;
121
-    u32 stride = state->view.color_plane[0].scanout_stride / 64;
126
+    const struct drm_framebuffer *fb = state->hw.fb;
122
+    const struct drm_framebuffer *fb = state->hw.fb;
127
+    u32 plane_ctl;
123
    u32 plane_ctl;
128
124
129
    plane_ctl = intel_de_read(dev_priv, PLANE_CTL(plane->pipe, plane->id));
125
    plane_ctl = intel_de_read(display, PLANE_CTL(plane->pipe, plane->id));
130
-    plane_ctl &= ~PLANE_CTL_TILED_MASK;
126
-    plane_ctl &= ~PLANE_CTL_TILED_MASK;
131
127
132
-    intel_de_write_fw(dev_priv, PLANE_STRIDE(plane->pipe, plane->id),
128
-    intel_de_write_fw(display, PLANE_STRIDE(plane->pipe, plane->id),
133
-             PLANE_STRIDE_(stride));
129
-             PLANE_STRIDE_(stride));
134
+    if (intel_fb_uses_dpt(fb)) {
130
+    if (intel_fb_uses_dpt(fb)) {
135
+        /* if DPT is enabled, keep tiling, but disable compression */
131
+        /* if DPT is enabled, keep tiling, but disable compression */
136
+        plane_ctl &= ~PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
132
+        plane_ctl &= ~PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
137
+    } else {
133
+    } else {
138
+        /* if DPT is not supported, disable tiling, and update stride */
134
+        /* if DPT is not supported, disable tiling, and update stride */
139
+        u32 stride = state->view.color_plane[0].scanout_stride / 64;
135
+        u32 stride = state->view.color_plane[0].scanout_stride / 64;
140
136
141
+        plane_ctl &= ~PLANE_CTL_TILED_MASK;
137
+        plane_ctl &= ~PLANE_CTL_TILED_MASK;
142
+        intel_de_write_fw(dev_priv, PLANE_STRIDE(plane->pipe, plane->id),
138
+        intel_de_write_fw(display, PLANE_STRIDE(plane->pipe, plane->id),
143
+                 PLANE_STRIDE_(stride));
139
+                 PLANE_STRIDE_(stride));
144
+    }
140
+    }
145
    intel_de_write_fw(dev_priv, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
141
    intel_de_write_fw(display, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
146
142
147
    intel_de_write_fw(dev_priv, PLANE_SURF(plane->pipe, plane->id),
143
    intel_de_write_fw(display, PLANE_SURF(plane->pipe, plane->id),
148
--
144
--
149
2.47.1
145
2.49.0
diff view generated by jsdifflib
1
On Alderlake and later, it's not possible to disable tiling when DPT
1
On Alder Lake and later, it's not possible to disable tiling when DPT
2
is enabled.
2
is enabled.
3
So this commit implements 4-Tiling support, to still be able to draw
3
So this commit implements 4-Tiling support, to still be able to draw
4
the panic screen.
4
the panic screen.
5
5
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
6
Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
...
...
54
+    case I915_FORMAT_MOD_X_TILED:
54
+    case I915_FORMAT_MOD_X_TILED:
55
    case I915_FORMAT_MOD_Yf_TILED:
55
    case I915_FORMAT_MOD_Yf_TILED:
56
    case I915_FORMAT_MOD_Yf_TILED_CCS:
56
    case I915_FORMAT_MOD_Yf_TILED_CCS:
57
    default:
57
    default:
58
--
58
--
59
2.47.1
59
2.49.0
diff view generated by jsdifflib