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
...
...
23
23
24
v5:
24
v5:
25
* Rebase on top of git@gitlab.freedesktop.org:drm/i915/kernel.git drm-intel-next
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.
26
* Use struct intel_display instead of drm_i915_private.
27
* Use iosys_map for intel_bo_panic_map().
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
28
32
29
Jocelyn Falempe (8):
33
Jocelyn Falempe (8):
30
drm/i915/fbdev: Add intel_fbdev_get_map()
34
drm/i915/fbdev: Add intel_fbdev_get_map()
31
drm/i915/display/i9xx: Add a disable_tiling() for i9xx planes
35
drm/i915/display/i9xx: Add a disable_tiling() for i9xx planes
32
drm/i915/display: Add a disable_tiling() for skl planes
36
drm/i915/display: Add a disable_tiling() for skl planes
...
...
52
drivers/gpu/drm/xe/display/intel_bo.c | 10 ++
56
drivers/gpu/drm/xe/display/intel_bo.c | 10 ++
53
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +
57
drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +
54
15 files changed, 294 insertions(+), 2 deletions(-)
58
15 files changed, 294 insertions(+), 2 deletions(-)
55
59
56
60
57
base-commit: ac6674bc94e91c25f5919efc91721264c00ab300
61
base-commit: 010363c4618920838ca8777fdabd46871d289bf9
58
--
62
--
59
2.47.1
63
2.49.0
diff view generated by jsdifflib
...
...
68
+}
68
+}
69
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
70
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
71
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
71
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
72
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
72
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
73
@@ -XXX,XX +XXX,XX @@ struct drm_device;
73
@@ -XXX,XX +XXX,XX @@ struct drm_fb_helper_surface_size;
74
struct drm_i915_private;
74
struct drm_i915_private;
75
struct intel_fbdev;
75
struct intel_fbdev;
76
struct intel_framebuffer;
76
struct intel_framebuffer;
77
+struct iosys_map;
77
+struct iosys_map;
78
78
79
#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,
80
void intel_fbdev_setup(struct drm_i915_private *dev_priv);
82
void intel_fbdev_setup(struct drm_i915_private *dev_priv);
81
void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous);
82
struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
83
struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
83
struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev);
84
struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev);
84
-
85
-
85
+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);
86
#else
87
#else
87
static inline void intel_fbdev_setup(struct drm_i915_private *dev_priv)
88
#define INTEL_FBDEV_DRIVER_OPS \
88
{
89
    .fbdev_probe = NULL
89
@@ -XXX,XX +XXX,XX @@ static inline struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev
90
@@ -XXX,XX +XXX,XX @@ static inline struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev
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)
...
...
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
...
...
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
...
...
44
+    plane->disable_tiling = skl_disable_tiling;
44
+    plane->disable_tiling = skl_disable_tiling;
45
45
46
    if (DISPLAY_VER(display) >= 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
...
...
109
+    ret = ttm_bo_vmap(&bo->ttm, map);
109
+    ret = ttm_bo_vmap(&bo->ttm, map);
110
+    if (ret)
110
+    if (ret)
111
+        iosys_map_clear(map);
111
+        iosys_map_clear(map);
112
+}
112
+}
113
--
113
--
114
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 4 laptops, Haswell (with 128MB of eDRAM),
2
tested it only on 4 laptops, Haswell (with 128MB of eDRAM),
3
Comet Lake, Alder 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 | 79 ++++++++++++++++++-
17
.../gpu/drm/i915/display/intel_atomic_plane.c | 79 ++++++++++++++++++-
15
1 file changed, 78 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
...
...
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
+    } else {
104
+    } else {
99
+        /* Can't disable tiling if DPT is in use */
105
+        /* Can't disable tiling if DPT is in use */
100
+        if (intel_fb_uses_dpt(fb))
106
+        if (intel_fb_uses_dpt(fb))
101
+            return -EOPNOTSUPP;
107
+            return -EOPNOTSUPP;
102
+
108
+
...
...
135
+        drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
141
+        drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
136
}
142
}
137
143
138
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,
139
--
145
--
140
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
...
...
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(dev_priv->display.fbdev.fbdev, &panic_map);
86
        intel_fbdev_get_map(display->fbdev.fbdev, &panic_map);
87
    } else {
87
    } else {
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
+        if (intel_fb_uses_dpt(fb)) {
91
+        if (intel_fb_uses_dpt(fb)) {
...
...
140
+    }
140
+    }
141
    intel_de_write_fw(display, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
141
    intel_de_write_fw(display, PLANE_CTL(plane->pipe, plane->id), plane_ctl);
142
142
143
    intel_de_write_fw(display, PLANE_SURF(plane->pipe, plane->id),
143
    intel_de_write_fw(display, PLANE_SURF(plane->pipe, plane->id),
144
--
144
--
145
2.47.1
145
2.49.0
diff view generated by jsdifflib
...
...
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