diff options
| author | Mark Brown <broonie@kernel.org> | 2023-06-07 13:28:09 +0100 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2023-06-07 13:28:09 +0100 | 
| commit | 30e15cb0fbb51513586a49d299798245a1c4a207 (patch) | |
| tree | ec7e8a201c33d1ea8d3374178cd35412095b1f23 /drivers/usb/cdns3/cdns3-gadget.c | |
| parent | 3b88f5fba24485e6cfa2883e155d78d330e2eabc (diff) | |
| parent | 3a76c7ca9e77269dd10cf21465a055274cfa40c6 (diff) | |
spi-geni-qcom: Add new interfaces and utilise them
Merge series from Vijaya Krishna Nivarthi <quic_vnivarth@quicinc.com>:
A "known issue" during implementation of SE DMA for spi geni driver was
that it does DMA map/unmap internally instead of in spi framework.
Current patches remove this hiccup and also clean up code a bit.
Testing revealed no regressions and results with 1000 iterations of
reading from EC showed no loss of performance.
Results
=======
Before - Iteration 999, min=5.10, max=5.17, avg=5.14, ints=25129
After  - Iteration 999, min=5.10, max=5.20, avg=5.15, ints=25153
Diffstat (limited to 'drivers/usb/cdns3/cdns3-gadget.c')
| -rw-r--r-- | drivers/usb/cdns3/cdns3-gadget.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/usb/cdns3/cdns3-gadget.c b/drivers/usb/cdns3/cdns3-gadget.c index ccfaebca6faa..1dcadef933e3 100644 --- a/drivers/usb/cdns3/cdns3-gadget.c +++ b/drivers/usb/cdns3/cdns3-gadget.c @@ -2097,6 +2097,19 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable)  	else  		priv_ep->trb_burst_size = 16; +	/* +	 * In versions preceding DEV_VER_V2, for example, iMX8QM, there exit the bugs +	 * in the DMA. These bugs occur when the trb_burst_size exceeds 16 and the +	 * address is not aligned to 128 Bytes (which is a product of the 64-bit AXI +	 * and AXI maximum burst length of 16 or 0xF+1, dma_axi_ctrl0[3:0]). This +	 * results in data corruption when it crosses the 4K border. The corruption +	 * specifically occurs from the position (4K - (address & 0x7F)) to 4K. +	 * +	 * So force trb_burst_size to 16 at such platform. +	 */ +	if (priv_dev->dev_ver < DEV_VER_V2) +		priv_ep->trb_burst_size = 16; +  	mult = min_t(u8, mult, EP_CFG_MULT_MAX);  	buffering = min_t(u8, buffering, EP_CFG_BUFFERING_MAX);  	maxburst = min_t(u8, maxburst, EP_CFG_MAXBURST_MAX);  | 
