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 |