From patchwork Mon Apr 23 08:24:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 902830 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gXhIFaGh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40TzzD3Gs9z9s0W for ; Mon, 23 Apr 2018 18:24:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754309AbeDWIYy (ORCPT ); Mon, 23 Apr 2018 04:24:54 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:45291 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754256AbeDWIYu (ORCPT ); Mon, 23 Apr 2018 04:24:50 -0400 Received: by mail-wr0-f195.google.com with SMTP id p5-v6so10873187wre.12 for ; Mon, 23 Apr 2018 01:24:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=LvY6QAumGvqQMYM80PJhnj7EW+eMebR4Fjo9/7qA9uc=; b=gXhIFaGhLE7KXfmO1o6EPCWHyqBLy0zwPAsaY5lWjiJpo5Au6ouLQL8Wxhrwo4K5Lf 8ctJT2Hdjf425BSA4WnV2Bjy2i6sz4u3HjPU6PudYXYeZgRQT0E7dyv1TU6TxxEIuEA/ x1A82We/TccYVnB0wB0fWkwL3mKdjch3YSGzY1Rr3D7a9Y51L8tVnZM5R/sI52lfgK46 JBnidXZWfT21Njb2+Ntc+tNk6bYjzIeImUXPA6HmbtSJAth0ED6zp0XQivN2XH8eSLqD 8Kiri2MsKN4SrT3T3oKrznf2bwmco9Zzyr1Q2NPZqRFmn4QrkhVLLo8yf87Ev4WQpicE xrmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=LvY6QAumGvqQMYM80PJhnj7EW+eMebR4Fjo9/7qA9uc=; b=iZwVawpchgqCDqKYHBfg1nfCrgqSKk7kl0WbDA+mrkl+9Ptc7W2aM5KhMwbUXwvM1a u/7voSINBh0PrU7dY8zQ+ReK0O3Quc88khflW+pWrgvlLNpeEbubsbkvgcBG1wuPTkbL doj2x36DWlXkYZRos4jf78bgWsWT/2hfvzhYNJ5hvT8bmHp5HJU39WjR92LRPumkSQD2 FGOCWdn8+d2ATpsr6oGU95LMNlVSZrsM5wO1oTFaowMWKgXglXtq3QWislFCwXUiXRBF IXpyQccf523VmAdOr9RFK6Cw3ZxgyxEGiaZixgIH4NAUjoOI5Qar7X+ggvUG6/b+yKeW ZD5g== X-Gm-Message-State: ALQs6tDMwxGWsd6u7QtIXLKsSPm/8cwpMvzY2i1Td6xsInHq0tZjKTaI +0fhHcnAeyhUbjmHqzR9jHtDLQ== X-Google-Smtp-Source: AIpwx4/wRpBfiKnsVsp3PvcWDdK1oY+L4jO/8LK2lxA7uULu5iqxKtX67DJ0tITELxn98Z5yuPaHFg== X-Received: by 2002:adf:88e8:: with SMTP id g37-v6mr15109947wrg.62.1524471889554; Mon, 23 Apr 2018 01:24:49 -0700 (PDT) Received: from localhost (p200300E41F041C0032947E635CB49D15.dip0.t-ipconnect.de. [2003:e4:1f04:1c00:3294:7e63:5cb4:9d15]) by smtp.gmail.com with ESMTPSA id m78sm9286568wma.25.2018.04.23.01.24.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Apr 2018 01:24:48 -0700 (PDT) From: Thierry Reding To: Ben Skeggs Cc: nouveau@lists.freedesktop.org, linux-tegra@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH] drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping Date: Mon, 23 Apr 2018 10:24:47 +0200 Message-Id: <20180423082447.1516-1-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Depending on the kernel configuration, early ARM architecture setup code may have attached the GPU to a DMA/IOMMU mapping that transparently uses the IOMMU to back the DMA API. Tegra requires special handling for IOMMU backed buffers (a special bit in the GPU's MMU page tables indicates the memory path to take: via the SMMU or directly to the memory controller). Transparently backing DMA memory with an IOMMU prevents Nouveau from properly handling such memory accesses and causes memory access faults. As a side-note: buffers other than those allocated in instance memory don't need to be physically contiguous from the GPU's perspective since the GPU can map them into contiguous buffers using its own MMU. Mapping these buffers through the IOMMU is unnecessary and will even lead to performance degradation because of the additional translation. Signed-off-by: Thierry Reding --- .../drm/nouveau/nvkm/engine/device/tegra.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c index 1f07999aea1d..ac7706f56f6f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c @@ -19,6 +19,11 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ + +#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU) +#include +#endif + #include #ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER #include "priv.h" @@ -105,6 +110,20 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev) unsigned long pgsize_bitmap; int ret; +#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU) + if (dev->archdata.mapping) { + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); + + arm_iommu_release_mapping(mapping); + arm_iommu_detach_device(dev); + + if (dev->archdata.dma_coherent) + set_dma_ops(dev, &arm_coherent_dma_ops); + else + set_dma_ops(dev, &arm_dma_ops); + } +#endif + if (!tdev->func->iommu_bit) return;