diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2017-06-16 18:49:58 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2017-06-16 19:14:29 -0400 |
commit | 46c26662d2fb8377f5d387cf2e5ee3246af780b7 (patch) | |
tree | 3f274e9ebb5be774b1649a681eba12019266a2b8 | |
parent | 28e0f4eef6cb3413a8eb943cd9e366793bfa7e87 (diff) |
drm/i915/cfl: Introduce Coffee Lake workarounds.
Coffee Lake inherit most of Kabylake production
workarounds.
v2: Fix typo on commit message and remove
WaDisableKillLogic and GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC,
since as Mika pointed out they shouldn't be here for cfl
according to BSpec.
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1497653398-15722-1-git-send-email-rodrigo.vivi@intel.com
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_engine_cs.c | 81 |
2 files changed, 60 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 205dd91d3601..61fc7e90a7da 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -1884,7 +1884,7 @@ static void gtt_write_workarounds(struct drm_i915_private *dev_priv) | |||
1884 | * called on driver load and after a GPU reset, so you can place | 1884 | * called on driver load and after a GPU reset, so you can place |
1885 | * workarounds here even if they get overwritten by GPU reset. | 1885 | * workarounds here even if they get overwritten by GPU reset. |
1886 | */ | 1886 | */ |
1887 | /* WaIncreaseDefaultTLBEntries:chv,bdw,skl,bxt,kbl,glk */ | 1887 | /* WaIncreaseDefaultTLBEntries:chv,bdw,skl,bxt,kbl,glk,cfl */ |
1888 | if (IS_BROADWELL(dev_priv)) | 1888 | if (IS_BROADWELL(dev_priv)) |
1889 | I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_BDW); | 1889 | I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_BDW); |
1890 | else if (IS_CHERRYVIEW(dev_priv)) | 1890 | else if (IS_CHERRYVIEW(dev_priv)) |
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index bc38bd128b76..a4487c5b7e37 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c | |||
@@ -814,26 +814,27 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
814 | struct drm_i915_private *dev_priv = engine->i915; | 814 | struct drm_i915_private *dev_priv = engine->i915; |
815 | int ret; | 815 | int ret; |
816 | 816 | ||
817 | /* WaConextSwitchWithConcurrentTLBInvalidate:skl,bxt,kbl,glk */ | 817 | /* WaConextSwitchWithConcurrentTLBInvalidate:skl,bxt,kbl,glk,cfl */ |
818 | I915_WRITE(GEN9_CSFE_CHICKEN1_RCS, _MASKED_BIT_ENABLE(GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE)); | 818 | I915_WRITE(GEN9_CSFE_CHICKEN1_RCS, _MASKED_BIT_ENABLE(GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE)); |
819 | 819 | ||
820 | /* WaEnableLbsSlaRetryTimerDecrement:skl,bxt,kbl,glk */ | 820 | /* WaEnableLbsSlaRetryTimerDecrement:skl,bxt,kbl,glk,cfl */ |
821 | I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) | | 821 | I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) | |
822 | GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE); | 822 | GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE); |
823 | 823 | ||
824 | /* WaDisableKillLogic:bxt,skl,kbl */ | 824 | /* WaDisableKillLogic:bxt,skl,kbl,cfl */ |
825 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | | 825 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | |
826 | ECOCHK_DIS_TLB); | 826 | ECOCHK_DIS_TLB); |
827 | 827 | ||
828 | /* WaClearFlowControlGpgpuContextSave:skl,bxt,kbl,glk */ | 828 | /* WaClearFlowControlGpgpuContextSave:skl,bxt,kbl,glk,cfl */ |
829 | /* WaDisablePartialInstShootdown:skl,bxt,kbl,glk */ | 829 | /* WaDisablePartialInstShootdown:skl,bxt,kbl,glk,cfl */ |
830 | WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN, | 830 | WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN, |
831 | FLOW_CONTROL_ENABLE | | 831 | FLOW_CONTROL_ENABLE | |
832 | PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE); | 832 | PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE); |
833 | 833 | ||
834 | /* Syncing dependencies between camera and graphics:skl,bxt,kbl */ | 834 | /* Syncing dependencies between camera and graphics:skl,bxt,kbl */ |
835 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, | 835 | if (!IS_COFFEELAKE(dev_priv)) |
836 | GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); | 836 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, |
837 | GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); | ||
837 | 838 | ||
838 | /* WaDisableDgMirrorFixInHalfSliceChicken5:bxt */ | 839 | /* WaDisableDgMirrorFixInHalfSliceChicken5:bxt */ |
839 | if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) | 840 | if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) |
@@ -851,18 +852,18 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
851 | */ | 852 | */ |
852 | } | 853 | } |
853 | 854 | ||
854 | /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl,glk */ | 855 | /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl,glk,cfl */ |
855 | /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl */ | 856 | /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl,cfl */ |
856 | WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, | 857 | WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, |
857 | GEN9_ENABLE_YV12_BUGFIX | | 858 | GEN9_ENABLE_YV12_BUGFIX | |
858 | GEN9_ENABLE_GPGPU_PREEMPTION); | 859 | GEN9_ENABLE_GPGPU_PREEMPTION); |
859 | 860 | ||
860 | /* Wa4x4STCOptimizationDisable:skl,bxt,kbl,glk */ | 861 | /* Wa4x4STCOptimizationDisable:skl,bxt,kbl,glk,cfl */ |
861 | /* WaDisablePartialResolveInVc:skl,bxt,kbl */ | 862 | /* WaDisablePartialResolveInVc:skl,bxt,kbl,cfl */ |
862 | WA_SET_BIT_MASKED(CACHE_MODE_1, (GEN8_4x4_STC_OPTIMIZATION_DISABLE | | 863 | WA_SET_BIT_MASKED(CACHE_MODE_1, (GEN8_4x4_STC_OPTIMIZATION_DISABLE | |
863 | GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE)); | 864 | GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE)); |
864 | 865 | ||
865 | /* WaCcsTlbPrefetchDisable:skl,bxt,kbl,glk */ | 866 | /* WaCcsTlbPrefetchDisable:skl,bxt,kbl,glk,cfl */ |
866 | WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, | 867 | WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, |
867 | GEN9_CCS_TLB_PREFETCH_ENABLE); | 868 | GEN9_CCS_TLB_PREFETCH_ENABLE); |
868 | 869 | ||
@@ -871,7 +872,7 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
871 | WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, | 872 | WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, |
872 | PIXEL_MASK_CAMMING_DISABLE); | 873 | PIXEL_MASK_CAMMING_DISABLE); |
873 | 874 | ||
874 | /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl */ | 875 | /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl,cfl */ |
875 | WA_SET_BIT_MASKED(HDC_CHICKEN0, | 876 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
876 | HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT | | 877 | HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT | |
877 | HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE); | 878 | HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE); |
@@ -889,39 +890,41 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) | |||
889 | * a TLB invalidation occurs during a PSD flush. | 890 | * a TLB invalidation occurs during a PSD flush. |
890 | */ | 891 | */ |
891 | 892 | ||
892 | /* WaForceEnableNonCoherent:skl,bxt,kbl */ | 893 | /* WaForceEnableNonCoherent:skl,bxt,kbl,cfl */ |
893 | WA_SET_BIT_MASKED(HDC_CHICKEN0, | 894 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
894 | HDC_FORCE_NON_COHERENT); | 895 | HDC_FORCE_NON_COHERENT); |
895 | 896 | ||
896 | /* WaDisableHDCInvalidation:skl,bxt,kbl */ | 897 | /* WaDisableHDCInvalidation:skl,bxt,kbl */ |
897 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | | 898 | if (!IS_COFFEELAKE(dev_priv)) |
898 | BDW_DISABLE_HDC_INVALIDATION); | 899 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | |
900 | BDW_DISABLE_HDC_INVALIDATION); | ||
899 | 901 | ||
900 | /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt,kbl */ | 902 | /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt,kbl,cfl */ |
901 | if (IS_SKYLAKE(dev_priv) || | 903 | if (IS_SKYLAKE(dev_priv) || |
902 | IS_KABYLAKE(dev_priv) || | 904 | IS_KABYLAKE(dev_priv) || |
905 | IS_COFFEELAKE(dev_priv) || | ||
903 | IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0)) | 906 | IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0)) |
904 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, | 907 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, |
905 | GEN8_SAMPLER_POWER_BYPASS_DIS); | 908 | GEN8_SAMPLER_POWER_BYPASS_DIS); |
906 | 909 | ||
907 | /* WaDisableSTUnitPowerOptimization:skl,bxt,kbl,glk */ | 910 | /* WaDisableSTUnitPowerOptimization:skl,bxt,kbl,glk,cfl */ |
908 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); | 911 | WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); |
909 | 912 | ||
910 | /* WaOCLCoherentLineFlush:skl,bxt,kbl */ | 913 | /* WaOCLCoherentLineFlush:skl,bxt,kbl,cfl */ |
911 | I915_WRITE(GEN8_L3SQCREG4, (I915_READ(GEN8_L3SQCREG4) | | 914 | I915_WRITE(GEN8_L3SQCREG4, (I915_READ(GEN8_L3SQCREG4) | |
912 | GEN8_LQSC_FLUSH_COHERENT_LINES)); | 915 | GEN8_LQSC_FLUSH_COHERENT_LINES)); |
913 | 916 | ||
914 | /* WaVFEStateAfterPipeControlwithMediaStateClear:skl,bxt,glk */ | 917 | /* WaVFEStateAfterPipeControlwithMediaStateClear:skl,bxt,glk,cfl */ |
915 | ret = wa_ring_whitelist_reg(engine, GEN9_CTX_PREEMPT_REG); | 918 | ret = wa_ring_whitelist_reg(engine, GEN9_CTX_PREEMPT_REG); |
916 | if (ret) | 919 | if (ret) |
917 | return ret; | 920 | return ret; |
918 | 921 | ||
919 | /* WaEnablePreemptionGranularityControlByUMD:skl,bxt,kbl */ | 922 | /* WaEnablePreemptionGranularityControlByUMD:skl,bxt,kbl,cfl */ |
920 | ret= wa_ring_whitelist_reg(engine, GEN8_CS_CHICKEN1); | 923 | ret= wa_ring_whitelist_reg(engine, GEN8_CS_CHICKEN1); |
921 | if (ret) | 924 | if (ret) |
922 | return ret; | 925 | return ret; |
923 | 926 | ||
924 | /* WaAllowUMDToModifyHDCChicken1:skl,bxt,kbl,glk */ | 927 | /* WaAllowUMDToModifyHDCChicken1:skl,bxt,kbl,glk,cfl */ |
925 | ret = wa_ring_whitelist_reg(engine, GEN8_HDC_CHICKEN1); | 928 | ret = wa_ring_whitelist_reg(engine, GEN8_HDC_CHICKEN1); |
926 | if (ret) | 929 | if (ret) |
927 | return ret; | 930 | return ret; |
@@ -1140,6 +1143,38 @@ static int glk_init_workarounds(struct intel_engine_cs *engine) | |||
1140 | return 0; | 1143 | return 0; |
1141 | } | 1144 | } |
1142 | 1145 | ||
1146 | static int cfl_init_workarounds(struct intel_engine_cs *engine) | ||
1147 | { | ||
1148 | struct drm_i915_private *dev_priv = engine->i915; | ||
1149 | int ret; | ||
1150 | |||
1151 | ret = gen9_init_workarounds(engine); | ||
1152 | if (ret) | ||
1153 | return ret; | ||
1154 | |||
1155 | /* WaEnableGapsTsvCreditFix:cfl */ | ||
1156 | I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) | | ||
1157 | GEN9_GAPS_TSV_CREDIT_DISABLE)); | ||
1158 | |||
1159 | /* WaToEnableHwFixForPushConstHWBug:cfl */ | ||
1160 | WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, | ||
1161 | GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION); | ||
1162 | |||
1163 | /* WaDisableGafsUnitClkGating:cfl */ | ||
1164 | WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); | ||
1165 | |||
1166 | /* WaDisableSbeCacheDispatchPortSharing:cfl */ | ||
1167 | WA_SET_BIT_MASKED( | ||
1168 | GEN7_HALF_SLICE_CHICKEN1, | ||
1169 | GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); | ||
1170 | |||
1171 | /* WaInPlaceDecompressionHang:cfl */ | ||
1172 | WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, | ||
1173 | GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); | ||
1174 | |||
1175 | return 0; | ||
1176 | } | ||
1177 | |||
1143 | int init_workarounds_ring(struct intel_engine_cs *engine) | 1178 | int init_workarounds_ring(struct intel_engine_cs *engine) |
1144 | { | 1179 | { |
1145 | struct drm_i915_private *dev_priv = engine->i915; | 1180 | struct drm_i915_private *dev_priv = engine->i915; |
@@ -1162,6 +1197,8 @@ int init_workarounds_ring(struct intel_engine_cs *engine) | |||
1162 | err = kbl_init_workarounds(engine); | 1197 | err = kbl_init_workarounds(engine); |
1163 | else if (IS_GEMINILAKE(dev_priv)) | 1198 | else if (IS_GEMINILAKE(dev_priv)) |
1164 | err = glk_init_workarounds(engine); | 1199 | err = glk_init_workarounds(engine); |
1200 | else if (IS_COFFEELAKE(dev_priv)) | ||
1201 | err = cfl_init_workarounds(engine); | ||
1165 | else | 1202 | else |
1166 | err = 0; | 1203 | err = 0; |
1167 | if (err) | 1204 | if (err) |