From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754123AbcDTCyw (ORCPT ); Tue, 19 Apr 2016 22:54:52 -0400 Received: from regular1.263xmail.com ([211.150.99.140]:37420 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751833AbcDTCyu (ORCPT ); Tue, 19 Apr 2016 22:54:50 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-KSVirus-check: 0 X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: airlied@linux.ie X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 From: Mark Yao To: David Airlie , Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Mark Yao Subject: [PATCH v2] drm/rockchip: support non-iommu buffer path Date: Wed, 20 Apr 2016 10:53:33 +0800 Message-Id: <1461120813-1117-1-git-send-email-mark.yao@rock-chips.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> References: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some rockchip vop not support iommu, need use non-iommu buffer for it. And if we get iommu issues, we can compare the issues with non-iommu path, the would help the debug. Signed-off-by: Mark Yao --- Changes in v2 Advised by Heiko Stuebner - use more suitable message print. drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 64 +++++++++++++++++++-------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index f556a8f..00aa175 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -36,6 +36,8 @@ #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 +static bool is_support_iommu = true; + /* * Attach a (component) device to the shared drm dma mapping from master drm * device. This is used by the VOPs to map GEM buffers to a common DMA @@ -47,6 +49,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, struct dma_iommu_mapping *mapping = drm_dev->dev->archdata.mapping; int ret; + if (!is_support_iommu) + return 0; + ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); if (ret) return ret; @@ -59,6 +64,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, struct device *dev) { + if (!is_support_iommu) + return; + arm_iommu_detach_device(dev); } @@ -152,23 +160,26 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags) goto err_config_cleanup; } - /* TODO(djkurtz): fetch the mapping start/size from somewhere */ - mapping = arm_iommu_create_mapping(&platform_bus_type, 0x00000000, - SZ_2G); - if (IS_ERR(mapping)) { - ret = PTR_ERR(mapping); - goto err_config_cleanup; - } + if (is_support_iommu) { + /* TODO(djkurtz): fetch the mapping start/size from somewhere */ + mapping = arm_iommu_create_mapping(&platform_bus_type, + 0x00000000, + SZ_2G); + if (IS_ERR(mapping)) { + ret = PTR_ERR(mapping); + goto err_config_cleanup; + } - ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); - if (ret) - goto err_release_mapping; + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); + if (ret) + goto err_release_mapping; - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); + dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); - ret = arm_iommu_attach_device(dev, mapping); - if (ret) - goto err_release_mapping; + ret = arm_iommu_attach_device(dev, mapping); + if (ret) + goto err_release_mapping; + } /* Try to bind all sub drivers. */ ret = component_bind_all(dev, drm_dev); @@ -226,9 +237,11 @@ err_kms_helper_poll_fini: err_unbind: component_unbind_all(dev, drm_dev); err_detach_device: - arm_iommu_detach_device(dev); + if (is_support_iommu) + arm_iommu_detach_device(dev); err_release_mapping: - arm_iommu_release_mapping(dev->archdata.mapping); + if (is_support_iommu) + arm_iommu_release_mapping(dev->archdata.mapping); err_config_cleanup: drm_mode_config_cleanup(drm_dev); drm_dev->dev_private = NULL; @@ -243,8 +256,10 @@ static int rockchip_drm_unload(struct drm_device *drm_dev) drm_vblank_cleanup(drm_dev); drm_kms_helper_poll_fini(drm_dev); component_unbind_all(dev, drm_dev); - arm_iommu_detach_device(dev); - arm_iommu_release_mapping(dev->archdata.mapping); + if (is_support_iommu) { + arm_iommu_detach_device(dev); + arm_iommu_release_mapping(dev->archdata.mapping); + } drm_mode_config_cleanup(drm_dev); drm_dev->dev_private = NULL; @@ -488,6 +503,8 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) * works as expected. */ for (i = 0;; i++) { + struct device_node *iommu; + port = of_parse_phandle(np, "ports", i); if (!port) break; @@ -497,6 +514,17 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) continue; } + iommu = of_parse_phandle(port->parent, "iommus", 0); + if (!iommu || !of_device_is_available(iommu->parent)) { + dev_dbg(dev, "no iommu attached for %s, using non-iommu buffers\n", + port->parent->full_name); + /* + * if there is a crtc not support iommu, force set all + * crtc use non-iommu buffer. + */ + is_support_iommu = false; + } + component_match_add(dev, &match, compare_of, port->parent); of_node_put(port); } -- 1.7.9.5 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark Yao Subject: [PATCH v2] drm/rockchip: support non-iommu buffer path Date: Wed, 20 Apr 2016 10:53:33 +0800 Message-ID: <1461120813-1117-1-git-send-email-mark.yao@rock-chips.com> References: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: David Airlie , Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org List-Id: linux-rockchip.vger.kernel.org U29tZSByb2NrY2hpcCB2b3Agbm90IHN1cHBvcnQgaW9tbXUsIG5lZWQgdXNlIG5vbi1pb21tdQpi dWZmZXIgZm9yIGl0LiBBbmQgaWYgd2UgZ2V0IGlvbW11IGlzc3Vlcywgd2UgY2FuIGNvbXBhcmUK dGhlIGlzc3VlcyB3aXRoIG5vbi1pb21tdSBwYXRoLCB0aGUgd291bGQgaGVscCB0aGUgZGVidWcu CgpTaWduZWQtb2ZmLWJ5OiBNYXJrIFlhbyA8bWFyay55YW9Acm9jay1jaGlwcy5jb20+Ci0tLQpD aGFuZ2VzIGluIHYyCkFkdmlzZWQgYnkgSGVpa28gU3R1ZWJuZXIKLSB1c2UgbW9yZSBzdWl0YWJs ZSBtZXNzYWdlIHByaW50LgoKIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1f ZHJ2LmMgfCAgIDY0ICsrKysrKysrKysrKysrKysrKystLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQs IDQ2IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCmluZGV4IGY1NTZhOGYuLjAwYWExNzUgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuYwpAQCAtMzYsNiArMzYsOCBA QAogI2RlZmluZSBEUklWRVJfTUFKT1IJMQogI2RlZmluZSBEUklWRVJfTUlOT1IJMAogCitzdGF0 aWMgYm9vbCBpc19zdXBwb3J0X2lvbW11ID0gdHJ1ZTsKKwogLyoKICAqIEF0dGFjaCBhIChjb21w b25lbnQpIGRldmljZSB0byB0aGUgc2hhcmVkIGRybSBkbWEgbWFwcGluZyBmcm9tIG1hc3RlciBk cm0KICAqIGRldmljZS4gIFRoaXMgaXMgdXNlZCBieSB0aGUgVk9QcyB0byBtYXAgR0VNIGJ1ZmZl cnMgdG8gYSBjb21tb24gRE1BCkBAIC00Nyw2ICs0OSw5IEBAIGludCByb2NrY2hpcF9kcm1fZG1h X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsCiAJc3RydWN0IGRtYV9p b21tdV9tYXBwaW5nICptYXBwaW5nID0gZHJtX2Rldi0+ZGV2LT5hcmNoZGF0YS5tYXBwaW5nOwog CWludCByZXQ7CiAKKwlpZiAoIWlzX3N1cHBvcnRfaW9tbXUpCisJCXJldHVybiAwOworCiAJcmV0 ID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKHJl dCkKIAkJcmV0dXJuIHJldDsKQEAgLTU5LDYgKzY0LDkgQEAgaW50IHJvY2tjaGlwX2RybV9kbWFf YXR0YWNoX2RldmljZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiwKIHZvaWQgcm9ja2NoaXBf ZHJtX2RtYV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LAogCQkJCSAg ICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJaWYgKCFpc19zdXBwb3J0X2lvbW11KQorCQlyZXR1 cm47CisKIAlhcm1faW9tbXVfZGV0YWNoX2RldmljZShkZXYpOwogfQogCkBAIC0xNTIsMjMgKzE2 MCwyNiBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpk cm1fZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogCQlnb3RvIGVycl9jb25maWdfY2xlYW51cDsK IAl9CiAKLQkvKiBUT0RPKGRqa3VydHopOiBmZXRjaCB0aGUgbWFwcGluZyBzdGFydC9zaXplIGZy b20gc29tZXdoZXJlICovCi0JbWFwcGluZyA9IGFybV9pb21tdV9jcmVhdGVfbWFwcGluZygmcGxh dGZvcm1fYnVzX3R5cGUsIDB4MDAwMDAwMDAsCi0JCQkJCSAgIFNaXzJHKTsKLQlpZiAoSVNfRVJS KG1hcHBpbmcpKSB7Ci0JCXJldCA9IFBUUl9FUlIobWFwcGluZyk7Ci0JCWdvdG8gZXJyX2NvbmZp Z19jbGVhbnVwOwotCX0KKwlpZiAoaXNfc3VwcG9ydF9pb21tdSkgeworCQkvKiBUT0RPKGRqa3Vy dHopOiBmZXRjaCB0aGUgbWFwcGluZyBzdGFydC9zaXplIGZyb20gc29tZXdoZXJlICovCisJCW1h cHBpbmcgPSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoJnBsYXRmb3JtX2J1c190eXBlLAorCQkJ CQkJICAgMHgwMDAwMDAwMCwKKwkJCQkJCSAgIFNaXzJHKTsKKwkJaWYgKElTX0VSUihtYXBwaW5n KSkgeworCQkJcmV0ID0gUFRSX0VSUihtYXBwaW5nKTsKKwkJCWdvdG8gZXJyX2NvbmZpZ19jbGVh bnVwOworCQl9CiAKLQlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KGRldiwgRE1BX0JJ VF9NQVNLKDMyKSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmVsZWFzZV9tYXBwaW5nOworCQly ZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJ CWlmIChyZXQpCisJCQlnb3RvIGVycl9yZWxlYXNlX21hcHBpbmc7CiAKLQlkbWFfc2V0X21heF9z ZWdfc2l6ZShkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlkbWFfc2V0X21heF9zZWdfc2l6ZShk ZXYsIERNQV9CSVRfTUFTSygzMikpOwogCi0JcmV0ID0gYXJtX2lvbW11X2F0dGFjaF9kZXZpY2Uo ZGV2LCBtYXBwaW5nKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9yZWxlYXNlX21hcHBpbmc7CisJ CXJldCA9IGFybV9pb21tdV9hdHRhY2hfZGV2aWNlKGRldiwgbWFwcGluZyk7CisJCWlmIChyZXQp CisJCQlnb3RvIGVycl9yZWxlYXNlX21hcHBpbmc7CisJfQogCiAJLyogVHJ5IHRvIGJpbmQgYWxs IHN1YiBkcml2ZXJzLiAqLwogCXJldCA9IGNvbXBvbmVudF9iaW5kX2FsbChkZXYsIGRybV9kZXYp OwpAQCAtMjI2LDkgKzIzNywxMSBAQCBlcnJfa21zX2hlbHBlcl9wb2xsX2Zpbmk6CiBlcnJfdW5i aW5kOgogCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgZHJtX2Rldik7CiBlcnJfZGV0YWNoX2Rl dmljZToKLQlhcm1faW9tbXVfZGV0YWNoX2RldmljZShkZXYpOworCWlmIChpc19zdXBwb3J0X2lv bW11KQorCQlhcm1faW9tbXVfZGV0YWNoX2RldmljZShkZXYpOwogZXJyX3JlbGVhc2VfbWFwcGlu ZzoKLQlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKGRldi0+YXJjaGRhdGEubWFwcGluZyk7CisJ aWYgKGlzX3N1cHBvcnRfaW9tbXUpCisJCWFybV9pb21tdV9yZWxlYXNlX21hcHBpbmcoZGV2LT5h cmNoZGF0YS5tYXBwaW5nKTsKIGVycl9jb25maWdfY2xlYW51cDoKIAlkcm1fbW9kZV9jb25maWdf Y2xlYW51cChkcm1fZGV2KTsKIAlkcm1fZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CkBAIC0yNDMs OCArMjU2LDEwIEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX3VubG9hZChzdHJ1Y3QgZHJtX2Rl dmljZSAqZHJtX2RldikKIAlkcm1fdmJsYW5rX2NsZWFudXAoZHJtX2Rldik7CiAJZHJtX2ttc19o ZWxwZXJfcG9sbF9maW5pKGRybV9kZXYpOwogCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgZHJt X2Rldik7Ci0JYXJtX2lvbW11X2RldGFjaF9kZXZpY2UoZGV2KTsKLQlhcm1faW9tbXVfcmVsZWFz ZV9tYXBwaW5nKGRldi0+YXJjaGRhdGEubWFwcGluZyk7CisJaWYgKGlzX3N1cHBvcnRfaW9tbXUp IHsKKwkJYXJtX2lvbW11X2RldGFjaF9kZXZpY2UoZGV2KTsKKwkJYXJtX2lvbW11X3JlbGVhc2Vf bWFwcGluZyhkZXYtPmFyY2hkYXRhLm1hcHBpbmcpOworCX0KIAlkcm1fbW9kZV9jb25maWdfY2xl YW51cChkcm1fZGV2KTsKIAlkcm1fZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CiAKQEAgLTQ4OCw2 ICs1MDMsOCBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCSAqIHdvcmtzIGFzIGV4cGVjdGVkLgogCSAqLwogCWZv ciAoaSA9IDA7OyBpKyspIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICppb21tdTsKKwogCQlwb3J0 ID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBvcnRzIiwgaSk7CiAJCWlmICghcG9ydCkKIAkJCWJy ZWFrOwpAQCAtNDk3LDYgKzUxNCwxNyBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9wbGF0Zm9y bV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQkJY29udGludWU7CiAJCX0K IAorCQlpb21tdSA9IG9mX3BhcnNlX3BoYW5kbGUocG9ydC0+cGFyZW50LCAiaW9tbXVzIiwgMCk7 CisJCWlmICghaW9tbXUgfHwgIW9mX2RldmljZV9pc19hdmFpbGFibGUoaW9tbXUtPnBhcmVudCkp IHsKKwkJCWRldl9kYmcoZGV2LCAibm8gaW9tbXUgYXR0YWNoZWQgZm9yICVzLCB1c2luZyBub24t aW9tbXUgYnVmZmVyc1xuIiwKKwkJCQlwb3J0LT5wYXJlbnQtPmZ1bGxfbmFtZSk7CisJCQkvKgor CQkJICogaWYgdGhlcmUgaXMgYSBjcnRjIG5vdCBzdXBwb3J0IGlvbW11LCBmb3JjZSBzZXQgYWxs CisJCQkgKiBjcnRjIHVzZSBub24taW9tbXUgYnVmZmVyLgorCQkJICovCisJCQlpc19zdXBwb3J0 X2lvbW11ID0gZmFsc2U7CisJCX0KKwogCQljb21wb25lbnRfbWF0Y2hfYWRkKGRldiwgJm1hdGNo LCBjb21wYXJlX29mLCBwb3J0LT5wYXJlbnQpOwogCQlvZl9ub2RlX3B1dChwb3J0KTsKIAl9Ci0t IAoxLjcuOS41CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.yao@rock-chips.com (Mark Yao) Date: Wed, 20 Apr 2016 10:53:33 +0800 Subject: [PATCH v2] drm/rockchip: support non-iommu buffer path In-Reply-To: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> References: <1461032372-14630-1-git-send-email-mark.yao@rock-chips.com> Message-ID: <1461120813-1117-1-git-send-email-mark.yao@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Some rockchip vop not support iommu, need use non-iommu buffer for it. And if we get iommu issues, we can compare the issues with non-iommu path, the would help the debug. Signed-off-by: Mark Yao --- Changes in v2 Advised by Heiko Stuebner - use more suitable message print. drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 64 +++++++++++++++++++-------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index f556a8f..00aa175 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -36,6 +36,8 @@ #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 +static bool is_support_iommu = true; + /* * Attach a (component) device to the shared drm dma mapping from master drm * device. This is used by the VOPs to map GEM buffers to a common DMA @@ -47,6 +49,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, struct dma_iommu_mapping *mapping = drm_dev->dev->archdata.mapping; int ret; + if (!is_support_iommu) + return 0; + ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); if (ret) return ret; @@ -59,6 +64,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, struct device *dev) { + if (!is_support_iommu) + return; + arm_iommu_detach_device(dev); } @@ -152,23 +160,26 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags) goto err_config_cleanup; } - /* TODO(djkurtz): fetch the mapping start/size from somewhere */ - mapping = arm_iommu_create_mapping(&platform_bus_type, 0x00000000, - SZ_2G); - if (IS_ERR(mapping)) { - ret = PTR_ERR(mapping); - goto err_config_cleanup; - } + if (is_support_iommu) { + /* TODO(djkurtz): fetch the mapping start/size from somewhere */ + mapping = arm_iommu_create_mapping(&platform_bus_type, + 0x00000000, + SZ_2G); + if (IS_ERR(mapping)) { + ret = PTR_ERR(mapping); + goto err_config_cleanup; + } - ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); - if (ret) - goto err_release_mapping; + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); + if (ret) + goto err_release_mapping; - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); + dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); - ret = arm_iommu_attach_device(dev, mapping); - if (ret) - goto err_release_mapping; + ret = arm_iommu_attach_device(dev, mapping); + if (ret) + goto err_release_mapping; + } /* Try to bind all sub drivers. */ ret = component_bind_all(dev, drm_dev); @@ -226,9 +237,11 @@ err_kms_helper_poll_fini: err_unbind: component_unbind_all(dev, drm_dev); err_detach_device: - arm_iommu_detach_device(dev); + if (is_support_iommu) + arm_iommu_detach_device(dev); err_release_mapping: - arm_iommu_release_mapping(dev->archdata.mapping); + if (is_support_iommu) + arm_iommu_release_mapping(dev->archdata.mapping); err_config_cleanup: drm_mode_config_cleanup(drm_dev); drm_dev->dev_private = NULL; @@ -243,8 +256,10 @@ static int rockchip_drm_unload(struct drm_device *drm_dev) drm_vblank_cleanup(drm_dev); drm_kms_helper_poll_fini(drm_dev); component_unbind_all(dev, drm_dev); - arm_iommu_detach_device(dev); - arm_iommu_release_mapping(dev->archdata.mapping); + if (is_support_iommu) { + arm_iommu_detach_device(dev); + arm_iommu_release_mapping(dev->archdata.mapping); + } drm_mode_config_cleanup(drm_dev); drm_dev->dev_private = NULL; @@ -488,6 +503,8 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) * works as expected. */ for (i = 0;; i++) { + struct device_node *iommu; + port = of_parse_phandle(np, "ports", i); if (!port) break; @@ -497,6 +514,17 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) continue; } + iommu = of_parse_phandle(port->parent, "iommus", 0); + if (!iommu || !of_device_is_available(iommu->parent)) { + dev_dbg(dev, "no iommu attached for %s, using non-iommu buffers\n", + port->parent->full_name); + /* + * if there is a crtc not support iommu, force set all + * crtc use non-iommu buffer. + */ + is_support_iommu = false; + } + component_match_add(dev, &match, compare_of, port->parent); of_node_put(port); } -- 1.7.9.5