[lkml]   [2006]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: Ping-Pong Compatible DMA buffer chaining
    Hi Sir,

    Basically My hardware is not allowing to do a scatter-gather list.
    Might be my next version of Hardware _could_ allow me. So I decided to
    come out with a _Work Around_.

    please find attached sg_pingpong.txt.

    My hardware has two Buffers B0 and B1 for both Tx and Rx path.
    I had to fill the first buffer initially and then _continue_ a walk
    through the sg list with help of buffer completion interrupts of B0 &

    Can you suggest any inputs for this scenario.


    On 1/3/06, Alan Cox <> wrote:
    > On Llu, 2005-12-26 at 11:35 +0530, Deven Balani wrote:
    > > 1) The SATA Host Controller supports a DMA Logic which has Ping Pong Buffers.
    > > How Can I allocate a linear contiguous buffer and give it to the
    > > Buffer Descriptors of the Host Controller. I believe consistent alloc
    > > would help me in this regard. But How could I do a chaining of Buffers
    > > in a Ping Pong Scenario which has Buffer Descriptors.
    > Depends entirely on your hardware.
    > > 2) The libata is using Scatter-Gather List to send Device Identify
    > > Command. Is it necessary to have a Scatter-Gather List for non-PCI ARM
    > > platforms. Can I bypass this mechanism.
    > It is neccessary as the user space virtual memory will be fragmented in
    > physical space (unless you are using MMUless Linux when it will be far
    > less fragmented).
    > If the platform is an MMUless one then you can fill in the host
    > structure and indicate that you support a maximum scatter gather list
    > size of one. This will break up I/O's when neccessary to keep within
    > that limit but this will hurt your performance by causing a lot more
    > requests on a non MMUless system.
    > Alan

    "A smile confuses an approaching frown..."
    For conversion from SG list to ping pong:

    Generate new sglist based on original sglist but taking into account MAX_DMA_BUF_SIZE bytes as the maximum per buffer. This will simplify your continuance logic significantly.

    For each entry in Sgentries
    set entry in progress to true
    while entry in progress
    if entry.buffersize larger than MAX_DMA_BUF_SIZE
    Add a new entry to SGentries1 a buffer of MAX_DMA_BUF_SIZE
    Decrement entry.buffersize by MAX_DMA_BUF_SIZE
    Increment entry.pointer by MAX_DMA_BUF_SIZE
    Add a new entry to SGentries1 with a copy of current entry
    set entry in progress to false

    while more SGentries1 and at least one buffer free
    populate first active buffer with entry
    Remove entry from SGentries1
    toggle active buffer

    if SGentries1 is not empty
    enable DMA buffer complete interrupt

    Start DMA.

    In your DMA buffer complete interrupt:

    if SGentries1 is not empty
    populate the completed buffer
    activate newly populated buffer
    check the active buffer (the other one) to see if it just completed
    if this other one just completed
    if Sgentries is not empty
    populate this buffer
    if SGentries1 is STILL not empty at this point
    enable DMA buffer interrupt
    disable DMA buffer interrupt

     \ /
      Last update: 2006-01-04 06:31    [W:0.023 / U:135.328 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site