From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thierry Reding Subject: [PATCH v2 1/5] drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping Date: Wed, 25 Apr 2018 12:10:47 +0200 Message-ID: <20180425101051.15349-1-thierry.reding@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Christoph Hellwig , Joerg Roedel Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Russell King , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, Daniel Vetter , linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org List-Id: iommu@lists.linux-foundation.org RnJvbTogVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KCkRlcGVuZGluZyBvbiB0 aGUga2VybmVsIGNvbmZpZ3VyYXRpb24sIGVhcmx5IEFSTSBhcmNoaXRlY3R1cmUgc2V0dXAgY29k ZQptYXkgaGF2ZSBhdHRhY2hlZCB0aGUgR1BVIHRvIGEgRE1BL0lPTU1VIG1hcHBpbmcgdGhhdCB0 cmFuc3BhcmVudGx5IHVzZXMKdGhlIElPTU1VIHRvIGJhY2sgdGhlIERNQSBBUEkuIFRlZ3JhIHJl cXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIElPTU1VCmJhY2tlZCBidWZmZXJzIChhIHNwZWNp YWwgYml0IGluIHRoZSBHUFUncyBNTVUgcGFnZSB0YWJsZXMgaW5kaWNhdGVzIHRoZQptZW1vcnkg cGF0aCB0byB0YWtlOiB2aWEgdGhlIFNNTVUgb3IgZGlyZWN0bHkgdG8gdGhlIG1lbW9yeSBjb250 cm9sbGVyKS4KVHJhbnNwYXJlbnRseSBiYWNraW5nIERNQSBtZW1vcnkgd2l0aCBhbiBJT01NVSBw cmV2ZW50cyBOb3V2ZWF1IGZyb20KcHJvcGVybHkgaGFuZGxpbmcgc3VjaCBtZW1vcnkgYWNjZXNz ZXMgYW5kIGNhdXNlcyBtZW1vcnkgYWNjZXNzIGZhdWx0cy4KCkFzIGEgc2lkZS1ub3RlOiBidWZm ZXJzIG90aGVyIHRoYW4gdGhvc2UgYWxsb2NhdGVkIGluIGluc3RhbmNlIG1lbW9yeQpkb24ndCBu ZWVkIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cyBmcm9tIHRoZSBHUFUncyBwZXJzcGVjdGl2 ZSBzaW5jZQp0aGUgR1BVIGNhbiBtYXAgdGhlbSBpbnRvIGNvbnRpZ3VvdXMgYnVmZmVycyB1c2lu ZyBpdHMgb3duIE1NVS4gTWFwcGluZwp0aGVzZSBidWZmZXJzIHRocm91Z2ggdGhlIElPTU1VIGlz IHVubmVjZXNzYXJ5IGFuZCB3aWxsIGV2ZW4gbGVhZCB0bwpwZXJmb3JtYW5jZSBkZWdyYWRhdGlv biBiZWNhdXNlIG9mIHRoZSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uLgoKU2lnbmVkLW9mZi1ieTog VGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KLS0tCkkgaGFkIGFscmVhZHkgc2Vu dCB0aGlzIG91dCBpbmRlcGVuZGVudGx5IHRvIGZpeCBhIHJlZ3Jlc3Npb24gdGhhdCB3YXMKaW50 cm9kdWNlZCBpbiB2NC4xNiwgYnV0IHRoZW4gQ2hyaXN0b3BoIHBvaW50ZWQgb3V0IHRoYXQgaXQg c2hvdWxkJ3ZlCmJlZW4gc2VudCB0byBhIHdpZGVyIGF1ZGllbmNlIGFuZCBzaG91bGQgdXNlIGEg Y29yZSBBUEkgcmF0aGVyIHRoYW4KY2FsbGluZyBpbnRvIGFyY2hpdGVjdHVyZSBjb2RlIGRpcmVj dGx5LgoKSSd2ZSBhZGRlZCBpdCB0byB0aGlzIHNlcmllcyBmb3IgZWFzaWVyIHJlZmVyZW5jZSBh bmQgdG8gc2hvdyB0aGUgbmVlZApmb3IgdGhlIG5ldyBBUEkuCgogLi4uL2RybS9ub3V2ZWF1L252 a20vZW5naW5lL2RldmljZS90ZWdyYS5jICAgIHwgMTkgKysrKysrKysrKysrKysrKysrKwogMSBm aWxlIGNoYW5nZWQsIDE5IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYyBiL2RyaXZlcnMvZ3B1L2RybS9u b3V2ZWF1L252a20vZW5naW5lL2RldmljZS90ZWdyYS5jCmluZGV4IDc4NTk3ZGE2MzEzYS4uMjM0 MjhhNzA1NmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2lu ZS9kZXZpY2UvdGVncmEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2lu ZS9kZXZpY2UvdGVncmEuYwpAQCAtMTksNiArMTksMTEgQEAKICAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICAqIERF QUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVJN X0RNQV9VU0VfSU9NTVUpCisjaW5jbHVkZSA8YXNtL2RtYS1pb21tdS5oPgorI2VuZGlmCisKICNp bmNsdWRlIDxjb3JlL3RlZ3JhLmg+CiAjaWZkZWYgQ09ORklHX05PVVZFQVVfUExBVEZPUk1fRFJJ VkVSCiAjaW5jbHVkZSAicHJpdi5oIgpAQCAtMTA1LDYgKzExMCwyMCBAQCBudmttX2RldmljZV90 ZWdyYV9wcm9iZV9pb21tdShzdHJ1Y3QgbnZrbV9kZXZpY2VfdGVncmEgKnRkZXYpCiAJdW5zaWdu ZWQgbG9uZyBwZ3NpemVfYml0bWFwOwogCWludCByZXQ7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJ R19BUk1fRE1BX1VTRV9JT01NVSkKKwlpZiAoZGV2LT5hcmNoZGF0YS5tYXBwaW5nKSB7CisJCXN0 cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IHRvX2RtYV9pb21tdV9tYXBwaW5nKGRl dik7CisKKwkJYXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZyhtYXBwaW5nKTsKKwkJYXJtX2lvbW11 X2RldGFjaF9kZXZpY2UoZGV2KTsKKworCQlpZiAoZGV2LT5hcmNoZGF0YS5kbWFfY29oZXJlbnQp CisJCQlzZXRfZG1hX29wcyhkZXYsICZhcm1fY29oZXJlbnRfZG1hX29wcyk7CisJCWVsc2UKKwkJ CXNldF9kbWFfb3BzKGRldiwgJmFybV9kbWFfb3BzKTsKKwl9CisjZW5kaWYKKwogCWlmICghdGRl di0+ZnVuYy0+aW9tbXVfYml0KQogCQlyZXR1cm47CiAKLS0gCjIuMTcuMAoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTm91dmVhdSBtYWlsaW5nIGxpc3QK Tm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9ub3V2ZWF1Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: thierry.reding@gmail.com (Thierry Reding) Date: Wed, 25 Apr 2018 12:10:47 +0200 Subject: [PATCH v2 1/5] drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping Message-ID: <20180425101051.15349-1-thierry.reding@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.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 --- I had already sent this out independently to fix a regression that was introduced in v4.16, but then Christoph pointed out that it should've been sent to a wider audience and should use a core API rather than calling into architecture code directly. I've added it to this series for easier reference and to show the need for the new API. .../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 78597da6313a..23428a7056e9 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; -- 2.17.0