From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752693AbcEIQsa (ORCPT ); Mon, 9 May 2016 12:48:30 -0400 Received: from smtp-3.sys.kth.se ([130.237.48.192]:37359 "EHLO smtp-3.sys.kth.se" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751638AbcEIQrk (ORCPT ); Mon, 9 May 2016 12:47:40 -0400 X-KTH-Auth: niso [89.233.230.99] X-KTH-mail-from: niklas.soderlund+renesas@ragnatech.se From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= To: vinod.koul@intel.com, linux-renesas-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux-foundation.org, hch@infradead.org Cc: robin.murphy@arm.com, laurent.pinchart@ideasonboard.com, geert+renesas@glider.be, linus.walleij@linaro.org, dan.j.williams@intel.com, arnd@arndb.de, linux-arch@vger.kernel.org, =?UTF-8?q?Niklas=20S=C3=B6derlund?= Subject: [PATCHv6 4/8] arm: dma-mapping: add {map,unmap}_resource for iommu ops Date: Mon, 9 May 2016 18:44:03 +0200 Message-Id: <1462812247-3414-5-git-send-email-niklas.soderlund+renesas@ragnatech.se> X-Mailer: git-send-email 2.8.2 In-Reply-To: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas@ragnatech.se> References: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas@ragnatech.se> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add methods to map/unmap device resources addresses for dma_map_ops that are IOMMU aware. This is needed to map a device MMIO register from a physical address. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- arch/arm/mm/dma-mapping.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index deac58d..d5fe32b 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -1962,6 +1962,63 @@ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle, __free_iova(mapping, iova, len); } +/** + * arm_iommu_map_resource - map a device resource for DMA + * @dev: valid struct device pointer + * @phys_addr: physical address of resource + * @size: size of resource to map + * @dir: DMA transfer direction + */ +static dma_addr_t arm_iommu_map_resource(struct device *dev, + phys_addr_t phys_addr, size_t size, + enum dma_data_direction dir, struct dma_attrs *attrs) +{ + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); + dma_addr_t dma_addr; + int ret, prot; + phys_addr_t addr = phys_addr & PAGE_MASK; + int offset = phys_addr & ~PAGE_MASK; + int len = PAGE_ALIGN(size + offset); + + dma_addr = __alloc_iova(mapping, size); + if (dma_addr == DMA_ERROR_CODE) + return dma_addr; + + prot = __dma_direction_to_prot(dir) | IOMMU_MMIO; + + ret = iommu_map(mapping->domain, dma_addr, addr, len, prot); + if (ret < 0) + goto fail; + + return dma_addr + offset; +fail: + __free_iova(mapping, dma_addr, size); + return DMA_ERROR_CODE; +} + +/** + * arm_iommu_unmap_resource - unmap a device DMA resource + * @dev: valid struct device pointer + * @dma_handle: DMA address to resource + * @size: size of resource to map + * @dir: DMA transfer direction + */ +static void arm_iommu_unmap_resource(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); + dma_addr_t iova = dma_handle & PAGE_MASK; + int offset = dma_handle & ~PAGE_MASK; + int len = PAGE_ALIGN(size + offset); + + if (!iova) + return; + + iommu_unmap(mapping->domain, iova, len); + __free_iova(mapping, iova, len); +} + static void arm_iommu_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, enum dma_data_direction dir) { @@ -2006,6 +2063,9 @@ struct dma_map_ops iommu_ops = { .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu, .sync_sg_for_device = arm_iommu_sync_sg_for_device, + .map_resource = arm_iommu_map_resource, + .unmap_resource = arm_iommu_unmap_resource, + .set_dma_mask = arm_dma_set_mask, }; @@ -2021,6 +2081,9 @@ struct dma_map_ops iommu_coherent_ops = { .map_sg = arm_coherent_iommu_map_sg, .unmap_sg = arm_coherent_iommu_unmap_sg, + .map_resource = arm_iommu_map_resource, + .unmap_resource = arm_iommu_unmap_resource, + .set_dma_mask = arm_dma_set_mask, }; -- 2.8.2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Subject: [PATCHv6 4/8] arm: dma-mapping: add {map, unmap}_resource for iommu ops Date: Mon, 9 May 2016 18:44:03 +0200 Message-ID: <1462812247-3414-5-git-send-email-niklas.soderlund+renesas@ragnatech.se> References: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas@ragnatech.se> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas-1zkq55x86MTxsAP9Fp7wbw@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org, linux-renesas-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org Cc: linux-arch-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, =?UTF-8?q?Niklas=20S=C3=B6derlund?= , geert+renesas-gXvu3+zWzMSzQB+pC5nmwQ@public.gmane.org, arnd-r2nGTMty4D4@public.gmane.org, linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org, laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org List-Id: linux-arch.vger.kernel.org QWRkIG1ldGhvZHMgdG8gbWFwL3VubWFwIGRldmljZSByZXNvdXJjZXMgYWRkcmVzc2VzIGZvciBk bWFfbWFwX29wcyB0aGF0CmFyZSBJT01NVSBhd2FyZS4gVGhpcyBpcyBuZWVkZWQgdG8gbWFwIGEg ZGV2aWNlIE1NSU8gcmVnaXN0ZXIgZnJvbSBhCnBoeXNpY2FsIGFkZHJlc3MuCgpTaWduZWQtb2Zm LWJ5OiBOaWtsYXMgU8O2ZGVybHVuZCA8bmlrbGFzLnNvZGVybHVuZCtyZW5lc2FzQHJhZ25hdGVj aC5zZT4KUmV2aWV3ZWQtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRl YXNvbmJvYXJkLmNvbT4KLS0tCiBhcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jIHwgNjMgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2Vk LCA2MyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcu YyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKaW5kZXggZGVhYzU4ZC4uZDVmZTMyYiAxMDA2 NDQKLS0tIGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybS9tbS9kbWEt bWFwcGluZy5jCkBAIC0xOTYyLDYgKzE5NjIsNjMgQEAgc3RhdGljIHZvaWQgYXJtX2lvbW11X3Vu bWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwKIAlfX2ZyZWVf aW92YShtYXBwaW5nLCBpb3ZhLCBsZW4pOwogfQogCisvKioKKyAqIGFybV9pb21tdV9tYXBfcmVz b3VyY2UgLSBtYXAgYSBkZXZpY2UgcmVzb3VyY2UgZm9yIERNQQorICogQGRldjogdmFsaWQgc3Ry dWN0IGRldmljZSBwb2ludGVyCisgKiBAcGh5c19hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJl c291cmNlCisgKiBAc2l6ZTogc2l6ZSBvZiByZXNvdXJjZSB0byBtYXAKKyAqIEBkaXI6IERNQSB0 cmFuc2ZlciBkaXJlY3Rpb24KKyAqLworc3RhdGljIGRtYV9hZGRyX3QgYXJtX2lvbW11X21hcF9y ZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXBoeXNfYWRkcl90IHBoeXNfYWRkciwgc2l6 ZV90IHNpemUsCisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IGRtYV9hdHRy cyAqYXR0cnMpCit7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gdG9fZG1h X2lvbW11X21hcHBpbmcoZGV2KTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCByZXQsIHBy b3Q7CisJcGh5c19hZGRyX3QgYWRkciA9IHBoeXNfYWRkciAmIFBBR0VfTUFTSzsKKwlpbnQgb2Zm c2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKwlpbnQgbGVuID0gUEFHRV9BTElHTihzaXpl ICsgb2Zmc2V0KTsKKworCWRtYV9hZGRyID0gX19hbGxvY19pb3ZhKG1hcHBpbmcsIHNpemUpOwor CWlmIChkbWFfYWRkciA9PSBETUFfRVJST1JfQ09ERSkKKwkJcmV0dXJuIGRtYV9hZGRyOworCisJ cHJvdCA9IF9fZG1hX2RpcmVjdGlvbl90b19wcm90KGRpcikgfCBJT01NVV9NTUlPOworCisJcmV0 ID0gaW9tbXVfbWFwKG1hcHBpbmctPmRvbWFpbiwgZG1hX2FkZHIsIGFkZHIsIGxlbiwgcHJvdCk7 CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldHVybiBkbWFfYWRkciArIG9mZnNl dDsKK2ZhaWw6CisJX19mcmVlX2lvdmEobWFwcGluZywgZG1hX2FkZHIsIHNpemUpOworCXJldHVy biBETUFfRVJST1JfQ09ERTsKK30KKworLyoqCisgKiBhcm1faW9tbXVfdW5tYXBfcmVzb3VyY2Ug LSB1bm1hcCBhIGRldmljZSBETUEgcmVzb3VyY2UKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZp Y2UgcG9pbnRlcgorICogQGRtYV9oYW5kbGU6IERNQSBhZGRyZXNzIHRvIHJlc291cmNlCisgKiBA c2l6ZTogc2l6ZSBvZiByZXNvdXJjZSB0byBtYXAKKyAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJl Y3Rpb24KKyAqLworc3RhdGljIHZvaWQgYXJtX2lvbW11X3VubWFwX3Jlc291cmNlKHN0cnVjdCBk ZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQlzaXplX3Qgc2l6ZSwgZW51bSBk bWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlz dHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhk ZXYpOworCWRtYV9hZGRyX3QgaW92YSA9IGRtYV9oYW5kbGUgJiBQQUdFX01BU0s7CisJaW50IG9m ZnNldCA9IGRtYV9oYW5kbGUgJiB+UEFHRV9NQVNLOworCWludCBsZW4gPSBQQUdFX0FMSUdOKHNp emUgKyBvZmZzZXQpOworCisJaWYgKCFpb3ZhKQorCQlyZXR1cm47CisKKwlpb21tdV91bm1hcCht YXBwaW5nLT5kb21haW4sIGlvdmEsIGxlbik7CisJX19mcmVlX2lvdmEobWFwcGluZywgaW92YSwg bGVuKTsKK30KKwogc3RhdGljIHZvaWQgYXJtX2lvbW11X3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3Ry dWN0IGRldmljZSAqZGV2LAogCQlkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsIGVudW0g ZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKQEAgLTIwMDYsNiArMjA2Myw5IEBAIHN0cnVjdCBk bWFfbWFwX29wcyBpb21tdV9vcHMgPSB7CiAJLnN5bmNfc2dfZm9yX2NwdQk9IGFybV9pb21tdV9z eW5jX3NnX2Zvcl9jcHUsCiAJLnN5bmNfc2dfZm9yX2RldmljZQk9IGFybV9pb21tdV9zeW5jX3Nn X2Zvcl9kZXZpY2UsCiAKKwkubWFwX3Jlc291cmNlCQk9IGFybV9pb21tdV9tYXBfcmVzb3VyY2Us CisJLnVubWFwX3Jlc291cmNlCQk9IGFybV9pb21tdV91bm1hcF9yZXNvdXJjZSwKKwogCS5zZXRf ZG1hX21hc2sJCT0gYXJtX2RtYV9zZXRfbWFzaywKIH07CiAKQEAgLTIwMjEsNiArMjA4MSw5IEBA IHN0cnVjdCBkbWFfbWFwX29wcyBpb21tdV9jb2hlcmVudF9vcHMgPSB7CiAJLm1hcF9zZwkJPSBh cm1fY29oZXJlbnRfaW9tbXVfbWFwX3NnLAogCS51bm1hcF9zZwk9IGFybV9jb2hlcmVudF9pb21t dV91bm1hcF9zZywKIAorCS5tYXBfcmVzb3VyY2UJPSBhcm1faW9tbXVfbWFwX3Jlc291cmNlLAor CS51bm1hcF9yZXNvdXJjZQk9IGFybV9pb21tdV91bm1hcF9yZXNvdXJjZSwKKwogCS5zZXRfZG1h X21hc2sJPSBhcm1fZG1hX3NldF9tYXNrLAogfTsKIAotLSAKMi44LjIKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21t dUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlv bi5vcmcvbWFpbG1hbi9saXN0aW5mby9pb21tdQ== From mboxrd@z Thu Jan 1 00:00:00 1970 From: niklas.soderlund+renesas@ragnatech.se (=?UTF-8?q?Niklas=20S=C3=B6derlund?=) Date: Mon, 9 May 2016 18:44:03 +0200 Subject: [PATCHv6 4/8] arm: dma-mapping: add {map, unmap}_resource for iommu ops In-Reply-To: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas@ragnatech.se> References: <1462812247-3414-1-git-send-email-niklas.soderlund+renesas@ragnatech.se> Message-ID: <1462812247-3414-5-git-send-email-niklas.soderlund+renesas@ragnatech.se> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Add methods to map/unmap device resources addresses for dma_map_ops that are IOMMU aware. This is needed to map a device MMIO register from a physical address. Signed-off-by: Niklas S?derlund Reviewed-by: Laurent Pinchart --- arch/arm/mm/dma-mapping.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index deac58d..d5fe32b 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -1962,6 +1962,63 @@ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle, __free_iova(mapping, iova, len); } +/** + * arm_iommu_map_resource - map a device resource for DMA + * @dev: valid struct device pointer + * @phys_addr: physical address of resource + * @size: size of resource to map + * @dir: DMA transfer direction + */ +static dma_addr_t arm_iommu_map_resource(struct device *dev, + phys_addr_t phys_addr, size_t size, + enum dma_data_direction dir, struct dma_attrs *attrs) +{ + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); + dma_addr_t dma_addr; + int ret, prot; + phys_addr_t addr = phys_addr & PAGE_MASK; + int offset = phys_addr & ~PAGE_MASK; + int len = PAGE_ALIGN(size + offset); + + dma_addr = __alloc_iova(mapping, size); + if (dma_addr == DMA_ERROR_CODE) + return dma_addr; + + prot = __dma_direction_to_prot(dir) | IOMMU_MMIO; + + ret = iommu_map(mapping->domain, dma_addr, addr, len, prot); + if (ret < 0) + goto fail; + + return dma_addr + offset; +fail: + __free_iova(mapping, dma_addr, size); + return DMA_ERROR_CODE; +} + +/** + * arm_iommu_unmap_resource - unmap a device DMA resource + * @dev: valid struct device pointer + * @dma_handle: DMA address to resource + * @size: size of resource to map + * @dir: DMA transfer direction + */ +static void arm_iommu_unmap_resource(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); + dma_addr_t iova = dma_handle & PAGE_MASK; + int offset = dma_handle & ~PAGE_MASK; + int len = PAGE_ALIGN(size + offset); + + if (!iova) + return; + + iommu_unmap(mapping->domain, iova, len); + __free_iova(mapping, iova, len); +} + static void arm_iommu_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, enum dma_data_direction dir) { @@ -2006,6 +2063,9 @@ struct dma_map_ops iommu_ops = { .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu, .sync_sg_for_device = arm_iommu_sync_sg_for_device, + .map_resource = arm_iommu_map_resource, + .unmap_resource = arm_iommu_unmap_resource, + .set_dma_mask = arm_dma_set_mask, }; @@ -2021,6 +2081,9 @@ struct dma_map_ops iommu_coherent_ops = { .map_sg = arm_coherent_iommu_map_sg, .unmap_sg = arm_coherent_iommu_unmap_sg, + .map_resource = arm_iommu_map_resource, + .unmap_resource = arm_iommu_unmap_resource, + .set_dma_mask = arm_dma_set_mask, }; -- 2.8.2