@@ -178,6 +178,12 @@ wa_write_or(struct i915_wa_list *wal, i915_reg_t reg, u32 set)
178
178
wa_write_masked_or (wal , reg , set , set );
179
179
}
180
180
181
+ static void
182
+ wa_write_clr (struct i915_wa_list * wal , i915_reg_t reg , u32 clr )
183
+ {
184
+ wa_write_masked_or (wal , reg , clr , 0 );
185
+ }
186
+
181
187
static void
182
188
wa_masked_en (struct i915_wa_list * wal , i915_reg_t reg , u32 val )
183
189
{
@@ -686,6 +692,46 @@ int intel_engine_emit_ctx_wa(struct i915_request *rq)
686
692
return 0 ;
687
693
}
688
694
695
+ static void
696
+ hsw_gt_workarounds_init (struct drm_i915_private * i915 , struct i915_wa_list * wal )
697
+ {
698
+ /* L3 caching of data atomics doesn't work -- disable it. */
699
+ wa_write (wal , HSW_SCRATCH1 , HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE );
700
+
701
+ wa_add (wal ,
702
+ HSW_ROW_CHICKEN3 , 0 ,
703
+ _MASKED_BIT_ENABLE (HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE ),
704
+ 0 /* XXX does this reg exist? */ );
705
+
706
+ /* WaVSRefCountFullforceMissDisable:hsw */
707
+ wa_write_clr (wal , GEN7_FF_THREAD_MODE , GEN7_FF_VS_REF_CNT_FFME );
708
+
709
+ wa_masked_dis (wal ,
710
+ CACHE_MODE_0_GEN7 ,
711
+ /* WaDisable_RenderCache_OperationalFlush:hsw */
712
+ RC_OP_FLUSH_ENABLE |
713
+ /* enable HiZ Raw Stall Optimization */
714
+ HIZ_RAW_STALL_OPT_DISABLE );
715
+
716
+ /* WaDisable4x2SubspanOptimization:hsw */
717
+ wa_masked_en (wal , CACHE_MODE_1 , PIXEL_SUBSPAN_COLLECT_OPT_DISABLE );
718
+
719
+ /*
720
+ * BSpec recommends 8x4 when MSAA is used,
721
+ * however in practice 16x4 seems fastest.
722
+ *
723
+ * Note that PS/WM thread counts depend on the WIZ hashing
724
+ * disable bit, which we don't touch here, but it's good
725
+ * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM).
726
+ */
727
+ wa_add (wal , GEN7_GT_MODE , 0 ,
728
+ _MASKED_FIELD (GEN6_WIZ_HASHING_MASK , GEN6_WIZ_HASHING_16x4 ),
729
+ GEN6_WIZ_HASHING_16x4 );
730
+
731
+ /* WaSampleCChickenBitEnable:hsw */
732
+ wa_masked_en (wal , HALF_SLICE_CHICKEN3 , HSW_SAMPLE_C_PERFORMANCE );
733
+ }
734
+
689
735
static void
690
736
gen9_gt_workarounds_init (struct drm_i915_private * i915 , struct i915_wa_list * wal )
691
737
{
@@ -963,6 +1009,8 @@ gt_init_workarounds(struct drm_i915_private *i915, struct i915_wa_list *wal)
963
1009
bxt_gt_workarounds_init (i915 , wal );
964
1010
else if (IS_SKYLAKE (i915 ))
965
1011
skl_gt_workarounds_init (i915 , wal );
1012
+ else if (IS_HASWELL (i915 ))
1013
+ hsw_gt_workarounds_init (i915 , wal );
966
1014
else if (INTEL_GEN (i915 ) <= 8 )
967
1015
return ;
968
1016
else
0 commit comments