mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
drm/{i915,xe}/panic: split out intel_panic.[ch]
intel_bo.[ch] is not the appropriate location for the panic functionality. Split out intel_panic.[ch] and xe_panic.c in i915 and xe. Keep the function names for now. Cc: Jocelyn Falempe <jfalempe@redhat.com> Cc: Maarten Lankhorst <dev@lankhorst.se> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://lore.kernel.org/r/d98b831a011a028ffd33ce99b0ba62be061ee235.1756835342.git.jani.nikula@intel.com
This commit is contained in:
parent
cef2c7266f
commit
5f54b2196c
|
|
@ -280,6 +280,7 @@ i915-y += \
|
|||
display/intel_modeset_setup.o \
|
||||
display/intel_modeset_verify.o \
|
||||
display/intel_overlay.o \
|
||||
display/intel_panic.o \
|
||||
display/intel_pch.o \
|
||||
display/intel_pch_display.o \
|
||||
display/intel_pch_refclk.o \
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include "intel_fb.h"
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_panic.h"
|
||||
#include "intel_plane.h"
|
||||
#include "intel_sprite.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -59,18 +59,3 @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
|
|||
{
|
||||
i915_debugfs_describe_obj(m, to_intel_bo(obj));
|
||||
}
|
||||
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void)
|
||||
{
|
||||
return i915_gem_object_alloc_framebuffer();
|
||||
}
|
||||
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb)
|
||||
{
|
||||
return i915_gem_object_panic_setup(sb);
|
||||
}
|
||||
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb)
|
||||
{
|
||||
return i915_gem_object_panic_finish(fb);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,8 +25,5 @@ struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj,
|
|||
struct intel_frontbuffer *front);
|
||||
|
||||
void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj);
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void);
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb);
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb);
|
||||
|
||||
#endif /* __INTEL_BO__ */
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "intel_fb.h"
|
||||
#include "intel_fb_bo.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_panic.h"
|
||||
#include "intel_plane.h"
|
||||
|
||||
#define check_array_bounds(display, a, i) drm_WARN_ON((display)->drm, (i) >= ARRAY_SIZE(a))
|
||||
|
|
|
|||
20
drivers/gpu/drm/i915/display/intel_panic.c
Normal file
20
drivers/gpu/drm/i915/display/intel_panic.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/* Copyright © 2025 Intel Corporation */
|
||||
|
||||
#include "gem/i915_gem_object.h"
|
||||
#include "intel_panic.h"
|
||||
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void)
|
||||
{
|
||||
return i915_gem_object_alloc_framebuffer();
|
||||
}
|
||||
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb)
|
||||
{
|
||||
return i915_gem_object_panic_setup(sb);
|
||||
}
|
||||
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb)
|
||||
{
|
||||
return i915_gem_object_panic_finish(fb);
|
||||
}
|
||||
14
drivers/gpu/drm/i915/display/intel_panic.h
Normal file
14
drivers/gpu/drm/i915/display/intel_panic.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright © 2025 Intel Corporation */
|
||||
|
||||
#ifndef __INTEL_PANIC_H__
|
||||
#define __INTEL_PANIC_H__
|
||||
|
||||
struct drm_scanout_buffer;
|
||||
struct intel_framebuffer;
|
||||
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void);
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb);
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb);
|
||||
|
||||
#endif /* __INTEL_PANIC_H__ */
|
||||
|
|
@ -47,7 +47,6 @@
|
|||
#include "gem/i915_gem_object.h"
|
||||
#include "i915_scheduler_types.h"
|
||||
#include "i9xx_plane_regs.h"
|
||||
#include "intel_bo.h"
|
||||
#include "intel_cdclk.h"
|
||||
#include "intel_cursor.h"
|
||||
#include "intel_display_rps.h"
|
||||
|
|
@ -56,6 +55,7 @@
|
|||
#include "intel_fb.h"
|
||||
#include "intel_fb_pin.h"
|
||||
#include "intel_fbdev.h"
|
||||
#include "intel_panic.h"
|
||||
#include "intel_plane.h"
|
||||
#include "intel_psr.h"
|
||||
#include "skl_scaler.h"
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "intel_fb.h"
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_panic.h"
|
||||
#include "intel_plane.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_psr_regs.h"
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
|
|||
display/xe_dsb_buffer.o \
|
||||
display/xe_fb_pin.o \
|
||||
display/xe_hdcp_gsc.o \
|
||||
display/xe_panic.o \
|
||||
display/xe_plane_initial.o \
|
||||
display/xe_tdf.o
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,7 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/* Copyright © 2024 Intel Corporation */
|
||||
|
||||
#include <drm/drm_cache.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_panic.h>
|
||||
|
||||
#include "intel_fb.h"
|
||||
#include "intel_display_types.h"
|
||||
|
||||
#include "xe_bo.h"
|
||||
#include "intel_bo.h"
|
||||
|
|
@ -64,89 +59,3 @@ void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
|
|||
{
|
||||
/* FIXME */
|
||||
}
|
||||
|
||||
struct xe_panic_data {
|
||||
struct page **pages;
|
||||
int page;
|
||||
void *vaddr;
|
||||
};
|
||||
|
||||
struct xe_framebuffer {
|
||||
struct intel_framebuffer base;
|
||||
struct xe_panic_data panic;
|
||||
};
|
||||
|
||||
static inline struct xe_panic_data *to_xe_panic_data(struct intel_framebuffer *fb)
|
||||
{
|
||||
return &container_of_const(fb, struct xe_framebuffer, base)->panic;
|
||||
}
|
||||
|
||||
static void xe_panic_kunmap(struct xe_panic_data *panic)
|
||||
{
|
||||
if (panic->vaddr) {
|
||||
drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
|
||||
kunmap_local(panic->vaddr);
|
||||
panic->vaddr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The scanout buffer pages are not mapped, so for each pixel,
|
||||
* use kmap_local_page_try_from_panic() to map the page, and write the pixel.
|
||||
* Try to keep the map from the previous pixel, to avoid too much map/unmap.
|
||||
*/
|
||||
static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
|
||||
unsigned int y, u32 color)
|
||||
{
|
||||
struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
|
||||
unsigned int new_page;
|
||||
unsigned int offset;
|
||||
|
||||
if (fb->panic_tiling)
|
||||
offset = fb->panic_tiling(sb->width, x, y);
|
||||
else
|
||||
offset = y * sb->pitch[0] + x * sb->format->cpp[0];
|
||||
|
||||
new_page = offset >> PAGE_SHIFT;
|
||||
offset = offset % PAGE_SIZE;
|
||||
if (new_page != panic->page) {
|
||||
xe_panic_kunmap(panic);
|
||||
panic->page = new_page;
|
||||
panic->vaddr = ttm_bo_kmap_try_from_panic(&bo->ttm,
|
||||
panic->page);
|
||||
}
|
||||
if (panic->vaddr) {
|
||||
u32 *pix = panic->vaddr + offset;
|
||||
*pix = color;
|
||||
}
|
||||
}
|
||||
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void)
|
||||
{
|
||||
struct xe_framebuffer *xe_fb;
|
||||
|
||||
xe_fb = kzalloc(sizeof(*xe_fb), GFP_KERNEL);
|
||||
if (xe_fb)
|
||||
return &xe_fb->base;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb)
|
||||
{
|
||||
struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
|
||||
panic->page = -1;
|
||||
sb->set_pixel = xe_panic_page_set_pixel;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb)
|
||||
{
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
|
||||
xe_panic_kunmap(panic);
|
||||
panic->page = -1;
|
||||
}
|
||||
|
|
|
|||
96
drivers/gpu/drm/xe/display/xe_panic.c
Normal file
96
drivers/gpu/drm/xe/display/xe_panic.c
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/* Copyright © 2025 Intel Corporation */
|
||||
|
||||
#include <drm/drm_cache.h>
|
||||
#include <drm/drm_panic.h>
|
||||
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_fb.h"
|
||||
#include "intel_panic.h"
|
||||
#include "xe_bo.h"
|
||||
|
||||
struct xe_panic_data {
|
||||
struct page **pages;
|
||||
int page;
|
||||
void *vaddr;
|
||||
};
|
||||
|
||||
struct xe_framebuffer {
|
||||
struct intel_framebuffer base;
|
||||
struct xe_panic_data panic;
|
||||
};
|
||||
|
||||
static inline struct xe_panic_data *to_xe_panic_data(struct intel_framebuffer *fb)
|
||||
{
|
||||
return &container_of_const(fb, struct xe_framebuffer, base)->panic;
|
||||
}
|
||||
|
||||
static void xe_panic_kunmap(struct xe_panic_data *panic)
|
||||
{
|
||||
if (panic->vaddr) {
|
||||
drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
|
||||
kunmap_local(panic->vaddr);
|
||||
panic->vaddr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The scanout buffer pages are not mapped, so for each pixel,
|
||||
* use kmap_local_page_try_from_panic() to map the page, and write the pixel.
|
||||
* Try to keep the map from the previous pixel, to avoid too much map/unmap.
|
||||
*/
|
||||
static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
|
||||
unsigned int y, u32 color)
|
||||
{
|
||||
struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
|
||||
unsigned int new_page;
|
||||
unsigned int offset;
|
||||
|
||||
if (fb->panic_tiling)
|
||||
offset = fb->panic_tiling(sb->width, x, y);
|
||||
else
|
||||
offset = y * sb->pitch[0] + x * sb->format->cpp[0];
|
||||
|
||||
new_page = offset >> PAGE_SHIFT;
|
||||
offset = offset % PAGE_SIZE;
|
||||
if (new_page != panic->page) {
|
||||
xe_panic_kunmap(panic);
|
||||
panic->page = new_page;
|
||||
panic->vaddr = ttm_bo_kmap_try_from_panic(&bo->ttm,
|
||||
panic->page);
|
||||
}
|
||||
if (panic->vaddr) {
|
||||
u32 *pix = panic->vaddr + offset;
|
||||
*pix = color;
|
||||
}
|
||||
}
|
||||
|
||||
struct intel_framebuffer *intel_bo_alloc_framebuffer(void)
|
||||
{
|
||||
struct xe_framebuffer *xe_fb;
|
||||
|
||||
xe_fb = kzalloc(sizeof(*xe_fb), GFP_KERNEL);
|
||||
if (xe_fb)
|
||||
return &xe_fb->base;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int intel_bo_panic_setup(struct drm_scanout_buffer *sb)
|
||||
{
|
||||
struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
|
||||
panic->page = -1;
|
||||
sb->set_pixel = xe_panic_page_set_pixel;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void intel_bo_panic_finish(struct intel_framebuffer *fb)
|
||||
{
|
||||
struct xe_panic_data *panic = to_xe_panic_data(fb);
|
||||
|
||||
xe_panic_kunmap(panic);
|
||||
panic->page = -1;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user