soc/intel_adsp: Add hardware race workaround to cavstool
On cAVS 1.8 (specifically) there seems to be a propagation delay on the IPC registers. Hitting the TDA register to signal DONE too soon after clearing the interrupt via TDR can cause the interrupt to be dropped. Merely polling for it to read back correctly isn't sufficient, we need an actual sleep here. (The behavior that a message won't send while an existing message is in progress is actually a hardware feature that is new with 1.8. My guess is it's a little glitchy in its first version.) Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
parent
45242d9214
commit
005e12bdac
1 changed files with 3 additions and 0 deletions
|
@ -342,6 +342,9 @@ def ipc_command(data, ext_data):
|
|||
log.warning(f"cavstool: Unrecognized IPC command 0x{data:x} ext 0x{ext_data:x}")
|
||||
|
||||
dsp.HIPCTDR = 1<<31 # Ack local interrupt, also signals DONE on v1.5
|
||||
if cavs18:
|
||||
time.sleep(0.01) # Needed on 1.8, or the command below won't send!
|
||||
|
||||
if done and not cavs15:
|
||||
dsp.HIPCTDA = 1<<31 # Signal done
|
||||
if send_msg:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue