forked from Minki/linux
Merge tag 'drm-intel-fixes-2021-03-18' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
drm/i915 fixes for v5.12-rc4: - Workaround async flip + VT-d frame corruption on HSW/BDW - Fix NMI watchdog crash due to uninitialized OA buffer use on gen12+ Signed-off-by: Dave Airlie <airlied@redhat.com> From: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/87blbg8y5t.fsf@intel.com
This commit is contained in:
commit
0677170bcf
@ -603,7 +603,6 @@ static int append_oa_sample(struct i915_perf_stream *stream,
|
|||||||
{
|
{
|
||||||
int report_size = stream->oa_buffer.format_size;
|
int report_size = stream->oa_buffer.format_size;
|
||||||
struct drm_i915_perf_record_header header;
|
struct drm_i915_perf_record_header header;
|
||||||
u32 sample_flags = stream->sample_flags;
|
|
||||||
|
|
||||||
header.type = DRM_I915_PERF_RECORD_SAMPLE;
|
header.type = DRM_I915_PERF_RECORD_SAMPLE;
|
||||||
header.pad = 0;
|
header.pad = 0;
|
||||||
@ -617,10 +616,8 @@ static int append_oa_sample(struct i915_perf_stream *stream,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
buf += sizeof(header);
|
buf += sizeof(header);
|
||||||
|
|
||||||
if (sample_flags & SAMPLE_OA_REPORT) {
|
if (copy_to_user(buf, report, report_size))
|
||||||
if (copy_to_user(buf, report, report_size))
|
return -EFAULT;
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*offset) += header.size;
|
(*offset) += header.size;
|
||||||
|
|
||||||
@ -2682,7 +2679,7 @@ static void i915_oa_stream_enable(struct i915_perf_stream *stream)
|
|||||||
|
|
||||||
stream->perf->ops.oa_enable(stream);
|
stream->perf->ops.oa_enable(stream);
|
||||||
|
|
||||||
if (stream->periodic)
|
if (stream->sample_flags & SAMPLE_OA_REPORT)
|
||||||
hrtimer_start(&stream->poll_check_timer,
|
hrtimer_start(&stream->poll_check_timer,
|
||||||
ns_to_ktime(stream->poll_oa_period),
|
ns_to_ktime(stream->poll_oa_period),
|
||||||
HRTIMER_MODE_REL_PINNED);
|
HRTIMER_MODE_REL_PINNED);
|
||||||
@ -2745,7 +2742,7 @@ static void i915_oa_stream_disable(struct i915_perf_stream *stream)
|
|||||||
{
|
{
|
||||||
stream->perf->ops.oa_disable(stream);
|
stream->perf->ops.oa_disable(stream);
|
||||||
|
|
||||||
if (stream->periodic)
|
if (stream->sample_flags & SAMPLE_OA_REPORT)
|
||||||
hrtimer_cancel(&stream->poll_check_timer);
|
hrtimer_cancel(&stream->poll_check_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3028,7 +3025,7 @@ static ssize_t i915_perf_read(struct file *file,
|
|||||||
* disabled stream as an error. In particular it might otherwise lead
|
* disabled stream as an error. In particular it might otherwise lead
|
||||||
* to a deadlock for blocking file descriptors...
|
* to a deadlock for blocking file descriptors...
|
||||||
*/
|
*/
|
||||||
if (!stream->enabled)
|
if (!stream->enabled || !(stream->sample_flags & SAMPLE_OA_REPORT))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (!(file->f_flags & O_NONBLOCK)) {
|
if (!(file->f_flags & O_NONBLOCK)) {
|
||||||
|
@ -3316,7 +3316,18 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
|
|||||||
|
|
||||||
#define ILK_DISPLAY_CHICKEN1 _MMIO(0x42000)
|
#define ILK_DISPLAY_CHICKEN1 _MMIO(0x42000)
|
||||||
#define ILK_FBCQ_DIS (1 << 22)
|
#define ILK_FBCQ_DIS (1 << 22)
|
||||||
#define ILK_PABSTRETCH_DIS (1 << 21)
|
#define ILK_PABSTRETCH_DIS REG_BIT(21)
|
||||||
|
#define ILK_SABSTRETCH_DIS REG_BIT(20)
|
||||||
|
#define IVB_PRI_STRETCH_MAX_MASK REG_GENMASK(21, 20)
|
||||||
|
#define IVB_PRI_STRETCH_MAX_X8 REG_FIELD_PREP(IVB_PRI_STRETCH_MAX_MASK, 0)
|
||||||
|
#define IVB_PRI_STRETCH_MAX_X4 REG_FIELD_PREP(IVB_PRI_STRETCH_MAX_MASK, 1)
|
||||||
|
#define IVB_PRI_STRETCH_MAX_X2 REG_FIELD_PREP(IVB_PRI_STRETCH_MAX_MASK, 2)
|
||||||
|
#define IVB_PRI_STRETCH_MAX_X1 REG_FIELD_PREP(IVB_PRI_STRETCH_MAX_MASK, 3)
|
||||||
|
#define IVB_SPR_STRETCH_MAX_MASK REG_GENMASK(19, 18)
|
||||||
|
#define IVB_SPR_STRETCH_MAX_X8 REG_FIELD_PREP(IVB_SPR_STRETCH_MAX_MASK, 0)
|
||||||
|
#define IVB_SPR_STRETCH_MAX_X4 REG_FIELD_PREP(IVB_SPR_STRETCH_MAX_MASK, 1)
|
||||||
|
#define IVB_SPR_STRETCH_MAX_X2 REG_FIELD_PREP(IVB_SPR_STRETCH_MAX_MASK, 2)
|
||||||
|
#define IVB_SPR_STRETCH_MAX_X1 REG_FIELD_PREP(IVB_SPR_STRETCH_MAX_MASK, 3)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -8039,6 +8050,16 @@ enum {
|
|||||||
|
|
||||||
#define _CHICKEN_PIPESL_1_A 0x420b0
|
#define _CHICKEN_PIPESL_1_A 0x420b0
|
||||||
#define _CHICKEN_PIPESL_1_B 0x420b4
|
#define _CHICKEN_PIPESL_1_B 0x420b4
|
||||||
|
#define HSW_PRI_STRETCH_MAX_MASK REG_GENMASK(28, 27)
|
||||||
|
#define HSW_PRI_STRETCH_MAX_X8 REG_FIELD_PREP(HSW_PRI_STRETCH_MAX_MASK, 0)
|
||||||
|
#define HSW_PRI_STRETCH_MAX_X4 REG_FIELD_PREP(HSW_PRI_STRETCH_MAX_MASK, 1)
|
||||||
|
#define HSW_PRI_STRETCH_MAX_X2 REG_FIELD_PREP(HSW_PRI_STRETCH_MAX_MASK, 2)
|
||||||
|
#define HSW_PRI_STRETCH_MAX_X1 REG_FIELD_PREP(HSW_PRI_STRETCH_MAX_MASK, 3)
|
||||||
|
#define HSW_SPR_STRETCH_MAX_MASK REG_GENMASK(26, 25)
|
||||||
|
#define HSW_SPR_STRETCH_MAX_X8 REG_FIELD_PREP(HSW_SPR_STRETCH_MAX_MASK, 0)
|
||||||
|
#define HSW_SPR_STRETCH_MAX_X4 REG_FIELD_PREP(HSW_SPR_STRETCH_MAX_MASK, 1)
|
||||||
|
#define HSW_SPR_STRETCH_MAX_X2 REG_FIELD_PREP(HSW_SPR_STRETCH_MAX_MASK, 2)
|
||||||
|
#define HSW_SPR_STRETCH_MAX_X1 REG_FIELD_PREP(HSW_SPR_STRETCH_MAX_MASK, 3)
|
||||||
#define HSW_FBCQ_DIS (1 << 22)
|
#define HSW_FBCQ_DIS (1 << 22)
|
||||||
#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0)
|
#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0)
|
||||||
#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B)
|
#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B)
|
||||||
|
@ -7245,11 +7245,16 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
|
|||||||
intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
|
intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
|
||||||
intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
|
intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
|
||||||
|
|
||||||
/* WaPsrDPRSUnmaskVBlankInSRD:bdw */
|
|
||||||
for_each_pipe(dev_priv, pipe) {
|
for_each_pipe(dev_priv, pipe) {
|
||||||
|
/* WaPsrDPRSUnmaskVBlankInSRD:bdw */
|
||||||
intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
|
intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
|
||||||
intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) |
|
intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) |
|
||||||
BDW_DPRS_MASK_VBLANK_SRD);
|
BDW_DPRS_MASK_VBLANK_SRD);
|
||||||
|
|
||||||
|
/* Undocumented but fixes async flip + VT-d corruption */
|
||||||
|
if (intel_vtd_active())
|
||||||
|
intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
|
||||||
|
HSW_PRI_STRETCH_MAX_MASK, HSW_PRI_STRETCH_MAX_X1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* WaVSRefCountFullforceMissDisable:bdw */
|
/* WaVSRefCountFullforceMissDisable:bdw */
|
||||||
@ -7285,11 +7290,20 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
|
|||||||
|
|
||||||
static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
|
static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
|
enum pipe pipe;
|
||||||
|
|
||||||
/* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
|
/* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
|
||||||
intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
|
intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
|
||||||
intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
|
intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
|
||||||
HSW_FBCQ_DIS);
|
HSW_FBCQ_DIS);
|
||||||
|
|
||||||
|
for_each_pipe(dev_priv, pipe) {
|
||||||
|
/* Undocumented but fixes async flip + VT-d corruption */
|
||||||
|
if (intel_vtd_active())
|
||||||
|
intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
|
||||||
|
HSW_PRI_STRETCH_MAX_MASK, HSW_PRI_STRETCH_MAX_X1);
|
||||||
|
}
|
||||||
|
|
||||||
/* This is required by WaCatErrorRejectionIssue:hsw */
|
/* This is required by WaCatErrorRejectionIssue:hsw */
|
||||||
intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
|
intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
|
||||||
intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
|
intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
|
||||||
|
Loading…
Reference in New Issue
Block a user