On MTL the GOP (for whatever reason) likes to bind its framebuffer high up in the ggtt address space. This can conflict with whatever ggtt_reserve_guc_top() is trying to do, and the result is that ggtt_reserve_guc_top() fails and then we proceed to explode when trying to tear down the driver. Thus far I haven't analyzed what causes the actual fireworks, but it's not super important as even if it didn't explode we'd still fail the driver load and the user would be left with an unusable GPU. To remedy this (without having to figure out exactly what ggtt_reserve_guc_top() is trying to achieve) we can attempt to relocate the BIOS framebuffer to a lower ggtt address. We can do this at this early point in driver init because nothing else is supposed to be clobbering the ggtt yet. So we simply change where in the ggtt we pin the vma, the original PTEs will be left as is, and the new PTEs will get written with the same dma addresses. The plane will keep on scanning out from the original PTEs until we are done with the whole process, and at that point we rewrite the plane's surface address register to point at the new ggtt address. Since we don't need a specific ggtt address for the plane (apart from needing it to land in the mappable region for normal stolen objects) we'll just try to pin it without a fixed offset first. It should end up at the lowest available address (which really should be 0 at this point in the driver init). If that fails we'll fall back to just pinning it exactly to the origianal address. To make sure we don't accidentlally pin it partially over the original ggtt range (as that would corrupt the original PTEs) we reserve the original range temporarily during this process. v2: Try to pin explicitly to ggtt offset 0 as otherwise DG2 puts it even higher (atm we have no PIN_LOW flag to force it low) v3: "fix" xe Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> Tested-by: Paz Zcharya <pazz@chromium.org> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240202224340.30647-16-ville.syrjala@linux.intel.com Acked-by: Lucas De Marchi <lucas.demarchi@intel.com>
58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2020 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _I9XX_PLANE_H_
|
|
#define _I9XX_PLANE_H_
|
|
|
|
#include <linux/types.h>
|
|
|
|
enum pipe;
|
|
struct drm_i915_private;
|
|
struct intel_crtc;
|
|
struct intel_initial_plane_config;
|
|
struct intel_plane;
|
|
struct intel_plane_state;
|
|
|
|
#ifdef I915
|
|
unsigned int i965_plane_max_stride(struct intel_plane *plane,
|
|
u32 pixel_format, u64 modifier,
|
|
unsigned int rotation);
|
|
int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
|
|
|
|
struct intel_plane *
|
|
intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe);
|
|
|
|
void i9xx_get_initial_plane_config(struct intel_crtc *crtc,
|
|
struct intel_initial_plane_config *plane_config);
|
|
bool i9xx_fixup_initial_plane_config(struct intel_crtc *crtc,
|
|
const struct intel_initial_plane_config *plane_config);
|
|
#else
|
|
static inline unsigned int i965_plane_max_stride(struct intel_plane *plane,
|
|
u32 pixel_format, u64 modifier,
|
|
unsigned int rotation)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline struct intel_plane *
|
|
intel_primary_plane_create(struct drm_i915_private *dev_priv, int pipe)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline void i9xx_get_initial_plane_config(struct intel_crtc *crtc,
|
|
struct intel_initial_plane_config *plane_config)
|
|
{
|
|
}
|
|
static inline bool i9xx_fixup_initial_plane_config(struct intel_crtc *crtc,
|
|
const struct intel_initial_plane_config *plane_config)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#endif
|