diff options
author | Dave Airlie <airlied@redhat.com> | 2019-11-14 05:53:10 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2019-11-14 05:53:10 +1000 |
commit | 77e0723bd27f830d0903225372aa778fe2975648 (patch) | |
tree | 4c035783e014b3a0ac9174390f88dc75150533e4 /drivers/dma/qcom/bam_dma.c | |
parent | 3ca3a9eab7085b3c938b5d088c3020269cfecdc8 (diff) | |
parent | 31f4f5b495a62c9a8b15b1c3581acd5efeb9af8c (diff) | |
download | talos-op-linux-77e0723bd27f830d0903225372aa778fe2975648.tar.gz talos-op-linux-77e0723bd27f830d0903225372aa778fe2975648.zip |
Merge v5.4-rc7 into drm-next
We have the i915 security fixes to backmerge, but first
let's clear the decks for other drivers to avoid a bigger
mess.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/dma/qcom/bam_dma.c')
-rw-r--r-- | drivers/dma/qcom/bam_dma.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c index 8e90a405939d..ef73f65224b1 100644 --- a/drivers/dma/qcom/bam_dma.c +++ b/drivers/dma/qcom/bam_dma.c @@ -694,6 +694,25 @@ static int bam_dma_terminate_all(struct dma_chan *chan) /* remove all transactions, including active transaction */ spin_lock_irqsave(&bchan->vc.lock, flag); + /* + * If we have transactions queued, then some might be committed to the + * hardware in the desc fifo. The only way to reset the desc fifo is + * to do a hardware reset (either by pipe or the entire block). + * bam_chan_init_hw() will trigger a pipe reset, and also reinit the + * pipe. If the pipe is left disabled (default state after pipe reset) + * and is accessed by a connected hardware engine, a fatal error in + * the BAM will occur. There is a small window where this could happen + * with bam_chan_init_hw(), but it is assumed that the caller has + * stopped activity on any attached hardware engine. Make sure to do + * this first so that the BAM hardware doesn't cause memory corruption + * by accessing freed resources. + */ + if (!list_empty(&bchan->desc_list)) { + async_desc = list_first_entry(&bchan->desc_list, + struct bam_async_desc, desc_node); + bam_chan_init_hw(bchan, async_desc->dir); + } + list_for_each_entry_safe(async_desc, tmp, &bchan->desc_list, desc_node) { list_add(&async_desc->vd.node, &bchan->vc.desc_issued); |