• Lucas De Marchi's avatar
    drm/i915/gt: Fix context workarounds with non-masked regs · 28cf243a
    Lucas De Marchi authored
    Most of the context workarounds tweak masked registers, but not all. For
    masked registers, when writing the value it's sufficient to just write
    the wa->set_bits since that will take care of both the clr and set bits
    as well as not overwriting other bits.
    
    However there are some workarounds, the registers are non-masked. Up
    until now the driver was simply emitting a MI_LOAD_REGISTER_IMM with the
    set_bits to program the register via the GPU in the WA bb. This has the
    side effect of overwriting the content of the register outside of bits
    that should be set and also doesn't handle the bits that should be
    cleared.
    
    Kenneth reported that on DG2, mesa was seeing a weird behavior due to
    the kernel programming of L3SQCREG5 in dg2_ctx_gt_tuning_init(). With
    the GPU idle, that register could be read via intel_reg as 0x00e001ff,
    but during a 3D workload it would change to 0x0000007f. So the
    programming of that tuning was affecting more than the bits in
    L3_PWM_TIMER_INIT_VAL_MASK. Matt Roper noticed the lack of rmw for the
    context workarounds due to the use of MI_LOAD_REGISTER_IMM.
    
    So, for registers that are not masked, read its value via mmio, modify
    and then set it in the buffer to be written by the GPU. This should take
    care in a simple way of programming just the bits required by the
    tuning/workaround. If in future there are registers that involved that
    can't be read by the CPU, a more complex approach may be required like
    a) issuing additional instructions to read and modify; or b) scan the
    golden context and patch it in place before saving it; or something
    else. But for now this should suffice.
    
    Scanning the context workarounds for all platforms, these are the
    impacted ones with the respective registers
    
    	mtl: DRAW_WATERMARK
    	mtl/dg2: XEHP_L3SQCREG5, XEHP_FF_MODE2
    
    ICL has some non-masked registers in the context workarounds:
    GEN8_L3CNTLREG, IVB_FBC_RT_BASE and VB_FBC_RT_BASE_UPPER, but there
    shouldn't be an impact. The first is already being manually read and the
    other 2 are intentionally overwriting the entire register. Same
    reasoning applies to GEN12_FF_MODE2: the WA is intentionally
    overwriting all the bits to avoid a read-modify-write.
    
    v2:  Reword commit message wrt GEN12_FF_MODE2 and the changed behavior
    on preparatory patches.
    v3: Also skip reading if clear|set bits covers everything
    
    Cc: Kenneth Graunke <kenneth@whitecape.org>
    Cc: Matt Roper <matthew.d.roper@intel.com>
    Link: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23783#note_1968971Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
    Reviewed-by: default avatarKenneth Graunke <kenneth@whitecape.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20230630203509.1635216-4-lucas.demarchi@intel.com
    28cf243a
intel_workarounds.c 98.3 KB