linux_dsm_epyc7002/drivers/i2c/busses
Douglas Anderson 02b9aec592 i2c: i2c-qcom-geni: Fix DMA transfer race
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: 37692de5d5 ("i2c: i2c-qcom-geni: Add bus driver for the Qualcomm GENI I2C controller")
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Tested-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
Reviewed-by: Akash Asthana <akashast@codeaurora.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Mukesh Kumar Savaliya <msavaliy@codeaurora.org>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
2020-07-23 22:26:44 +02:00
..
i2c-acorn.c
i2c-ali15x3.c
i2c-ali1535.c
i2c-ali1563.c
i2c-altera.c
i2c-amd756-s4882.c
i2c-amd756.c
i2c-amd8111.c
i2c-amd-mp2-pci.c
i2c-amd-mp2-plat.c
i2c-amd-mp2.h
i2c-aspeed.c
i2c-at91-core.c
i2c-at91-master.c
i2c-at91-slave.c
i2c-at91.h
i2c-au1550.c
i2c-axxia.c
i2c-bcm2835.c
i2c-bcm-iproc.c
i2c-bcm-kona.c
i2c-brcmstb.c
i2c-cadence.c i2c: cadence: Clear HOLD bit at correct time in Rx path 2020-07-22 12:28:07 +02:00
i2c-cbus-gpio.c
i2c-cht-wc.c
i2c-cpm.c
i2c-cros-ec-tunnel.c
i2c-davinci.c
i2c-designware-baytrail.c
i2c-designware-common.c i2c: designware: Adjust bus speed independently of ACPI 2020-06-23 21:24:33 +02:00
i2c-designware-core.h i2c: designware: Adjust bus speed independently of ACPI 2020-06-23 21:24:33 +02:00
i2c-designware-master.c
i2c-designware-pcidrv.c i2c: designware: Adjust bus speed independently of ACPI 2020-06-23 21:24:33 +02:00
i2c-designware-platdrv.c i2c: designware: platdrv: Set class based on DMI 2020-07-04 08:17:53 +02:00
i2c-designware-slave.c
i2c-digicolor.c
i2c-diolan-u2c.c
i2c-dln2.c
i2c-efm32.c
i2c-eg20t.c i2c: eg20t: Load module automatically if ID matches 2020-07-04 08:17:53 +02:00
i2c-elektor.c
i2c-emev2.c
i2c-exynos5.c i2c: Drop stray comma in MODULE_AUTHOR statements 2020-06-11 12:32:14 +02:00
i2c-fsi.c i2c: fsi: Fix the port number field in status register 2020-06-26 00:25:05 +02:00
i2c-gpio.c
i2c-highlander.c
i2c-hix5hd2.c
i2c-hydra.c
i2c-i801.c
i2c-ibm_iic.c
i2c-ibm_iic.h
i2c-icy.c i2c: icy: Fix build with CONFIG_AMIGA_PCMCIA=n 2020-06-07 20:45:24 +02:00
i2c-img-scb.c
i2c-imx-lpi2c.c
i2c-imx.c
i2c-iop3xx.c
i2c-iop3xx.h
i2c-isch.c
i2c-ismt.c
i2c-jz4780.c
i2c-kempld.c
i2c-lpc2k.c
i2c-meson.c
i2c-mlxcpld.c i2c: mlxcpld: check correct size of maximum RECV_LEN packet 2020-07-04 08:20:38 +02:00
i2c-mpc.c
i2c-mt65xx.c
i2c-mt7621.c
i2c-mv64xxx.c
i2c-mxs.c
i2c-nforce2-s4985.c
i2c-nforce2.c
i2c-nomadik.c
i2c-npcm7xx.c i2c: npcm7xx: npcm_i2caddr[] can be static 2020-06-11 12:30:47 +02:00
i2c-nvidia-gpu.c
i2c-ocores.c
i2c-octeon-core.c
i2c-octeon-core.h
i2c-octeon-platdrv.c
i2c-omap.c
i2c-opal.c
i2c-owl.c
i2c-parport.c
i2c-pasemi.c
i2c-pca-isa.c
i2c-pca-platform.c
i2c-piix4.c
i2c-pmcmsp.c
i2c-pnx.c
i2c-powermac.c
i2c-puv3.c
i2c-pxa-pci.c
i2c-pxa.c
i2c-qcom-cci.c
i2c-qcom-geni.c i2c: i2c-qcom-geni: Fix DMA transfer race 2020-07-23 22:26:44 +02:00
i2c-qup.c
i2c-rcar.c i2c: rcar: always clear ICSAR to avoid side effects 2020-07-23 22:25:18 +02:00
i2c-riic.c
i2c-rk3x.c
i2c-robotfuzz-osif.c
i2c-s3c2410.c Merge branch 'i2c/for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2020-06-13 13:12:38 -07:00
i2c-scmi.c
i2c-sh7760.c
i2c-sh_mobile.c
i2c-sibyte.c
i2c-simtec.c
i2c-sirf.c
i2c-sis96x.c
i2c-sis630.c
i2c-sis5595.c
i2c-sprd.c
i2c-st.c
i2c-stm32.c
i2c-stm32.h
i2c-stm32f4.c
i2c-stm32f7.c
i2c-stu300.c
i2c-sun6i-p2wi.c
i2c-synquacer.c
i2c-taos-evm.c
i2c-tegra-bpmp.c
i2c-tegra.c
i2c-thunderx-pcidrv.c
i2c-tiny-usb.c
i2c-uniphier-f.c
i2c-uniphier.c
i2c-versatile.c
i2c-via.c
i2c-viapro.c
i2c-viperboard.c
i2c-wmt.c
i2c-xgene-slimpro.c
i2c-xiic.c
i2c-xlp9xx.c
i2c-xlr.c
i2c-zx2967.c
Kconfig
Makefile
scx200_acb.c