Re: [RFC PATCH 00/11] Refactor HW workaround code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 10/10/2017 10:37 AM, Oscar Mateo wrote:


On 10/09/2017 02:08 PM, Chris Wilson wrote:
Quoting Oscar Mateo (2017-10-09 21:58:15)
Currently, deciding how/where to apply new workarounds is challenging. Often, workarounds end up applied incorrectly and get lost under certain circumstances (e.g. a context switch or a GPU reset). This is a proposal to attempt to eliminate some of this pain, by clarifying the current classification of workarounds (context saved/restored, global registers, whitelisting, BB), putting them together on the same file, and improving the existing validation
infrastructure (debugfs/i-g-t).
One thing I've been dreaming of is if we can have an external file for
importing the w/a (reg offset + corrected value) that we could source
directly from spec. (Hoping for some xml translation to C or DT.)

Hmmm... I'm afraid this is impossible at the moment, since many WAs in the BSpec are simply a link to the ticket where the workaround was devised (and there you have to parse the conversation to figure out what the WA should do).

We need something like this so that we can set all the nonpriv registers
to the default value in the proto-context. Or at least lots of patience
and careful proofreading.
-Chris

You mean applying the workarounds directly to the context image instead of the LRI commands we use now? That can be done (as you said, with *a lot* of patience and careful proofreading) but we would need to force the proto-context to be restored first (with CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT bit set), because the workarounds do not always give us the full default value for a register, only the fields that are wrong in the hardware.

Hmmmm... I'm giving out conflicting information. Registers in the engine (those that live in the engine part of the context image) are not guaranteed to be initialized, so inhibit-restoring the context and then saving it is not enough. Yes, we would have to get the default values for them from the BSpec, either automatically or by hand, then apply the workarounds (either by modifying the default values or with the emission of LRIs we have now).

This is an insane amount of work (and sometimes the BSpec does not include all the information you need), that's why the recommendation in the BSpec is to force the engine to populate these registers for us (the infamous null state batchbuffer):

"[...] Engine context starts immediately following the logical ring context in memory. This state is very specific to an engine and differs from engine to engine. This part of the context consists of the state from all the units in the engine that needs to be save/restored across context switches. Engine restores the engine context following the logical ring context restore. It is tedious for software to populate the engine context as per the requirements, it is recommended to implicitly use engine to populate this portion of the context. Below method can be followed to achieve the same:

* When a context is submitted for the first time for execution, SW can inhibit engine from restoring engine context by setting the “Engine Context Restore Inhibit” bit in CTXT_SR_CTL register of the logical ring context. This will avoid software from populating the Engine Context. Software must program all the state required to initialize the engine in the ring buffer which would initialize the hardware state. On a subsequent context save engine will populate the engine context with appropriate values.

* Above method can be used to create a complete logical context with engine context populated by the hardware. This Logical context can be used as an Golden Context Image or template for subsequently created contexts.

Engine saves the engine context following the logical ring context on switching out a context."





_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux