On 02/04/2019 10:40, Pankaj Dubey wrote:
From: Sriram Dash <sriram.dash@xxxxxxxxxxx>
The xhci forcefully converts the dma_mask to either 64 or 32 and the
dma-mask set by the bus is somewhat ignored. If the platform sets the
correct dma_mask, then respect that.
It's expected for dma_mask to be larger than bus_dma_mask if the latter
is set - conceptually, the device mask represents what the device is
inherently capable of, while the bus mask represents external
interconnect restrictions which individual drivers should not have to
care about. The DMA API backend should take care of combining the two to
find the intersection. Are you seeing an actual problem here, and if so
on which platform? (If the bus mask is set at all then it wouldn't seem
to be the DT PCI issue that I'm still trying to fix).
Robin.
Signed-off-by: Pankaj Dubey <pankaj.dubey@xxxxxxxxxxx>
Signed-off-by: Sriram Dash <sriram.dash@xxxxxxxxxxx>
---
drivers/usb/host/xhci.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 005e659..55cf89e 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -5119,6 +5119,16 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
}
+ /*
+ * A platform may require coherent masks other than 64/32 bit, and we
+ * should respect that. If the firmware has already requested for a
+ * dma-range, we inherit the dma_mask presuming the platform knows
+ * what it is doing.
+ */
+
+ if (dev->bus_dma_mask)
+ dma_set_mask_and_coherent(dev, dev->bus_dma_mask);
+
xhci_dbg(xhci, "Calling HCD init\n");
/* Initialize HCD and host controller data structures. */
retval = xhci_init(hcd);