• Douglas Anderson's avatar
    spi: spi-geni-qcom: Actually use our FIFO · 902481a7
    Douglas Anderson authored
    The geni hardware has a FIFO that can hold up to 64 bytes (it has 16
    entries that can hold 4 bytes each), at least on the two SoCs I tested
    (sdm845 and sc7180).  We configured our RX Watermark to 0, which
    basically meant we got an interrupt as soon as the first 4 bytes
    showed up in the FIFO.  Tracing the IRQ handler showed that we often
    only read 4 or 8 bytes per IRQ handler.
    
    I tried setting the RX Watermark to "fifo size - 2" but that just got
    me a bunch of overrun errors reported.  Setting it to "fifo size - 3"
    seemed to work great, though.  This made me worried that we'd start
    getting overruns if we had long interrupt latency, but that doesn't
    appear to be the case and delays inserted in the IRQ handler while
    using "fifo size - 3" didn't cause any errors.  Presumably there is
    some interaction with the poorly-documented RFR (ready for receive)
    level means that "fifo size - 3" is the max.  We are the SPI master,
    so it makes sense that there would be no problems with overruns, the
    master should just stop clocking.
    
    Despite "fifo size - 3" working, I chose "fifo size / 2" (8 entries =
    32 bytes) which gives us a little extra time to get to the interrupt
    handler and should reduce dead time on the SPI wires.  With this
    setting, I often saw the IRQ handler handle 40 bytes but sometimes up
    to 56 if we had bad interrupt latency.
    
    Testing by running "flashrom -p ec -r" on a Chromebook saw interrupts
    from the SPI driver cut roughly in half.  Time was roughly the same.
    
    Fixes: 561de45f ("spi: spi-geni-qcom: Add SPI driver support for GENI based QUP")
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
    Link: https://lore.kernel.org/r/20200618080459.v4.4.I988281f7c6ee0ed00325559bfce7539f403da69e@changeidSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    902481a7
spi-geni-qcom.c 19.8 KB