mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 06:53:04 +00:00
drm/xe: Name and document Wa_14019789679
Early in the development of Xe we identified an issue with SVG state handling on DG2 and MTL (and later on Xe2 as well). In commit72ac304769
("drm/xe: Emit SVG state on RCS during driver load on DG2 and MTL") and commitfb24b858a2
("drm/xe/xe2: Update SVG state handling") we implemented our own workaround to prevent SVG state from leaking from context A to context B in cases where context B never issues a specific state setting. The hardware teams have now created official workaround Wa_14019789679 to cover this issue. The workaround description only requires emitting 3DSTATE_MESH_CONTROL, since they believe that's the only SVG instruction that would potentially remain unset by a context B, but still cause notable issues if unwanted values were inherited from context A. However since we already have a more extensive implementation that emits the entire SVG state and prevents _any_ SVG state from unintentionally leaking, we'll stick with our existing implementation just to be safe. Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240812181042.2013508-2-matthew.d.roper@intel.com
This commit is contained in:
parent
d408d6f8cb
commit
1d734a3e5d
|
@ -5,6 +5,8 @@
|
|||
|
||||
#include "xe_lrc.h"
|
||||
|
||||
#include <generated/xe_wa_oob.h>
|
||||
|
||||
#include <linux/ascii85.h>
|
||||
|
||||
#include "instructions/xe_mi_commands.h"
|
||||
|
@ -24,6 +26,7 @@
|
|||
#include "xe_memirq.h"
|
||||
#include "xe_sriov.h"
|
||||
#include "xe_vm.h"
|
||||
#include "xe_wa.h"
|
||||
|
||||
#define LRC_VALID BIT_ULL(0)
|
||||
#define LRC_PRIVILEGE BIT_ULL(8)
|
||||
|
@ -1581,19 +1584,31 @@ void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *b
|
|||
int state_table_size = 0;
|
||||
|
||||
/*
|
||||
* At the moment we only need to emit non-register state for the RCS
|
||||
* engine.
|
||||
* Wa_14019789679
|
||||
*
|
||||
* If the driver doesn't explicitly emit the SVG instructions while
|
||||
* setting up the default LRC, the context switch will write 0's
|
||||
* (noops) into the LRC memory rather than the expected instruction
|
||||
* headers. Application contexts start out as a copy of the default
|
||||
* LRC, and if they also do not emit specific settings for some SVG
|
||||
* state, then on context restore they'll unintentionally inherit
|
||||
* whatever state setting the previous context had programmed into the
|
||||
* hardware (i.e., the lack of a 3DSTATE_* instruction in the LRC will
|
||||
* prevent the hardware from resetting that state back to any specific
|
||||
* value).
|
||||
*
|
||||
* The official workaround only requires emitting 3DSTATE_MESH_CONTROL
|
||||
* since that's a specific state setting that can easily cause GPU
|
||||
* hangs if unintentionally inherited. However to be safe we'll
|
||||
* continue to emit all of the SVG state since it's best not to leak
|
||||
* any of the state between contexts, even if that leakage is harmless.
|
||||
*/
|
||||
if (q->hwe->class != XE_ENGINE_CLASS_RENDER)
|
||||
return;
|
||||
|
||||
switch (GRAPHICS_VERx100(xe)) {
|
||||
case 1255:
|
||||
case 1270 ... 2004:
|
||||
if (XE_WA(gt, 14019789679) && q->hwe->class == XE_ENGINE_CLASS_RENDER) {
|
||||
state_table = xe_hpg_svg_state;
|
||||
state_table_size = ARRAY_SIZE(xe_hpg_svg_state);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
if (!state_table) {
|
||||
xe_gt_dbg(gt, "No non-register state to emit on graphics ver %d.%02d\n",
|
||||
GRAPHICS_VER(xe), GRAPHICS_VERx100(xe) % 100);
|
||||
return;
|
||||
|
|
|
@ -35,3 +35,5 @@
|
|||
GRAPHICS_VERSION(2001)
|
||||
22019338487_display PLATFORM(LUNARLAKE)
|
||||
16023588340 GRAPHICS_VERSION(2001)
|
||||
14019789679 GRAPHICS_VERSION(1255)
|
||||
GRAPHICS_VERSION_RANGE(1270, 2004)
|
||||
|
|
Loading…
Reference in New Issue
Block a user