lkml.org 
[lkml]   [2019]   [Sep]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.2 64/94] usb: host: xhci-tegra: Set DMA mask correctly
    Date
    From: Nagarjuna Kristam <nkristam@nvidia.com>

    [ Upstream commit 993cc8753453fccfe060a535bbe21fcf1001b626 ]

    The Falcon microcontroller that runs the XUSB firmware and which is
    responsible for exposing the XHCI interface can address only 40 bits of
    memory. Typically that's not a problem because Tegra devices don't have
    enough system memory to exceed those 40 bits.

    However, if the ARM SMMU is enable on Tegra186 and later, the addresses
    passed to the XUSB controller can be anywhere in the 48-bit IOV address
    space of the ARM SMMU. Since the DMA/IOMMU API starts allocating from
    the top of the IOVA space, the Falcon microcontroller is not able to
    load the firmware successfully.

    Fix this by setting the DMA mask to 40 bits, which will force the DMA
    API to map the buffer for the firmware to an IOVA that is addressable by
    the Falcon.

    Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Link: https://lore.kernel.org/r/1566989697-13049-1-git-send-email-nkristam@nvidia.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/host/xhci-tegra.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c
    index 294158113d62c..77142f9bf26ae 100644
    --- a/drivers/usb/host/xhci-tegra.c
    +++ b/drivers/usb/host/xhci-tegra.c
    @@ -1217,6 +1217,16 @@ static int tegra_xusb_probe(struct platform_device *pdev)

    tegra_xusb_config(tegra, regs);

    + /*
    + * The XUSB Falcon microcontroller can only address 40 bits, so set
    + * the DMA mask accordingly.
    + */
    + err = dma_set_mask_and_coherent(tegra->dev, DMA_BIT_MASK(40));
    + if (err < 0) {
    + dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err);
    + goto put_rpm;
    + }
    +
    err = tegra_xusb_load_firmware(tegra);
    if (err < 0) {
    dev_err(&pdev->dev, "failed to load firmware: %d\n", err);
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-09-04 18:06    [W:3.918 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site