diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 153 |
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 | |||
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 | ||