• Douglas Anderson's avatar
    i2c: i2c-qcom-geni: Fix DMA transfer race · 02b9aec5
    Douglas Anderson authored
    When I have KASAN enabled on my kernel and I start stressing the
    touchscreen my system tends to hang.  The touchscreen is one of the
    only things that does a lot of big i2c transfers and ends up hitting
    the DMA paths in the geni i2c driver.  It appears that KASAN adds
    enough delay in my system to tickle a race condition in the DMA setup
    code.
    
    When the system hangs, I found that it was running the geni_i2c_irq()
    over and over again.  It had these:
    
    m_stat   = 0x04000080
    rx_st    = 0x30000011
    dm_tx_st = 0x00000000
    dm_rx_st = 0x00000000
    dma      = 0x00000001
    
    Notably we're in DMA mode but are getting M_RX_IRQ_EN and
    M_RX_FIFO_WATERMARK_EN over and over again.
    
    Putting some traces in geni_i2c_rx_one_msg() showed that when we
    failed we were getting to the start of geni_i2c_rx_one_msg() but were
    never executing geni_se_rx_dma_prep().
    
    I believe that the problem here is that we are starting the geni
    command before we run geni_se_rx_dma_prep().  If a transfer makes it
    far enough before we do that then we get into the state I have
    observed.  Let's change the order, which seems to work fine.
    
    Although problems were seen on the RX path, code inspection suggests
    that the TX should be changed too.  Change it as well.
    
    Fixes: 37692de5 ("i2c: i2c-qcom-geni: Add bus driver for the Qualcomm GENI I2C controller")
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Tested-by: default avatarSai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
    Reviewed-by: default avatarAkash Asthana <akashast@codeaurora.org>
    Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
    Reviewed-by: default avatarMukesh Kumar Savaliya <msavaliy@codeaurora.org>
    Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
    02b9aec5
i2c-qcom-geni.c 17.8 KB