mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 10:20:17 -04:00
drm/xe/display: Add intel_plane_initial_vblank_wait
We're changing the driver to have no interrupts during early init for Xe, so we poll the PIPE_FRMSTMSMP counter instead. Interrupts cannot be enabled during FB readout because memirq's requires an allocation. This would overwrite the FB we want to read out. While it might be possible to also run do the same in i915 and run it without interrupts, the platforms i915 supports had a less clear distinction between display and graphics. For this reason I choose only to touch Xe for now. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250121142850.4960-1-dev@lankhorst.se Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
This commit is contained in:
@@ -796,7 +796,7 @@ void intel_plane_disable_noatomic(struct intel_crtc *crtc,
|
||||
if ((crtc_state->active_planes & ~BIT(PLANE_CURSOR)) == 0 &&
|
||||
hsw_ips_disable(crtc_state)) {
|
||||
crtc_state->ips_enabled = false;
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
intel_plane_initial_vblank_wait(crtc);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -810,7 +810,7 @@ void intel_plane_disable_noatomic(struct intel_crtc *crtc,
|
||||
*/
|
||||
if (HAS_GMCH(dev_priv) &&
|
||||
intel_set_memory_cxsr(dev_priv, false))
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
intel_plane_initial_vblank_wait(crtc);
|
||||
|
||||
/*
|
||||
* Gen2 reports pipe underruns whenever all planes are disabled.
|
||||
@@ -820,7 +820,7 @@ void intel_plane_disable_noatomic(struct intel_crtc *crtc,
|
||||
intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
|
||||
|
||||
intel_plane_disable_arm(NULL, plane, crtc_state);
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
intel_plane_initial_vblank_wait(crtc);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_plane_initial.h"
|
||||
|
||||
void intel_plane_initial_vblank_wait(struct intel_crtc *crtc)
|
||||
{
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
}
|
||||
|
||||
static bool
|
||||
intel_reuse_initial_plane_obj(struct intel_crtc *this,
|
||||
const struct intel_initial_plane_config plane_configs[],
|
||||
@@ -442,7 +447,7 @@ void intel_initial_plane_config(struct intel_display *display)
|
||||
intel_find_initial_plane_obj(crtc, plane_configs);
|
||||
|
||||
if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config))
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
intel_plane_initial_vblank_wait(crtc);
|
||||
|
||||
plane_config_fini(plane_config);
|
||||
}
|
||||
|
||||
@@ -6,8 +6,10 @@
|
||||
#ifndef __INTEL_PLANE_INITIAL_H__
|
||||
#define __INTEL_PLANE_INITIAL_H__
|
||||
|
||||
struct intel_crtc;
|
||||
struct intel_display;
|
||||
|
||||
void intel_initial_plane_config(struct intel_display *display);
|
||||
void intel_plane_initial_vblank_wait(struct intel_crtc *crtc);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
|
||||
#include "regs/xe_gtt_defs.h"
|
||||
#include "xe_ggtt.h"
|
||||
#include "xe_mmio.h"
|
||||
|
||||
#include "i915_reg.h"
|
||||
#include "intel_atomic_plane.h"
|
||||
#include "intel_crtc.h"
|
||||
#include "intel_display.h"
|
||||
@@ -22,6 +24,21 @@
|
||||
|
||||
#include <generated/xe_wa_oob.h>
|
||||
|
||||
void intel_plane_initial_vblank_wait(struct intel_crtc *crtc)
|
||||
{
|
||||
/* Early xe has no irq */
|
||||
struct xe_device *xe = to_xe_device(crtc->base.dev);
|
||||
struct xe_reg pipe_frmtmstmp = XE_REG(i915_mmio_reg_offset(PIPE_FRMTMSTMP(crtc->pipe)));
|
||||
u32 timestamp;
|
||||
int ret;
|
||||
|
||||
timestamp = xe_mmio_read32(xe_root_tile_mmio(xe), pipe_frmtmstmp);
|
||||
|
||||
ret = xe_mmio_wait32_not(xe_root_tile_mmio(xe), pipe_frmtmstmp, ~0U, timestamp, 40000U, ×tamp, false);
|
||||
if (ret < 0)
|
||||
drm_warn(&xe->drm, "waiting for early vblank failed with %i\n", ret);
|
||||
}
|
||||
|
||||
static bool
|
||||
intel_reuse_initial_plane_obj(struct intel_crtc *this,
|
||||
const struct intel_initial_plane_config plane_configs[],
|
||||
@@ -303,7 +320,7 @@ void intel_initial_plane_config(struct intel_display *display)
|
||||
intel_find_initial_plane_obj(crtc, plane_configs);
|
||||
|
||||
if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config))
|
||||
intel_crtc_wait_for_next_vblank(crtc);
|
||||
intel_plane_initial_vblank_wait(crtc);
|
||||
|
||||
plane_config_fini(plane_config);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user