• T
    dmaengine: edma: Provide granular accounting · 740b41f7
    Thomas Gleixner 提交于
    The first slot in the ParamRAM of EDMA holds the current active
    subtransfer. Depending on the direction we read either the source or
    the destination address from there. In the internal psets we have the
    address of the buffer(s).
    
    In the cyclic case we only use the internal pset[0] which holds the
    start address of the circular buffer and calculate the remaining room
    to the end of the buffer.
    
    In the SG case we read the current address and compare it to the
    internal psets address and length.
    
    - If the current address is outside of this range, the pset has been
      processed already and we mark it done, update the residue_stat value
      and process the next set. That avoids that we need to walk all
      processed psets for every invocation of tx_status.
    
    - If its inside the range we know that we look at the current active
      set and stop the walk.
    
    - In case of intermediate transfers we update the stats in the
      interrupt callback function before starting the next batch of
      transfers. The tx_status callback and the interrupt callback are
      serialized via vchan.lock.
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    [joelf@ti.com: Hunk #2 in original patch manually applied]
    Signed-off-by: NJoel Fernandes <joelf@ti.com>
    Signed-off-by: NVinod Koul <vinod.koul@intel.com>
    740b41f7
edma.c 28.8 KB