diff options
author | Dave Airlie <airlied@redhat.com> | 2016-07-19 04:00:15 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-07-19 04:00:15 -0400 |
commit | cad7d8d9041c00142f91585b2bf0b2673cb152ef (patch) | |
tree | fd10da38106a52d44a55ec96d199ecb36ba5859e | |
parent | 84ade45e056f2e292f07c54446c176d0112d9574 (diff) | |
parent | a4a027a860ff58df8df0796d730397a3b30dbc9a (diff) |
Merge tag 'topic/kbl-4.7-fixes-2016-07-18' of git://anongit.freedesktop.org/drm-intel into drm-fixes
As promised here's the pile of kbl cherry-picks assembled by Mika&Rodrigo.
It's a bit much, but all well-contained to kbl code and been tested for a
while in drm-intel-next. Still separate in case too much, but in that case
I think we'd need to disable kbl by default again (which would be annoying
too) in 4.7.
* tag 'topic/kbl-4.7-fixes-2016-07-18' of git://anongit.freedesktop.org/drm-intel: (28 commits)
drm/i915/kbl: Introduce the first official DMC for Kabylake.
drm/i915: Introduce Kabypoint PCH for Kabylake H/DT.
drm/i915/gen9: implement WaConextSwitchWithConcurrentTLBInvalidate
drm/i915/gen9: Add WaFbcHighMemBwCorruptionAvoidance
drm/i195/fbc: Add WaFbcNukeOnHostModify
drm/i915/gen9: Add WaFbcWakeMemOn
drm/i915/gen9: Add WaFbcTurnOffFbcWatermark
drm/i915/kbl: Add WaClearSlmSpaceAtContextSwitch
drm/i915/gen9: Add WaEnableChickenDCPR
drm/i915/kbl: Add WaDisableSbeCacheDispatchPortSharing
drm/i915/kbl: Add WaDisableGafsUnitClkGating
drm/i915/kbl: Add WaForGAMHang
drm/i915: Add WaInsertDummyPushConstP for bxt and kbl
drm/i915/kbl: Add WaDisableDynamicCreditSharing
drm/i915/kbl: Add WaDisableGamClockGating
drm/i915/gen9: Enable must set chicken bits in config0 reg
drm/i915/kbl: Add WaDisableLSQCROPERFforOCL
drm/i915/kbl: Add WaDisableSDEUnitClockGating
drm/i915/kbl: Add WaDisableFenceDestinationToSLM for A0
drm/i915/kbl: Add WaEnableGapsTsvCreditFix
...
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_csr.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 59 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 64 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 153 |
10 files changed, 295 insertions, 61 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f313b4d8344f..85c4debf47e0 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -512,6 +512,10 @@ void intel_detect_pch(struct drm_device *dev) | |||
512 | DRM_DEBUG_KMS("Found SunrisePoint LP PCH\n"); | 512 | DRM_DEBUG_KMS("Found SunrisePoint LP PCH\n"); |
513 | WARN_ON(!IS_SKYLAKE(dev) && | 513 | WARN_ON(!IS_SKYLAKE(dev) && |
514 | !IS_KABYLAKE(dev)); | 514 | !IS_KABYLAKE(dev)); |
515 | } else if (id == INTEL_PCH_KBP_DEVICE_ID_TYPE) { | ||
516 | dev_priv->pch_type = PCH_KBP; | ||
517 | DRM_DEBUG_KMS("Found KabyPoint PCH\n"); | ||
518 | WARN_ON(!IS_KABYLAKE(dev)); | ||
515 | } else if ((id == INTEL_PCH_P2X_DEVICE_ID_TYPE) || | 519 | } else if ((id == INTEL_PCH_P2X_DEVICE_ID_TYPE) || |
516 | (id == INTEL_PCH_P3X_DEVICE_ID_TYPE) || | 520 | (id == INTEL_PCH_P3X_DEVICE_ID_TYPE) || |
517 | ((id == INTEL_PCH_QEMU_DEVICE_ID_TYPE) && | 521 | ((id == INTEL_PCH_QEMU_DEVICE_ID_TYPE) && |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7c334e902266..bc3f2e6842e7 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -990,6 +990,7 @@ enum intel_pch { | |||
990 | PCH_CPT, /* Cougarpoint PCH */ | 990 | PCH_CPT, /* Cougarpoint PCH */ |
991 | PCH_LPT, /* Lynxpoint PCH */ | 991 | PCH_LPT, /* Lynxpoint PCH */ |
992 | PCH_SPT, /* Sunrisepoint PCH */ | 992 | PCH_SPT, /* Sunrisepoint PCH */ |
993 | PCH_KBP, /* Kabypoint PCH */ | ||
993 | PCH_NOP, | 994 | PCH_NOP, |
994 | }; | 995 | }; |
995 | 996 | ||
@@ -2600,6 +2601,15 @@ struct drm_i915_cmd_table { | |||
2600 | 2601 | ||
2601 | #define IS_BXT_REVID(p, since, until) (IS_BROXTON(p) && IS_REVID(p, since, until)) | 2602 | #define IS_BXT_REVID(p, since, until) (IS_BROXTON(p) && IS_REVID(p, since, until)) |
2602 | 2603 | ||
2604 | #define KBL_REVID_A0 0x0 | ||
2605 | #define KBL_REVID_B0 0x1 | ||
2606 | #define KBL_REVID_C0 0x2 | ||
2607 | #define KBL_REVID_D0 0x3 | ||
2608 | #define KBL_REVID_E0 0x4 | ||
2609 | |||
2610 | #define IS_KBL_REVID(p, since, until) \ | ||
2611 | (IS_KABYLAKE(p) && IS_REVID(p, since, until)) | ||
2612 | |||
2603 | /* | 2613 | /* |
2604 | * The genX designation typically refers to the render engine, so render | 2614 | * The genX designation typically refers to the render engine, so render |
2605 | * capability related checks should use IS_GEN, while display and other checks | 2615 | * capability related checks should use IS_GEN, while display and other checks |
@@ -2708,11 +2718,13 @@ struct drm_i915_cmd_table { | |||
2708 | #define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE 0x9c00 | 2718 | #define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE 0x9c00 |
2709 | #define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100 | 2719 | #define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100 |
2710 | #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00 | 2720 | #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00 |
2721 | #define INTEL_PCH_KBP_DEVICE_ID_TYPE 0xA200 | ||
2711 | #define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 | 2722 | #define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 |
2712 | #define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000 | 2723 | #define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000 |
2713 | #define INTEL_PCH_QEMU_DEVICE_ID_TYPE 0x2900 /* qemu q35 has 2918 */ | 2724 | #define INTEL_PCH_QEMU_DEVICE_ID_TYPE 0x2900 /* qemu q35 has 2918 */ |
2714 | 2725 | ||
2715 | #define INTEL_PCH_TYPE(dev) (__I915__(dev)->pch_type) | 2726 | #define INTEL_PCH_TYPE(dev) (__I915__(dev)->pch_type) |
2727 | #define HAS_PCH_KBP(dev) (INTEL_PCH_TYPE(dev) == PCH_KBP) | ||
2716 | #define HAS_PCH_SPT(dev) (INTEL_PCH_TYPE(dev) == PCH_SPT) | 2728 | #define HAS_PCH_SPT(dev) (INTEL_PCH_TYPE(dev) == PCH_SPT) |
2717 | #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT) | 2729 | #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT) |
2718 | #define HAS_PCH_LPT_LP(dev) (__I915__(dev)->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) | 2730 | #define HAS_PCH_LPT_LP(dev) (__I915__(dev)->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) |
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index b7ce963fb8f8..44004e3f09e4 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
@@ -55,8 +55,10 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv, | |||
55 | return -ENODEV; | 55 | return -ENODEV; |
56 | 56 | ||
57 | /* See the comment at the drm_mm_init() call for more about this check. | 57 | /* See the comment at the drm_mm_init() call for more about this check. |
58 | * WaSkipStolenMemoryFirstPage:bdw,chv (incomplete) */ | 58 | * WaSkipStolenMemoryFirstPage:bdw,chv,kbl (incomplete) |
59 | if (INTEL_INFO(dev_priv)->gen == 8 && start < 4096) | 59 | */ |
60 | if (start < 4096 && (IS_GEN8(dev_priv) || | ||
61 | IS_KBL_REVID(dev_priv, 0, KBL_REVID_A0))) | ||
60 | start = 4096; | 62 | start = 4096; |
61 | 63 | ||
62 | mutex_lock(&dev_priv->mm.stolen_lock); | 64 | mutex_lock(&dev_priv->mm.stolen_lock); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2f6fd33c07ba..aab47f7bb61b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -2471,7 +2471,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2471 | I915_WRITE(SDEIIR, iir); | 2471 | I915_WRITE(SDEIIR, iir); |
2472 | ret = IRQ_HANDLED; | 2472 | ret = IRQ_HANDLED; |
2473 | 2473 | ||
2474 | if (HAS_PCH_SPT(dev_priv)) | 2474 | if (HAS_PCH_SPT(dev_priv) || HAS_PCH_KBP(dev_priv)) |
2475 | spt_irq_handler(dev, iir); | 2475 | spt_irq_handler(dev, iir); |
2476 | else | 2476 | else |
2477 | cpt_irq_handler(dev, iir); | 2477 | cpt_irq_handler(dev, iir); |
@@ -4661,7 +4661,7 @@ void intel_irq_init(struct drm_i915_private *dev_priv) | |||
4661 | dev->driver->disable_vblank = gen8_disable_vblank; | 4661 | dev->driver->disable_vblank = gen8_disable_vblank; |
4662 | if (IS_BROXTON(dev)) | 4662 | if (IS_BROXTON(dev)) |
4663 | dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup; | 4663 | dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup; |
4664 | else if (HAS_PCH_SPT(dev)) | 4664 | else if (HAS_PCH_SPT(dev) || HAS_PCH_KBP(dev)) |
4665 | dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup; | 4665 | dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup; |
4666 | else | 4666 | else |
4667 | dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup; | 4667 | dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup; |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index b407411e31ba..3fcf7dd5b6ca 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -220,6 +220,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) | |||
220 | #define ECOCHK_PPGTT_WT_HSW (0x2<<3) | 220 | #define ECOCHK_PPGTT_WT_HSW (0x2<<3) |
221 | #define ECOCHK_PPGTT_WB_HSW (0x3<<3) | 221 | #define ECOCHK_PPGTT_WB_HSW (0x3<<3) |
222 | 222 | ||
223 | #define GEN8_CONFIG0 _MMIO(0xD00) | ||
224 | #define GEN9_DEFAULT_FIXES (1 << 3 | 1 << 2 | 1 << 1) | ||
225 | |||
223 | #define GAC_ECO_BITS _MMIO(0x14090) | 226 | #define GAC_ECO_BITS _MMIO(0x14090) |
224 | #define ECOBITS_SNB_BIT (1<<13) | 227 | #define ECOBITS_SNB_BIT (1<<13) |
225 | #define ECOBITS_PPGTT_CACHE64B (3<<8) | 228 | #define ECOBITS_PPGTT_CACHE64B (3<<8) |
@@ -1669,6 +1672,9 @@ enum skl_disp_power_wells { | |||
1669 | 1672 | ||
1670 | #define GEN7_TLB_RD_ADDR _MMIO(0x4700) | 1673 | #define GEN7_TLB_RD_ADDR _MMIO(0x4700) |
1671 | 1674 | ||
1675 | #define GAMT_CHKN_BIT_REG _MMIO(0x4ab8) | ||
1676 | #define GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING (1<<28) | ||
1677 | |||
1672 | #if 0 | 1678 | #if 0 |
1673 | #define PRB0_TAIL _MMIO(0x2030) | 1679 | #define PRB0_TAIL _MMIO(0x2030) |
1674 | #define PRB0_HEAD _MMIO(0x2034) | 1680 | #define PRB0_HEAD _MMIO(0x2034) |
@@ -1804,6 +1810,10 @@ enum skl_disp_power_wells { | |||
1804 | #define GEN9_IZ_HASHING_MASK(slice) (0x3 << ((slice) * 2)) | 1810 | #define GEN9_IZ_HASHING_MASK(slice) (0x3 << ((slice) * 2)) |
1805 | #define GEN9_IZ_HASHING(slice, val) ((val) << ((slice) * 2)) | 1811 | #define GEN9_IZ_HASHING(slice, val) ((val) << ((slice) * 2)) |
1806 | 1812 | ||
1813 | /* chicken reg for WaConextSwitchWithConcurrentTLBInvalidate */ | ||
1814 | #define GEN9_CSFE_CHICKEN1_RCS _MMIO(0x20D4) | ||
1815 | #define GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE (1 << 2) | ||
1816 | |||
1807 | /* WaClearTdlStateAckDirtyBits */ | 1817 | /* WaClearTdlStateAckDirtyBits */ |
1808 | #define GEN8_STATE_ACK _MMIO(0x20F0) | 1818 | #define GEN8_STATE_ACK _MMIO(0x20F0) |
1809 | #define GEN9_STATE_ACK_SLICE1 _MMIO(0x20F8) | 1819 | #define GEN9_STATE_ACK_SLICE1 _MMIO(0x20F8) |
@@ -2200,6 +2210,8 @@ enum skl_disp_power_wells { | |||
2200 | #define ILK_DPFC_STATUS _MMIO(0x43210) | 2210 | #define ILK_DPFC_STATUS _MMIO(0x43210) |
2201 | #define ILK_DPFC_FENCE_YOFF _MMIO(0x43218) | 2211 | #define ILK_DPFC_FENCE_YOFF _MMIO(0x43218) |
2202 | #define ILK_DPFC_CHICKEN _MMIO(0x43224) | 2212 | #define ILK_DPFC_CHICKEN _MMIO(0x43224) |
2213 | #define ILK_DPFC_DISABLE_DUMMY0 (1<<8) | ||
2214 | #define ILK_DPFC_NUKE_ON_ANY_MODIFICATION (1<<23) | ||
2203 | #define ILK_FBC_RT_BASE _MMIO(0x2128) | 2215 | #define ILK_FBC_RT_BASE _MMIO(0x2128) |
2204 | #define ILK_FBC_RT_VALID (1<<0) | 2216 | #define ILK_FBC_RT_VALID (1<<0) |
2205 | #define SNB_FBC_FRONT_BUFFER (1<<1) | 2217 | #define SNB_FBC_FRONT_BUFFER (1<<1) |
@@ -6031,6 +6043,7 @@ enum skl_disp_power_wells { | |||
6031 | #define CHICKEN_PAR1_1 _MMIO(0x42080) | 6043 | #define CHICKEN_PAR1_1 _MMIO(0x42080) |
6032 | #define DPA_MASK_VBLANK_SRD (1 << 15) | 6044 | #define DPA_MASK_VBLANK_SRD (1 << 15) |
6033 | #define FORCE_ARB_IDLE_PLANES (1 << 14) | 6045 | #define FORCE_ARB_IDLE_PLANES (1 << 14) |
6046 | #define SKL_EDP_PSR_FIX_RDWRAP (1 << 3) | ||
6034 | 6047 | ||
6035 | #define _CHICKEN_PIPESL_1_A 0x420b0 | 6048 | #define _CHICKEN_PIPESL_1_A 0x420b0 |
6036 | #define _CHICKEN_PIPESL_1_B 0x420b4 | 6049 | #define _CHICKEN_PIPESL_1_B 0x420b4 |
@@ -6039,6 +6052,7 @@ enum skl_disp_power_wells { | |||
6039 | #define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) | 6052 | #define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) |
6040 | 6053 | ||
6041 | #define DISP_ARB_CTL _MMIO(0x45000) | 6054 | #define DISP_ARB_CTL _MMIO(0x45000) |
6055 | #define DISP_FBC_MEMORY_WAKE (1<<31) | ||
6042 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) | 6056 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) |
6043 | #define DISP_FBC_WM_DIS (1<<15) | 6057 | #define DISP_FBC_WM_DIS (1<<15) |
6044 | #define DISP_ARB_CTL2 _MMIO(0x45004) | 6058 | #define DISP_ARB_CTL2 _MMIO(0x45004) |
@@ -6052,6 +6066,9 @@ enum skl_disp_power_wells { | |||
6052 | #define HSW_NDE_RSTWRN_OPT _MMIO(0x46408) | 6066 | #define HSW_NDE_RSTWRN_OPT _MMIO(0x46408) |
6053 | #define RESET_PCH_HANDSHAKE_ENABLE (1<<4) | 6067 | #define RESET_PCH_HANDSHAKE_ENABLE (1<<4) |
6054 | 6068 | ||
6069 | #define GEN8_CHICKEN_DCPR_1 _MMIO(0x46430) | ||
6070 | #define MASK_WAKEMEM (1<<13) | ||
6071 | |||
6055 | #define SKL_DFSM _MMIO(0x51000) | 6072 | #define SKL_DFSM _MMIO(0x51000) |
6056 | #define SKL_DFSM_CDCLK_LIMIT_MASK (3 << 23) | 6073 | #define SKL_DFSM_CDCLK_LIMIT_MASK (3 << 23) |
6057 | #define SKL_DFSM_CDCLK_LIMIT_675 (0 << 23) | 6074 | #define SKL_DFSM_CDCLK_LIMIT_675 (0 << 23) |
@@ -6069,6 +6086,7 @@ enum skl_disp_power_wells { | |||
6069 | #define GEN9_TSG_BARRIER_ACK_DISABLE (1<<8) | 6086 | #define GEN9_TSG_BARRIER_ACK_DISABLE (1<<8) |
6070 | 6087 | ||
6071 | #define GEN9_CS_DEBUG_MODE1 _MMIO(0x20ec) | 6088 | #define GEN9_CS_DEBUG_MODE1 _MMIO(0x20ec) |
6089 | #define GEN9_CTX_PREEMPT_REG _MMIO(0x2248) | ||
6072 | #define GEN8_CS_CHICKEN1 _MMIO(0x2580) | 6090 | #define GEN8_CS_CHICKEN1 _MMIO(0x2580) |
6073 | 6091 | ||
6074 | /* GEN7 chicken */ | 6092 | /* GEN7 chicken */ |
@@ -6076,6 +6094,7 @@ enum skl_disp_power_wells { | |||
6076 | # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) | 6094 | # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) |
6077 | # define GEN9_RHWO_OPTIMIZATION_DISABLE (1<<14) | 6095 | # define GEN9_RHWO_OPTIMIZATION_DISABLE (1<<14) |
6078 | #define COMMON_SLICE_CHICKEN2 _MMIO(0x7014) | 6096 | #define COMMON_SLICE_CHICKEN2 _MMIO(0x7014) |
6097 | # define GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION (1<<8) | ||
6079 | # define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0) | 6098 | # define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0) |
6080 | 6099 | ||
6081 | #define HIZ_CHICKEN _MMIO(0x7018) | 6100 | #define HIZ_CHICKEN _MMIO(0x7018) |
@@ -6921,6 +6940,7 @@ enum skl_disp_power_wells { | |||
6921 | #define EDRAM_SETS_IDX(cap) (((cap) >> 8) & 0x3) | 6940 | #define EDRAM_SETS_IDX(cap) (((cap) >> 8) & 0x3) |
6922 | 6941 | ||
6923 | #define GEN6_UCGCTL1 _MMIO(0x9400) | 6942 | #define GEN6_UCGCTL1 _MMIO(0x9400) |
6943 | # define GEN6_GAMUNIT_CLOCK_GATE_DISABLE (1 << 22) | ||
6924 | # define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE (1 << 16) | 6944 | # define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE (1 << 16) |
6925 | # define GEN6_BLBUNIT_CLOCK_GATE_DISABLE (1 << 5) | 6945 | # define GEN6_BLBUNIT_CLOCK_GATE_DISABLE (1 << 5) |
6926 | # define GEN6_CSUNIT_CLOCK_GATE_DISABLE (1 << 7) | 6946 | # define GEN6_CSUNIT_CLOCK_GATE_DISABLE (1 << 7) |
@@ -6937,6 +6957,7 @@ enum skl_disp_power_wells { | |||
6937 | 6957 | ||
6938 | #define GEN7_UCGCTL4 _MMIO(0x940c) | 6958 | #define GEN7_UCGCTL4 _MMIO(0x940c) |
6939 | #define GEN7_L3BANK2X_CLOCK_GATE_DISABLE (1<<25) | 6959 | #define GEN7_L3BANK2X_CLOCK_GATE_DISABLE (1<<25) |
6960 | #define GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE (1<<14) | ||
6940 | 6961 | ||
6941 | #define GEN6_RCGCTL1 _MMIO(0x9410) | 6962 | #define GEN6_RCGCTL1 _MMIO(0x9410) |
6942 | #define GEN6_RCGCTL2 _MMIO(0x9414) | 6963 | #define GEN6_RCGCTL2 _MMIO(0x9414) |
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c index a34c23eceba0..2b3b428d9cd2 100644 --- a/drivers/gpu/drm/i915/intel_csr.c +++ b/drivers/gpu/drm/i915/intel_csr.c | |||
@@ -41,16 +41,22 @@ | |||
41 | * be moved to FW_FAILED. | 41 | * be moved to FW_FAILED. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | #define I915_CSR_KBL "i915/kbl_dmc_ver1.bin" | ||
45 | MODULE_FIRMWARE(I915_CSR_KBL); | ||
46 | #define KBL_CSR_VERSION_REQUIRED CSR_VERSION(1, 1) | ||
47 | |||
44 | #define I915_CSR_SKL "i915/skl_dmc_ver1.bin" | 48 | #define I915_CSR_SKL "i915/skl_dmc_ver1.bin" |
49 | MODULE_FIRMWARE(I915_CSR_SKL); | ||
50 | #define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 23) | ||
51 | |||
45 | #define I915_CSR_BXT "i915/bxt_dmc_ver1.bin" | 52 | #define I915_CSR_BXT "i915/bxt_dmc_ver1.bin" |
53 | MODULE_FIRMWARE(I915_CSR_BXT); | ||
54 | #define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) | ||
46 | 55 | ||
47 | #define FIRMWARE_URL "https://01.org/linuxgraphics/intel-linux-graphics-firmwares" | 56 | #define FIRMWARE_URL "https://01.org/linuxgraphics/intel-linux-graphics-firmwares" |
48 | 57 | ||
49 | MODULE_FIRMWARE(I915_CSR_SKL); | ||
50 | MODULE_FIRMWARE(I915_CSR_BXT); | ||
51 | 58 | ||
52 | #define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 23) | 59 | |
53 | #define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) | ||
54 | 60 | ||
55 | #define CSR_MAX_FW_SIZE 0x2FFF | 61 | #define CSR_MAX_FW_SIZE 0x2FFF |
56 | #define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF | 62 | #define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF |
@@ -169,12 +175,10 @@ struct stepping_info { | |||
169 | char substepping; | 175 | char substepping; |
170 | }; | 176 | }; |
171 | 177 | ||
172 | /* | ||
173 | * Kabylake derivated from Skylake H0, so SKL H0 | ||
174 | * is the right firmware for KBL A0 (revid 0). | ||
175 | */ | ||
176 | static const struct stepping_info kbl_stepping_info[] = { | 178 | static const struct stepping_info kbl_stepping_info[] = { |
177 | {'H', '0'}, {'I', '0'} | 179 | {'A', '0'}, {'B', '0'}, {'C', '0'}, |
180 | {'D', '0'}, {'E', '0'}, {'F', '0'}, | ||
181 | {'G', '0'}, {'H', '0'}, {'I', '0'}, | ||
178 | }; | 182 | }; |
179 | 183 | ||
180 | static const struct stepping_info skl_stepping_info[] = { | 184 | static const struct stepping_info skl_stepping_info[] = { |
@@ -298,7 +302,9 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv, | |||
298 | 302 | ||
299 | csr->version = css_header->version; | 303 | csr->version = css_header->version; |
300 | 304 | ||
301 | if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | 305 | if (IS_KABYLAKE(dev_priv)) { |
306 | required_min_version = KBL_CSR_VERSION_REQUIRED; | ||
307 | } else if (IS_SKYLAKE(dev_priv)) { | ||
302 | required_min_version = SKL_CSR_VERSION_REQUIRED; | 308 | required_min_version = SKL_CSR_VERSION_REQUIRED; |
303 | } else if (IS_BROXTON(dev_priv)) { | 309 | } else if (IS_BROXTON(dev_priv)) { |
304 | required_min_version = BXT_CSR_VERSION_REQUIRED; | 310 | required_min_version = BXT_CSR_VERSION_REQUIRED; |
@@ -446,7 +452,9 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv) | |||
446 | if (!HAS_CSR(dev_priv)) | 452 | if (!HAS_CSR(dev_priv)) |
447 | return; | 453 | return; |
448 | 454 | ||
449 | if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) | 455 | if (IS_KABYLAKE(dev_priv)) |
456 | csr->fw_path = I915_CSR_KBL; | ||
457 | else if (IS_SKYLAKE(dev_priv)) | ||
450 | csr->fw_path = I915_CSR_SKL; | 458 | csr->fw_path = I915_CSR_SKL; |
451 | else if (IS_BROXTON(dev_priv)) | 459 | else if (IS_BROXTON(dev_priv)) |
452 | csr->fw_path = I915_CSR_BXT; | 460 | csr->fw_path = I915_CSR_BXT; |
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 42eac37de047..7f2d8415ed8b 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c | |||
@@ -1103,15 +1103,17 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, | |||
1103 | uint32_t *const batch, | 1103 | uint32_t *const batch, |
1104 | uint32_t index) | 1104 | uint32_t index) |
1105 | { | 1105 | { |
1106 | struct drm_i915_private *dev_priv = engine->dev->dev_private; | ||
1106 | uint32_t l3sqc4_flush = (0x40400000 | GEN8_LQSC_FLUSH_COHERENT_LINES); | 1107 | uint32_t l3sqc4_flush = (0x40400000 | GEN8_LQSC_FLUSH_COHERENT_LINES); |
1107 | 1108 | ||
1108 | /* | 1109 | /* |
1109 | * WaDisableLSQCROPERFforOCL:skl | 1110 | * WaDisableLSQCROPERFforOCL:skl,kbl |
1110 | * This WA is implemented in skl_init_clock_gating() but since | 1111 | * This WA is implemented in skl_init_clock_gating() but since |
1111 | * this batch updates GEN8_L3SQCREG4 with default value we need to | 1112 | * this batch updates GEN8_L3SQCREG4 with default value we need to |
1112 | * set this bit here to retain the WA during flush. | 1113 | * set this bit here to retain the WA during flush. |
1113 | */ | 1114 | */ |
1114 | if (IS_SKL_REVID(engine->dev, 0, SKL_REVID_E0)) | 1115 | if (IS_SKL_REVID(dev_priv, 0, SKL_REVID_E0) || |
1116 | IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0)) | ||
1115 | l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; | 1117 | l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; |
1116 | 1118 | ||
1117 | wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | | 1119 | wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | |
@@ -1273,6 +1275,7 @@ static int gen9_init_indirectctx_bb(struct intel_engine_cs *engine, | |||
1273 | { | 1275 | { |
1274 | int ret; | 1276 | int ret; |
1275 | struct drm_device *dev = engine->dev; | 1277 | struct drm_device *dev = engine->dev; |
1278 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1276 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); | 1279 | uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); |
1277 | 1280 | ||
1278 | /* WaDisableCtxRestoreArbitration:skl,bxt */ | 1281 | /* WaDisableCtxRestoreArbitration:skl,bxt */ |
@@ -1286,6 +1289,22 @@ static int gen9_init_indirectctx_bb(struct intel_engine_cs *engine, | |||
1286 | return ret; | 1289 | return ret; |
1287 | index = ret; | 1290 | index = ret; |
1288 | 1291 | ||
1292 | /* WaClearSlmSpaceAtContextSwitch:kbl */ | ||
1293 | /* Actual scratch location is at 128 bytes offset */ | ||
1294 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_A0)) { | ||
1295 | uint32_t scratch_addr | ||
1296 | = engine->scratch.gtt_offset + 2*CACHELINE_BYTES; | ||
1297 | |||
1298 | wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6)); | ||
1299 | wa_ctx_emit(batch, index, (PIPE_CONTROL_FLUSH_L3 | | ||
1300 | PIPE_CONTROL_GLOBAL_GTT_IVB | | ||
1301 | PIPE_CONTROL_CS_STALL | | ||
1302 | PIPE_CONTROL_QW_WRITE)); | ||
1303 | wa_ctx_emit(batch, index, scratch_addr); | ||
1304 | wa_ctx_emit(batch, index, 0); | ||
1305 | wa_ctx_emit(batch, index, 0); | ||
1306 | wa_ctx_emit(batch, index, 0); | ||
1307 | } | ||
1289 | /* Pad to end of cacheline */ | 1308 | /* Pad to end of cacheline */ |
1290 | while (index % CACHELINE_DWORDS) | 1309 | while (index % CACHELINE_DWORDS) |
1291 | wa_ctx_emit(batch, index, MI_NOOP); | 1310 | wa_ctx_emit(batch, index, MI_NOOP); |
@@ -1687,9 +1706,10 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request, | |||
1687 | struct intel_ringbuffer *ringbuf = request->ringbuf; | 1706 | struct intel_ringbuffer *ringbuf = request->ringbuf; |
1688 | struct intel_engine_cs *engine = ringbuf->engine; | 1707 | struct intel_engine_cs *engine = ringbuf->engine; |
1689 | u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES; | 1708 | u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES; |
1690 | bool vf_flush_wa = false; | 1709 | bool vf_flush_wa = false, dc_flush_wa = false; |
1691 | u32 flags = 0; | 1710 | u32 flags = 0; |
1692 | int ret; | 1711 | int ret; |
1712 | int len; | ||
1693 | 1713 | ||
1694 | flags |= PIPE_CONTROL_CS_STALL; | 1714 | flags |= PIPE_CONTROL_CS_STALL; |
1695 | 1715 | ||
@@ -1716,9 +1736,21 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request, | |||
1716 | */ | 1736 | */ |
1717 | if (IS_GEN9(engine->dev)) | 1737 | if (IS_GEN9(engine->dev)) |
1718 | vf_flush_wa = true; | 1738 | vf_flush_wa = true; |
1739 | |||
1740 | /* WaForGAMHang:kbl */ | ||
1741 | if (IS_KBL_REVID(request->i915, 0, KBL_REVID_B0)) | ||
1742 | dc_flush_wa = true; | ||
1719 | } | 1743 | } |
1720 | 1744 | ||
1721 | ret = intel_ring_begin(request, vf_flush_wa ? 12 : 6); | 1745 | len = 6; |
1746 | |||
1747 | if (vf_flush_wa) | ||
1748 | len += 6; | ||
1749 | |||
1750 | if (dc_flush_wa) | ||
1751 | len += 12; | ||
1752 | |||
1753 | ret = intel_ring_begin(request, len); | ||
1722 | if (ret) | 1754 | if (ret) |
1723 | return ret; | 1755 | return ret; |
1724 | 1756 | ||
@@ -1731,12 +1763,31 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request, | |||
1731 | intel_logical_ring_emit(ringbuf, 0); | 1763 | intel_logical_ring_emit(ringbuf, 0); |
1732 | } | 1764 | } |
1733 | 1765 | ||
1766 | if (dc_flush_wa) { | ||
1767 | intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6)); | ||
1768 | intel_logical_ring_emit(ringbuf, PIPE_CONTROL_DC_FLUSH_ENABLE); | ||
1769 | intel_logical_ring_emit(ringbuf, 0); | ||
1770 | intel_logical_ring_emit(ringbuf, 0); | ||
1771 | intel_logical_ring_emit(ringbuf, 0); | ||
1772 | intel_logical_ring_emit(ringbuf, 0); | ||
1773 | } | ||
1774 | |||
1734 | intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6)); | 1775 | intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6)); |
1735 | intel_logical_ring_emit(ringbuf, flags); | 1776 | intel_logical_ring_emit(ringbuf, flags); |
1736 | intel_logical_ring_emit(ringbuf, scratch_addr); | 1777 | intel_logical_ring_emit(ringbuf, scratch_addr); |
1737 | intel_logical_ring_emit(ringbuf, 0); | 1778 | intel_logical_ring_emit(ringbuf, 0); |
1738 | intel_logical_ring_emit(ringbuf, 0); | 1779 | intel_logical_ring_emit(ringbuf, 0); |
1739 | intel_logical_ring_emit(ringbuf, 0); | 1780 | intel_logical_ring_emit(ringbuf, 0); |
1781 | |||
1782 | if (dc_flush_wa) { | ||
1783 | intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6)); | ||
1784 | intel_logical_ring_emit(ringbuf, PIPE_CONTROL_CS_STALL); | ||
1785 | intel_logical_ring_emit(ringbuf, 0); | ||
1786 | intel_logical_ring_emit(ringbuf, 0); | ||
1787 | intel_logical_ring_emit(ringbuf, 0); | ||
1788 | intel_logical_ring_emit(ringbuf, 0); | ||
1789 | } | ||
1790 | |||
1740 | intel_logical_ring_advance(ringbuf); | 1791 | intel_logical_ring_advance(ringbuf); |
1741 | 1792 | ||
1742 | return 0; | 1793 | return 0; |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 8357d571553a..aba94099886b 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -1731,7 +1731,8 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel) | |||
1731 | panel->backlight.set = bxt_set_backlight; | 1731 | panel->backlight.set = bxt_set_backlight; |
1732 | panel->backlight.get = bxt_get_backlight; | 1732 | panel->backlight.get = bxt_get_backlight; |
1733 | panel->backlight.hz_to_pwm = bxt_hz_to_pwm; | 1733 | panel->backlight.hz_to_pwm = bxt_hz_to_pwm; |
1734 | } else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_SPT(dev_priv)) { | 1734 | } else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_SPT(dev_priv) || |
1735 | HAS_PCH_KBP(dev_priv)) { | ||
1735 | panel->backlight.setup = lpt_setup_backlight; | 1736 | panel->backlight.setup = lpt_setup_backlight; |
1736 | panel->backlight.enable = lpt_enable_backlight; | 1737 | panel->backlight.enable = lpt_enable_backlight; |
1737 | panel->backlight.disable = lpt_disable_backlight; | 1738 | panel->backlight.disable = lpt_disable_backlight; |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index a7ef45da0a9e..2863b92c9da6 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -54,10 +54,38 @@ | |||
54 | #define INTEL_RC6p_ENABLE (1<<1) | 54 | #define INTEL_RC6p_ENABLE (1<<1) |
55 | #define INTEL_RC6pp_ENABLE (1<<2) | 55 | #define INTEL_RC6pp_ENABLE (1<<2) |
56 | 56 | ||
57 | static void gen9_init_clock_gating(struct drm_device *dev) | ||
58 | { | ||
59 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
60 | |||
61 | /* See Bspec note for PSR2_CTL bit 31, Wa#828:skl,bxt,kbl */ | ||
62 | I915_WRITE(CHICKEN_PAR1_1, | ||
63 | I915_READ(CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP); | ||
64 | |||
65 | I915_WRITE(GEN8_CONFIG0, | ||
66 | I915_READ(GEN8_CONFIG0) | GEN9_DEFAULT_FIXES); | ||
67 | |||
68 | /* WaEnableChickenDCPR:skl,bxt,kbl */ | ||
69 | I915_WRITE(GEN8_CHICKEN_DCPR_1, | ||
70 | I915_READ(GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM); | ||
71 | |||
72 | /* WaFbcTurnOffFbcWatermark:skl,bxt,kbl */ | ||
73 | /* WaFbcWakeMemOn:skl,bxt,kbl */ | ||
74 | I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) | | ||
75 | DISP_FBC_WM_DIS | | ||
76 | DISP_FBC_MEMORY_WAKE); | ||
77 | |||
78 | /* WaFbcHighMemBwCorruptionAvoidance:skl,bxt,kbl */ | ||
79 | I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) | | ||
80 | ILK_DPFC_DISABLE_DUMMY0); | ||
81 | } | ||
82 | |||
57 | static void bxt_init_clock_gating(struct drm_device *dev) | 83 | static void bxt_init_clock_gating(struct drm_device *dev) |
58 | { | 84 | { |
59 | struct drm_i915_private *dev_priv = dev->dev_private; | 85 | struct drm_i915_private *dev_priv = dev->dev_private; |
60 | 86 | ||
87 | gen9_init_clock_gating(dev); | ||
88 | |||
61 | /* WaDisableSDEUnitClockGating:bxt */ | 89 | /* WaDisableSDEUnitClockGating:bxt */ |
62 | I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) | | 90 | I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) | |
63 | GEN8_SDEUNIT_CLOCK_GATE_DISABLE); | 91 | GEN8_SDEUNIT_CLOCK_GATE_DISABLE); |
@@ -6698,6 +6726,38 @@ static void lpt_suspend_hw(struct drm_device *dev) | |||
6698 | } | 6726 | } |
6699 | } | 6727 | } |
6700 | 6728 | ||
6729 | static void kabylake_init_clock_gating(struct drm_device *dev) | ||
6730 | { | ||
6731 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
6732 | |||
6733 | gen9_init_clock_gating(dev); | ||
6734 | |||
6735 | /* WaDisableSDEUnitClockGating:kbl */ | ||
6736 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_B0)) | ||
6737 | I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) | | ||
6738 | GEN8_SDEUNIT_CLOCK_GATE_DISABLE); | ||
6739 | |||
6740 | /* WaDisableGamClockGating:kbl */ | ||
6741 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_B0)) | ||
6742 | I915_WRITE(GEN6_UCGCTL1, I915_READ(GEN6_UCGCTL1) | | ||
6743 | GEN6_GAMUNIT_CLOCK_GATE_DISABLE); | ||
6744 | |||
6745 | /* WaFbcNukeOnHostModify:kbl */ | ||
6746 | I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) | | ||
6747 | ILK_DPFC_NUKE_ON_ANY_MODIFICATION); | ||
6748 | } | ||
6749 | |||
6750 | static void skylake_init_clock_gating(struct drm_device *dev) | ||
6751 | { | ||
6752 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
6753 | |||
6754 | gen9_init_clock_gating(dev); | ||
6755 | |||
6756 | /* WaFbcNukeOnHostModify:skl */ | ||
6757 | I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) | | ||
6758 | ILK_DPFC_NUKE_ON_ANY_MODIFICATION); | ||
6759 | } | ||
6760 | |||
6701 | static void broadwell_init_clock_gating(struct drm_device *dev) | 6761 | static void broadwell_init_clock_gating(struct drm_device *dev) |
6702 | { | 6762 | { |
6703 | struct drm_i915_private *dev_priv = dev->dev_private; | 6763 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -7163,9 +7223,9 @@ static void nop_init_clock_gating(struct drm_device *dev) | |||
7163 | void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv) | 7223 | void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv) |
7164 | { | 7224 | { |
7165 | if (IS_SKYLAKE(dev_priv)) | 7225 | if (IS_SKYLAKE(dev_priv)) |
7166 | dev_priv->display.init_clock_gating = nop_init_clock_gating; | 7226 | dev_priv->display.init_clock_gating = skylake_init_clock_gating; |
7167 | else if (IS_KABYLAKE(dev_priv)) | 7227 | else if (IS_KABYLAKE(dev_priv)) |
7168 | dev_priv->display.init_clock_gating = nop_init_clock_gating; | 7228 | dev_priv->display.init_clock_gating = kabylake_init_clock_gating; |
7169 | else if (IS_BROXTON(dev_priv)) | 7229 | else if (IS_BROXTON(dev_priv)) |
7170 | dev_priv->display.init_clock_gating = bxt_init_clock_gating; | 7230 | dev_priv->display.init_clock_gating = bxt_init_clock_gating; |
7171 | else if (IS_BROADWELL(dev_priv)) | 7231 | else if (IS_BROADWELL(dev_priv)) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 04402bb9d26b..68c5af079ef8 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -913,24 +913,26 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
913 | { | 913 | { |
914 | struct drm_device *dev = engine->dev; | 914 | struct drm_device *dev = engine->dev; |
915 | struct drm_i915_private *dev_priv = dev->dev_private; | 915 | struct drm_i915_private *dev_priv = dev->dev_private; |
916 | uint32_t tmp; | ||
917 | int ret; | 916 | int ret; |
918 | 917 | ||
919 | /* WaEnableLbsSlaRetryTimerDecrement:skl */ | 918 | /* WaConextSwitchWithConcurrentTLBInvalidate:skl,bxt,kbl */ |
919 | I915_WRITE(GEN9_CSFE_CHICKEN1_RCS, _MASKED_BIT_ENABLE(GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE)); | ||
920 | |||
921 | /* WaEnableLbsSlaRetryTimerDecrement:skl,bxt,kbl */ | ||
920 | I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) | | 922 | I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) | |
921 | GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE); | 923 | GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE); |
922 | 924 | ||
923 | /* WaDisableKillLogic:bxt,skl */ | 925 | /* WaDisableKillLogic:bxt,skl,kbl */ |
924 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | | 926 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | |
925 | ECOCHK_DIS_TLB); | 927 | ECOCHK_DIS_TLB); |
926 | 928 | ||
927 | /* WaClearFlowControlGpgpuContextSave:skl,bxt */ | 929 | /* WaClearFlowControlGpgpuContextSave:skl,bxt,kbl */ |
928 | /* WaDisablePartialInstShootdown:skl,bxt */ | 930 | /* WaDisablePartialInstShootdown:skl,bxt,kbl */ |
929 | WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN, | 931 | WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN, |
930 | FLOW_CONTROL_ENABLE | | 932 | FLOW_CONTROL_ENABLE | |
931 | PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE); | 933 | PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE); |
932 | 934 | ||
933 | /* Syncing dependencies between camera and graphics:skl,bxt */ | 935 | /* Syncing dependencies between camera and graphics:skl,bxt,kbl */ |
934 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, | 936 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, |
935 | GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); | 937 | GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); |
936 | 938 | ||
@@ -952,18 +954,18 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
952 | */ | 954 | */ |
953 | } | 955 | } |
954 | 956 | ||
955 | /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt */ | 957 | /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl */ |
956 | /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt */ | 958 | /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl */ |
957 | WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, | 959 | WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, |
958 | GEN9_ENABLE_YV12_BUGFIX | | 960 | GEN9_ENABLE_YV12_BUGFIX | |
959 | GEN9_ENABLE_GPGPU_PREEMPTION); | 961 | GEN9_ENABLE_GPGPU_PREEMPTION); |
960 | 962 | ||
961 | /* Wa4x4STCOptimizationDisable:skl,bxt */ | 963 | /* Wa4x4STCOptimizationDisable:skl,bxt,kbl */ |
962 | /* WaDisablePartialResolveInVc:skl,bxt */ | 964 | /* WaDisablePartialResolveInVc:skl,bxt,kbl */ |
963 | WA_SET_BIT_MASKED(CACHE_MODE_1, (GEN8_4x4_STC_OPTIMIZATION_DISABLE | | 965 | WA_SET_BIT_MASKED(CACHE_MODE_1, (GEN8_4x4_STC_OPTIMIZATION_DISABLE | |
964 | GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE)); | 966 | GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE)); |
965 | 967 | ||
966 | /* WaCcsTlbPrefetchDisable:skl,bxt */ | 968 | /* WaCcsTlbPrefetchDisable:skl,bxt,kbl */ |
967 | WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, | 969 | WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, |
968 | GEN9_CCS_TLB_PREFETCH_ENABLE); | 970 | GEN9_CCS_TLB_PREFETCH_ENABLE); |
969 | 971 | ||
@@ -973,31 +975,57 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
973 | WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, | 975 | WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, |
974 | PIXEL_MASK_CAMMING_DISABLE); | 976 | PIXEL_MASK_CAMMING_DISABLE); |
975 | 977 | ||
976 | /* WaForceContextSaveRestoreNonCoherent:skl,bxt */ | 978 | /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl */ |
977 | tmp = HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT; | 979 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
978 | if (IS_SKL_REVID(dev, SKL_REVID_F0, REVID_FOREVER) || | 980 | HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT | |
979 | IS_BXT_REVID(dev, BXT_REVID_B0, REVID_FOREVER)) | 981 | HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE); |
980 | tmp |= HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE; | 982 | |
981 | WA_SET_BIT_MASKED(HDC_CHICKEN0, tmp); | 983 | /* WaForceEnableNonCoherent and WaDisableHDCInvalidation are |
984 | * both tied to WaForceContextSaveRestoreNonCoherent | ||
985 | * in some hsds for skl. We keep the tie for all gen9. The | ||
986 | * documentation is a bit hazy and so we want to get common behaviour, | ||
987 | * even though there is no clear evidence we would need both on kbl/bxt. | ||
988 | * This area has been source of system hangs so we play it safe | ||
989 | * and mimic the skl regardless of what bspec says. | ||
990 | * | ||
991 | * Use Force Non-Coherent whenever executing a 3D context. This | ||
992 | * is a workaround for a possible hang in the unlikely event | ||
993 | * a TLB invalidation occurs during a PSD flush. | ||
994 | */ | ||
982 | 995 | ||
983 | /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt */ | 996 | /* WaForceEnableNonCoherent:skl,bxt,kbl */ |
984 | if (IS_SKYLAKE(dev) || IS_BXT_REVID(dev, 0, BXT_REVID_B0)) | 997 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
998 | HDC_FORCE_NON_COHERENT); | ||
999 | |||
1000 | /* WaDisableHDCInvalidation:skl,bxt,kbl */ | ||
1001 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | | ||
1002 | BDW_DISABLE_HDC_INVALIDATION); | ||
1003 | |||
1004 | /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt,kbl */ | ||
1005 | if (IS_SKYLAKE(dev_priv) || | ||
1006 | IS_KABYLAKE(dev_priv) || | ||
1007 | IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0)) | ||
985 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, | 1008 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, |
986 | GEN8_SAMPLER_POWER_BYPASS_DIS); | 1009 | GEN8_SAMPLER_POWER_BYPASS_DIS); |
987 | 1010 | ||
988 | /* WaDisableSTUnitPowerOptimization:skl,bxt */ | 1011 | /* WaDisableSTUnitPowerOptimization:skl,bxt,kbl */ |
989 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); | 1012 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); |
990 | 1013 | ||
991 | /* WaOCLCoherentLineFlush:skl,bxt */ | 1014 | /* WaOCLCoherentLineFlush:skl,bxt,kbl */ |
992 | I915_WRITE(GEN8_L3SQCREG4, (I915_READ(GEN8_L3SQCREG4) | | 1015 | I915_WRITE(GEN8_L3SQCREG4, (I915_READ(GEN8_L3SQCREG4) | |
993 | GEN8_LQSC_FLUSH_COHERENT_LINES)); | 1016 | GEN8_LQSC_FLUSH_COHERENT_LINES)); |
994 | 1017 | ||
995 | /* WaEnablePreemptionGranularityControlByUMD:skl,bxt */ | 1018 | /* WaVFEStateAfterPipeControlwithMediaStateClear:skl,bxt */ |
1019 | ret = wa_ring_whitelist_reg(engine, GEN9_CTX_PREEMPT_REG); | ||
1020 | if (ret) | ||
1021 | return ret; | ||
1022 | |||
1023 | /* WaEnablePreemptionGranularityControlByUMD:skl,bxt,kbl */ | ||
996 | ret= wa_ring_whitelist_reg(engine, GEN8_CS_CHICKEN1); | 1024 | ret= wa_ring_whitelist_reg(engine, GEN8_CS_CHICKEN1); |
997 | if (ret) | 1025 | if (ret) |
998 | return ret; | 1026 | return ret; |
999 | 1027 | ||
1000 | /* WaAllowUMDToModifyHDCChicken1:skl,bxt */ | 1028 | /* WaAllowUMDToModifyHDCChicken1:skl,bxt,kbl */ |
1001 | ret = wa_ring_whitelist_reg(engine, GEN8_HDC_CHICKEN1); | 1029 | ret = wa_ring_whitelist_reg(engine, GEN8_HDC_CHICKEN1); |
1002 | if (ret) | 1030 | if (ret) |
1003 | return ret; | 1031 | return ret; |
@@ -1092,22 +1120,6 @@ static int skl_init_workarounds(struct intel_engine_cs *engine) | |||
1092 | WA_SET_BIT_MASKED(HIZ_CHICKEN, | 1120 | WA_SET_BIT_MASKED(HIZ_CHICKEN, |
1093 | BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE); | 1121 | BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE); |
1094 | 1122 | ||
1095 | /* This is tied to WaForceContextSaveRestoreNonCoherent */ | ||
1096 | if (IS_SKL_REVID(dev, 0, REVID_FOREVER)) { | ||
1097 | /* | ||
1098 | *Use Force Non-Coherent whenever executing a 3D context. This | ||
1099 | * is a workaround for a possible hang in the unlikely event | ||
1100 | * a TLB invalidation occurs during a PSD flush. | ||
1101 | */ | ||
1102 | /* WaForceEnableNonCoherent:skl */ | ||
1103 | WA_SET_BIT_MASKED(HDC_CHICKEN0, | ||
1104 | HDC_FORCE_NON_COHERENT); | ||
1105 | |||
1106 | /* WaDisableHDCInvalidation:skl */ | ||
1107 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | | ||
1108 | BDW_DISABLE_HDC_INVALIDATION); | ||
1109 | } | ||
1110 | |||
1111 | /* WaBarrierPerformanceFixDisable:skl */ | 1123 | /* WaBarrierPerformanceFixDisable:skl */ |
1112 | if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_D0)) | 1124 | if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_D0)) |
1113 | WA_SET_BIT_MASKED(HDC_CHICKEN0, | 1125 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
@@ -1120,6 +1132,9 @@ static int skl_init_workarounds(struct intel_engine_cs *engine) | |||
1120 | GEN7_HALF_SLICE_CHICKEN1, | 1132 | GEN7_HALF_SLICE_CHICKEN1, |
1121 | GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); | 1133 | GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); |
1122 | 1134 | ||
1135 | /* WaDisableGafsUnitClkGating:skl */ | ||
1136 | WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); | ||
1137 | |||
1123 | /* WaDisableLSQCROPERFforOCL:skl */ | 1138 | /* WaDisableLSQCROPERFforOCL:skl */ |
1124 | ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); | 1139 | ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); |
1125 | if (ret) | 1140 | if (ret) |
@@ -1174,6 +1189,63 @@ static int bxt_init_workarounds(struct intel_engine_cs *engine) | |||
1174 | return ret; | 1189 | return ret; |
1175 | } | 1190 | } |
1176 | 1191 | ||
1192 | /* WaInsertDummyPushConstPs:bxt */ | ||
1193 | if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0)) | ||
1194 | WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, | ||
1195 | GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION); | ||
1196 | |||
1197 | return 0; | ||
1198 | } | ||
1199 | |||
1200 | static int kbl_init_workarounds(struct intel_engine_cs *engine) | ||
1201 | { | ||
1202 | struct drm_i915_private *dev_priv = engine->dev->dev_private; | ||
1203 | int ret; | ||
1204 | |||
1205 | ret = gen9_init_workarounds(engine); | ||
1206 | if (ret) | ||
1207 | return ret; | ||
1208 | |||
1209 | /* WaEnableGapsTsvCreditFix:kbl */ | ||
1210 | I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) | | ||
1211 | GEN9_GAPS_TSV_CREDIT_DISABLE)); | ||
1212 | |||
1213 | /* WaDisableDynamicCreditSharing:kbl */ | ||
1214 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_B0)) | ||
1215 | WA_SET_BIT(GAMT_CHKN_BIT_REG, | ||
1216 | GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING); | ||
1217 | |||
1218 | /* WaDisableFenceDestinationToSLM:kbl (pre-prod) */ | ||
1219 | if (IS_KBL_REVID(dev_priv, KBL_REVID_A0, KBL_REVID_A0)) | ||
1220 | WA_SET_BIT_MASKED(HDC_CHICKEN0, | ||
1221 | HDC_FENCE_DEST_SLM_DISABLE); | ||
1222 | |||
1223 | /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes | ||
1224 | * involving this register should also be added to WA batch as required. | ||
1225 | */ | ||
1226 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0)) | ||
1227 | /* WaDisableLSQCROPERFforOCL:kbl */ | ||
1228 | I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | | ||
1229 | GEN8_LQSC_RO_PERF_DIS); | ||
1230 | |||
1231 | /* WaInsertDummyPushConstPs:kbl */ | ||
1232 | if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_B0)) | ||
1233 | WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, | ||
1234 | GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION); | ||
1235 | |||
1236 | /* WaDisableGafsUnitClkGating:kbl */ | ||
1237 | WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); | ||
1238 | |||
1239 | /* WaDisableSbeCacheDispatchPortSharing:kbl */ | ||
1240 | WA_SET_BIT_MASKED( | ||
1241 | GEN7_HALF_SLICE_CHICKEN1, | ||
1242 | GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); | ||
1243 | |||
1244 | /* WaDisableLSQCROPERFforOCL:kbl */ | ||
1245 | ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); | ||
1246 | if (ret) | ||
1247 | return ret; | ||
1248 | |||
1177 | return 0; | 1249 | return 0; |
1178 | } | 1250 | } |
1179 | 1251 | ||
@@ -1199,6 +1271,9 @@ int init_workarounds_ring(struct intel_engine_cs *engine) | |||
1199 | if (IS_BROXTON(dev)) | 1271 | if (IS_BROXTON(dev)) |
1200 | return bxt_init_workarounds(engine); | 1272 | return bxt_init_workarounds(engine); |
1201 | 1273 | ||
1274 | if (IS_KABYLAKE(dev_priv)) | ||
1275 | return kbl_init_workarounds(engine); | ||
1276 | |||
1202 | return 0; | 1277 | return 0; |
1203 | } | 1278 | } |
1204 | 1279 | ||