aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c153
1 files changed, 114 insertions, 39 deletions
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
1200static 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