mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
Merge tag 'drm-intel-fixes-2023-03-23' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
drm/i915 fixes for v6.3-rc4: - Fix an MTL workaround - Fix fbdev obj locking before vma pin - Fix state inheritance tracking in initial commit - Fix missing GuC error capture codes - Fix missing debug object activation - Fix uc init late order relative to probe error injection - Fix perf limit reasons formatting - Fix vblank timestamp update on seamless M/N changes Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> From: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/878rfn7njw.fsf@intel.com
This commit is contained in:
commit
e37fef79bf
@ -683,6 +683,14 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state)
|
||||
*/
|
||||
intel_vrr_send_push(new_crtc_state);
|
||||
|
||||
/*
|
||||
* Seamless M/N update may need to update frame timings.
|
||||
*
|
||||
* FIXME Should be synchronized with the start of vblank somehow...
|
||||
*/
|
||||
if (new_crtc_state->seamless_m_n && intel_crtc_needs_fastset(new_crtc_state))
|
||||
intel_crtc_update_active_timings(new_crtc_state);
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
if (intel_vgpu_active(dev_priv))
|
||||
|
@ -5145,6 +5145,7 @@ intel_crtc_prepare_cleared_state(struct intel_atomic_state *state,
|
||||
* only fields that are know to not cause problems are preserved. */
|
||||
|
||||
saved_state->uapi = crtc_state->uapi;
|
||||
saved_state->inherited = crtc_state->inherited;
|
||||
saved_state->scaler_state = crtc_state->scaler_state;
|
||||
saved_state->shared_dpll = crtc_state->shared_dpll;
|
||||
saved_state->dpll_hw_state = crtc_state->dpll_hw_state;
|
||||
|
@ -384,15 +384,12 @@ static void disable_all_event_handlers(struct drm_i915_private *i915)
|
||||
}
|
||||
}
|
||||
|
||||
static void pipedmc_clock_gating_wa(struct drm_i915_private *i915, bool enable)
|
||||
static void adlp_pipedmc_clock_gating_wa(struct drm_i915_private *i915, bool enable)
|
||||
{
|
||||
enum pipe pipe;
|
||||
|
||||
if (DISPLAY_VER(i915) < 13)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Wa_16015201720:adl-p,dg2, mtl
|
||||
* Wa_16015201720:adl-p,dg2
|
||||
* The WA requires clock gating to be disabled all the time
|
||||
* for pipe A and B.
|
||||
* For pipe C and D clock gating needs to be disabled only
|
||||
@ -408,6 +405,25 @@ static void pipedmc_clock_gating_wa(struct drm_i915_private *i915, bool enable)
|
||||
PIPEDMC_GATING_DIS, 0);
|
||||
}
|
||||
|
||||
static void mtl_pipedmc_clock_gating_wa(struct drm_i915_private *i915)
|
||||
{
|
||||
/*
|
||||
* Wa_16015201720
|
||||
* The WA requires clock gating to be disabled all the time
|
||||
* for pipe A and B.
|
||||
*/
|
||||
intel_de_rmw(i915, GEN9_CLKGATE_DIS_0, 0,
|
||||
MTL_PIPEDMC_GATING_DIS_A | MTL_PIPEDMC_GATING_DIS_B);
|
||||
}
|
||||
|
||||
static void pipedmc_clock_gating_wa(struct drm_i915_private *i915, bool enable)
|
||||
{
|
||||
if (DISPLAY_VER(i915) >= 14 && enable)
|
||||
mtl_pipedmc_clock_gating_wa(i915);
|
||||
else if (DISPLAY_VER(i915) == 13)
|
||||
adlp_pipedmc_clock_gating_wa(i915, enable);
|
||||
}
|
||||
|
||||
void intel_dmc_enable_pipe(struct drm_i915_private *i915, enum pipe pipe)
|
||||
{
|
||||
if (!has_dmc_id_fw(i915, PIPE_TO_DMC_ID(pipe)))
|
||||
|
@ -210,6 +210,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
bool prealloc = false;
|
||||
void __iomem *vaddr;
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct i915_gem_ww_ctx ww;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ifbdev->hpd_lock);
|
||||
@ -283,13 +284,24 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
info->fix.smem_len = vma->size;
|
||||
}
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
goto out_unpin;
|
||||
for_i915_gem_ww(&ww, ret, false) {
|
||||
ret = i915_gem_object_lock(vma->obj, &ww);
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto out_unpin;
|
||||
|
||||
info->screen_base = vaddr;
|
||||
info->screen_size = vma->size;
|
||||
|
||||
|
@ -737,12 +737,12 @@ int intel_gt_init(struct intel_gt *gt)
|
||||
if (err)
|
||||
goto err_gt;
|
||||
|
||||
intel_uc_init_late(>->uc);
|
||||
|
||||
err = i915_inject_probe_error(gt->i915, -EIO);
|
||||
if (err)
|
||||
goto err_gt;
|
||||
|
||||
intel_uc_init_late(>->uc);
|
||||
|
||||
intel_migrate_init(>->migrate, gt);
|
||||
|
||||
goto out_fw;
|
||||
|
@ -21,31 +21,10 @@
|
||||
#include "intel_rc6.h"
|
||||
#include "intel_rps.h"
|
||||
#include "intel_wakeref.h"
|
||||
#include "intel_pcode.h"
|
||||
#include "pxp/intel_pxp_pm.h"
|
||||
|
||||
#define I915_GT_SUSPEND_IDLE_TIMEOUT (HZ / 2)
|
||||
|
||||
static void mtl_media_busy(struct intel_gt *gt)
|
||||
{
|
||||
/* Wa_14017073508: mtl */
|
||||
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
|
||||
gt->type == GT_MEDIA)
|
||||
snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
|
||||
PCODE_MBOX_GT_STATE_MEDIA_BUSY,
|
||||
PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
|
||||
}
|
||||
|
||||
static void mtl_media_idle(struct intel_gt *gt)
|
||||
{
|
||||
/* Wa_14017073508: mtl */
|
||||
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
|
||||
gt->type == GT_MEDIA)
|
||||
snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
|
||||
PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY,
|
||||
PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
|
||||
}
|
||||
|
||||
static void user_forcewake(struct intel_gt *gt, bool suspend)
|
||||
{
|
||||
int count = atomic_read(>->user_wakeref);
|
||||
@ -93,9 +72,6 @@ static int __gt_unpark(struct intel_wakeref *wf)
|
||||
|
||||
GT_TRACE(gt, "\n");
|
||||
|
||||
/* Wa_14017073508: mtl */
|
||||
mtl_media_busy(gt);
|
||||
|
||||
/*
|
||||
* It seems that the DMC likes to transition between the DC states a lot
|
||||
* when there are no connected displays (no active power domains) during
|
||||
@ -145,9 +121,6 @@ static int __gt_park(struct intel_wakeref *wf)
|
||||
GEM_BUG_ON(!wakeref);
|
||||
intel_display_power_put_async(i915, POWER_DOMAIN_GT_IRQ, wakeref);
|
||||
|
||||
/* Wa_14017073508: mtl */
|
||||
mtl_media_idle(gt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -580,7 +580,7 @@ static bool perf_limit_reasons_eval(void *data)
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(perf_limit_reasons_fops, perf_limit_reasons_get,
|
||||
perf_limit_reasons_clear, "%llu\n");
|
||||
perf_limit_reasons_clear, "0x%llx\n");
|
||||
|
||||
void intel_gt_pm_debugfs_register(struct intel_gt *gt, struct dentry *root)
|
||||
{
|
||||
|
@ -486,6 +486,7 @@ static bool bxt_check_bios_rc6_setup(struct intel_rc6 *rc6)
|
||||
static bool rc6_supported(struct intel_rc6 *rc6)
|
||||
{
|
||||
struct drm_i915_private *i915 = rc6_to_i915(rc6);
|
||||
struct intel_gt *gt = rc6_to_gt(rc6);
|
||||
|
||||
if (!HAS_RC6(i915))
|
||||
return false;
|
||||
@ -502,6 +503,13 @@ static bool rc6_supported(struct intel_rc6 *rc6)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IS_MTL_MEDIA_STEP(gt->i915, STEP_A0, STEP_B0) &&
|
||||
gt->type == GT_MEDIA) {
|
||||
drm_notice(&i915->drm,
|
||||
"Media RC6 disabled on A step\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1571,6 +1571,27 @@ int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *ebuf,
|
||||
|
||||
#endif //CONFIG_DRM_I915_CAPTURE_ERROR
|
||||
|
||||
static void guc_capture_find_ecode(struct intel_engine_coredump *ee)
|
||||
{
|
||||
struct gcap_reg_list_info *reginfo;
|
||||
struct guc_mmio_reg *regs;
|
||||
i915_reg_t reg_ipehr = RING_IPEHR(0);
|
||||
i915_reg_t reg_instdone = RING_INSTDONE(0);
|
||||
int i;
|
||||
|
||||
if (!ee->guc_capture_node)
|
||||
return;
|
||||
|
||||
reginfo = ee->guc_capture_node->reginfo + GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE;
|
||||
regs = reginfo->regs;
|
||||
for (i = 0; i < reginfo->num_regs; i++) {
|
||||
if (regs[i].offset == reg_ipehr.reg)
|
||||
ee->ipehr = regs[i].value;
|
||||
else if (regs[i].offset == reg_instdone.reg)
|
||||
ee->instdone.instdone = regs[i].value;
|
||||
}
|
||||
}
|
||||
|
||||
void intel_guc_capture_free_node(struct intel_engine_coredump *ee)
|
||||
{
|
||||
if (!ee || !ee->guc_capture_node)
|
||||
@ -1612,6 +1633,7 @@ void intel_guc_capture_get_matching_node(struct intel_gt *gt,
|
||||
list_del(&n->link);
|
||||
ee->guc_capture_node = n;
|
||||
ee->guc_capture = guc->capture;
|
||||
guc_capture_find_ecode(ee);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -11,20 +11,9 @@
|
||||
|
||||
static bool __guc_rc_supported(struct intel_guc *guc)
|
||||
{
|
||||
struct intel_gt *gt = guc_to_gt(guc);
|
||||
|
||||
/*
|
||||
* Wa_14017073508: mtl
|
||||
* Do not enable gucrc to avoid additional interrupts which
|
||||
* may disrupt pcode wa.
|
||||
*/
|
||||
if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
|
||||
gt->type == GT_MEDIA)
|
||||
return false;
|
||||
|
||||
/* GuC RC is unavailable for pre-Gen12 */
|
||||
return guc->submission_supported &&
|
||||
GRAPHICS_VER(gt->i915) >= 12;
|
||||
GRAPHICS_VER(guc_to_gt(guc)->i915) >= 12;
|
||||
}
|
||||
|
||||
static bool __guc_rc_selected(struct intel_guc *guc)
|
||||
|
@ -92,8 +92,7 @@ static void debug_active_init(struct i915_active *ref)
|
||||
static void debug_active_activate(struct i915_active *ref)
|
||||
{
|
||||
lockdep_assert_held(&ref->tree_lock);
|
||||
if (!atomic_read(&ref->count)) /* before the first inc */
|
||||
debug_object_activate(ref, &active_debug_desc);
|
||||
debug_object_activate(ref, &active_debug_desc);
|
||||
}
|
||||
|
||||
static void debug_active_deactivate(struct i915_active *ref)
|
||||
|
@ -687,11 +687,6 @@ hwm_get_preregistration_info(struct drm_i915_private *i915)
|
||||
for_each_gt(gt, i915, i)
|
||||
hwm_energy(&hwmon->ddat_gt[i], &energy);
|
||||
}
|
||||
|
||||
/* Enable PL1 power limit */
|
||||
if (i915_mmio_reg_valid(hwmon->rg.pkg_rapl_limit))
|
||||
hwm_locked_with_pm_intel_uncore_rmw(ddat, hwmon->rg.pkg_rapl_limit,
|
||||
PKG_PWR_LIM_1_EN, PKG_PWR_LIM_1_EN);
|
||||
}
|
||||
|
||||
void i915_hwmon_register(struct drm_i915_private *i915)
|
||||
|
@ -1786,9 +1786,11 @@
|
||||
* GEN9 clock gating regs
|
||||
*/
|
||||
#define GEN9_CLKGATE_DIS_0 _MMIO(0x46530)
|
||||
#define DARBF_GATING_DIS (1 << 27)
|
||||
#define PWM2_GATING_DIS (1 << 14)
|
||||
#define PWM1_GATING_DIS (1 << 13)
|
||||
#define DARBF_GATING_DIS REG_BIT(27)
|
||||
#define MTL_PIPEDMC_GATING_DIS_A REG_BIT(15)
|
||||
#define MTL_PIPEDMC_GATING_DIS_B REG_BIT(14)
|
||||
#define PWM2_GATING_DIS REG_BIT(14)
|
||||
#define PWM1_GATING_DIS REG_BIT(13)
|
||||
|
||||
#define GEN9_CLKGATE_DIS_3 _MMIO(0x46538)
|
||||
#define TGL_VRH_GATING_DIS REG_BIT(31)
|
||||
@ -6596,15 +6598,6 @@
|
||||
/* XEHP_PCODE_FREQUENCY_CONFIG param2 */
|
||||
#define PCODE_MBOX_DOMAIN_NONE 0x0
|
||||
#define PCODE_MBOX_DOMAIN_MEDIAFF 0x3
|
||||
|
||||
/* Wa_14017210380: mtl */
|
||||
#define PCODE_MBOX_GT_STATE 0x50
|
||||
/* sub-commands (param1) */
|
||||
#define PCODE_MBOX_GT_STATE_MEDIA_BUSY 0x1
|
||||
#define PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY 0x2
|
||||
/* param2 */
|
||||
#define PCODE_MBOX_GT_STATE_DOMAIN_MEDIA 0x1
|
||||
|
||||
#define GEN6_PCODE_DATA _MMIO(0x138128)
|
||||
#define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8
|
||||
#define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
|
||||
|
Loading…
Reference in New Issue
Block a user