From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752731AbcEIQtT (ORCPT ); Mon, 9 May 2016 12:49:19 -0400 Received: from smtp-3.sys.kth.se ([130.237.48.192]:37328 "EHLO smtp-3.sys.kth.se" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751040AbcEIQrj (ORCPT ); Mon, 9 May 2016 12:47:39 -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 2/8] dma-debug: add support for resource mappings Date: Mon, 9 May 2016 18:44:01 +0200 Message-Id: <1462812247-3414-3-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 A MMIO mapped resource can not be represented by a struct page so a new debug type is needed to handle this. This patch add such type and functionality to add/remove entries and how to translate them to a physical address. Signed-off-by: Niklas Söderlund --- include/linux/dma-debug.h | 19 +++++++++++++++++ lib/dma-debug.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h index fe8cb61..c7d844f 100644 --- a/include/linux/dma-debug.h +++ b/include/linux/dma-debug.h @@ -56,6 +56,13 @@ extern void debug_dma_alloc_coherent(struct device *dev, size_t size, extern void debug_dma_free_coherent(struct device *dev, size_t size, void *virt, dma_addr_t addr); +extern void debug_dma_map_resource(struct device *dev, phys_addr_t addr, + size_t size, int direction, + dma_addr_t dma_addr); + +extern void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, int direction); + extern void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction); @@ -141,6 +148,18 @@ static inline void debug_dma_free_coherent(struct device *dev, size_t size, { } +static inline void debug_dma_map_resource(struct device *dev, phys_addr_t addr, + size_t size, int direction, + dma_addr_t dma_addr) +{ +} + +static inline void debug_dma_unmap_resource(struct device *dev, + dma_addr_t dma_addr, size_t size, + int direction) +{ +} + static inline void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction) diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 4a1515f..fb12d5c 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c @@ -43,6 +43,7 @@ enum { dma_debug_page, dma_debug_sg, dma_debug_coherent, + dma_debug_resource, }; enum map_err_types { @@ -150,8 +151,9 @@ static const char *const maperr2str[] = { [MAP_ERR_CHECKED] = "dma map error checked", }; -static const char *type2name[4] = { "single", "page", - "scather-gather", "coherent" }; +static const char *type2name[5] = { "single", "page", + "scather-gather", "coherent", + "resource" }; static const char *dir2name[4] = { "DMA_BIDIRECTIONAL", "DMA_TO_DEVICE", "DMA_FROM_DEVICE", "DMA_NONE" }; @@ -397,6 +399,9 @@ static void hash_bucket_del(struct dma_debug_entry *entry) static unsigned long long phys_addr(struct dma_debug_entry *entry) { + if (entry->type == dma_debug_resource) + return PHYS_PFN(entry->pfn) + entry->offset; + return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset; } @@ -1493,6 +1498,49 @@ void debug_dma_free_coherent(struct device *dev, size_t size, } EXPORT_SYMBOL(debug_dma_free_coherent); +void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size, + int direction, dma_addr_t dma_addr) +{ + struct dma_debug_entry *entry; + + if (unlikely(dma_debug_disabled())) + return; + + entry = dma_entry_alloc(); + if (!entry) + return; + + entry->type = dma_debug_resource; + entry->dev = dev; + entry->pfn = __phys_to_pfn(addr); + entry->offset = addr - PHYS_PFN(entry->pfn); + entry->size = size; + entry->dev_addr = dma_addr; + entry->direction = direction; + entry->map_err_type = MAP_ERR_NOT_CHECKED; + + add_dma_entry(entry); +} +EXPORT_SYMBOL(debug_dma_map_resource); + +void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, int direction) +{ + struct dma_debug_entry ref = { + .type = dma_debug_resource, + .dev = dev, + .dev_addr = dma_addr, + .size = size, + .direction = direction, + }; + + if (unlikely(dma_debug_disabled())) + return; + + check_unmap(&ref); +} +EXPORT_SYMBOL(debug_dma_unmap_resource); + void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction) { -- 2.8.2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Subject: [PATCHv6 2/8] dma-debug: add support for resource mappings Date: Mon, 9 May 2016 18:44:01 +0200 Message-ID: <1462812247-3414-3-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 QSBNTUlPIG1hcHBlZCByZXNvdXJjZSBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgc3RydWN0 IHBhZ2Ugc28gYSBuZXcKZGVidWcgdHlwZSBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoaXMuIFRoaXMg cGF0Y2ggYWRkIHN1Y2ggdHlwZSBhbmQKZnVuY3Rpb25hbGl0eSB0byBhZGQvcmVtb3ZlIGVudHJp ZXMgYW5kIGhvdyB0byB0cmFuc2xhdGUgdGhlbSB0byBhCnBoeXNpY2FsIGFkZHJlc3MuCgpTaWdu ZWQtb2ZmLWJ5OiBOaWtsYXMgU8O2ZGVybHVuZCA8bmlrbGFzLnNvZGVybHVuZCtyZW5lc2FzQHJh Z25hdGVjaC5zZT4KLS0tCiBpbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oIHwgMTkgKysrKysrKysr KysrKysrKysKIGxpYi9kbWEtZGVidWcuYyAgICAgICAgICAgfCA1MiArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystLQogMiBmaWxlcyBjaGFuZ2VkLCA2OSBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1h LWRlYnVnLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oCmluZGV4IGZlOGNiNjEuLmM3ZDg0 NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmgKKysrIGIvaW5jbHVkZS9s aW51eC9kbWEtZGVidWcuaApAQCAtNTYsNiArNTYsMTMgQEAgZXh0ZXJuIHZvaWQgZGVidWdfZG1h X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiBleHRlcm4g dm9pZCBkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBz aXplLAogCQkJCSAgICB2b2lkICp2aXJ0LCBkbWFfYWRkcl90IGFkZHIpOwogCitleHRlcm4gdm9p ZCBkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3Qg YWRkciwKKwkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbiwKKwkJCQkgICBkbWFfYWRk cl90IGRtYV9hZGRyKTsKKworZXh0ZXJuIHZvaWQgZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKHN0 cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCQkgICAgIHNpemVfdCBz aXplLCBpbnQgZGlyZWN0aW9uKTsKKwogZXh0ZXJuIHZvaWQgZGVidWdfZG1hX3N5bmNfc2luZ2xl X2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgIGRtYV9hZGRyX3QgZG1hX2hhbmRs ZSwgc2l6ZV90IHNpemUsCiAJCQkJCSAgaW50IGRpcmVjdGlvbik7CkBAIC0xNDEsNiArMTQ4LDE4 IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2 aWNlICpkZXYsIHNpemVfdCBzaXplLAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdf ZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IGFkZHIsCisJ CQkJCSAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24sCisJCQkJCSAgZG1hX2FkZHJfdCBkbWFf YWRkcikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2RtYV91bm1hcF9yZXNvdXJj ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXpl X3Qgc2l6ZSwKKwkJCQkJICAgIGludCBkaXJlY3Rpb24pCit7Cit9CisKIHN0YXRpYyBpbmxpbmUg dm9pZCBkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJ CQkJCQkgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAogCQkJCQkJIHNpemVfdCBzaXplLCBpbnQgZGly ZWN0aW9uKQpkaWZmIC0tZ2l0IGEvbGliL2RtYS1kZWJ1Zy5jIGIvbGliL2RtYS1kZWJ1Zy5jCmlu ZGV4IDRhMTUxNWYuLmZiMTJkNWMgMTAwNjQ0Ci0tLSBhL2xpYi9kbWEtZGVidWcuYworKysgYi9s aWIvZG1hLWRlYnVnLmMKQEAgLTQzLDYgKzQzLDcgQEAgZW51bSB7CiAJZG1hX2RlYnVnX3BhZ2Us CiAJZG1hX2RlYnVnX3NnLAogCWRtYV9kZWJ1Z19jb2hlcmVudCwKKwlkbWFfZGVidWdfcmVzb3Vy Y2UsCiB9OwogCiBlbnVtIG1hcF9lcnJfdHlwZXMgewpAQCAtMTUwLDggKzE1MSw5IEBAIHN0YXRp YyBjb25zdCBjaGFyICpjb25zdCBtYXBlcnIyc3RyW10gPSB7CiAJW01BUF9FUlJfQ0hFQ0tFRF0g PSAiZG1hIG1hcCBlcnJvciBjaGVja2VkIiwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICp0eXBl Mm5hbWVbNF0gPSB7ICJzaW5nbGUiLCAicGFnZSIsCi0JCQkJICAgICJzY2F0aGVyLWdhdGhlciIs ICJjb2hlcmVudCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0eXBlMm5hbWVbNV0gPSB7ICJzaW5n bGUiLCAicGFnZSIsCisJCQkJICAgICJzY2F0aGVyLWdhdGhlciIsICJjb2hlcmVudCIsCisJCQkJ ICAgICJyZXNvdXJjZSIgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRpcjJuYW1lWzRdID0geyAi RE1BX0JJRElSRUNUSU9OQUwiLCAiRE1BX1RPX0RFVklDRSIsCiAJCQkJICAgIkRNQV9GUk9NX0RF VklDRSIsICJETUFfTk9ORSIgfTsKQEAgLTM5Nyw2ICszOTksOSBAQCBzdGF0aWMgdm9pZCBoYXNo X2J1Y2tldF9kZWwoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCiAKIHN0YXRpYyB1bnNp Z25lZCBsb25nIGxvbmcgcGh5c19hZGRyKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQog eworCWlmIChlbnRyeS0+dHlwZSA9PSBkbWFfZGVidWdfcmVzb3VyY2UpCisJCXJldHVybiBQSFlT X1BGTihlbnRyeS0+cGZuKSArIGVudHJ5LT5vZmZzZXQ7CisKIAlyZXR1cm4gcGFnZV90b19waHlz KHBmbl90b19wYWdlKGVudHJ5LT5wZm4pKSArIGVudHJ5LT5vZmZzZXQ7CiB9CiAKQEAgLTE0OTMs NiArMTQ5OCw0OSBAQCB2b2lkIGRlYnVnX2RtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2Ug KmRldiwgc2l6ZV90IHNpemUsCiB9CiBFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9mcmVlX2NvaGVy ZW50KTsKIAordm9pZCBkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwg cGh5c19hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgaW50IGRpcmVjdGlvbiwgZG1h X2FkZHJfdCBkbWFfYWRkcikKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwor CWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCWVudHJ5 ID0gZG1hX2VudHJ5X2FsbG9jKCk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuOworCisJZW50cnkt PnR5cGUJCT0gZG1hX2RlYnVnX3Jlc291cmNlOworCWVudHJ5LT5kZXYJCT0gZGV2OworCWVudHJ5 LT5wZm4JCT0gX19waHlzX3RvX3BmbihhZGRyKTsKKwllbnRyeS0+b2Zmc2V0CQk9IGFkZHIgLSBQ SFlTX1BGTihlbnRyeS0+cGZuKTsKKwllbnRyeS0+c2l6ZQkJPSBzaXplOworCWVudHJ5LT5kZXZf YWRkcgkJPSBkbWFfYWRkcjsKKwllbnRyeS0+ZGlyZWN0aW9uCT0gZGlyZWN0aW9uOworCWVudHJ5 LT5tYXBfZXJyX3R5cGUJPSBNQVBfRVJSX05PVF9DSEVDS0VEOworCisJYWRkX2RtYV9lbnRyeShl bnRyeSk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9tYXBfcmVzb3VyY2UpOworCit2b2lk IGRlYnVnX2RtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3Qg ZG1hX2FkZHIsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1 Y3QgZG1hX2RlYnVnX2VudHJ5IHJlZiA9IHsKKwkJLnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVn X3Jlc291cmNlLAorCQkuZGV2ICAgICAgICAgICAgPSBkZXYsCisJCS5kZXZfYWRkciAgICAgICA9 IGRtYV9hZGRyLAorCQkuc2l6ZSAgICAgICAgICAgPSBzaXplLAorCQkuZGlyZWN0aW9uICAgICAg PSBkaXJlY3Rpb24sCisJfTsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkp CisJCXJldHVybjsKKworCWNoZWNrX3VubWFwKCZyZWYpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1 Z19kbWFfdW5tYXBfcmVzb3VyY2UpOworCiB2b2lkIGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3Jf Y3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAogCQkJCSAgIHNp emVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewotLSAKMi44LjIKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBs aXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5v cmcvbWFpbG1hbi9saXN0aW5mby9pb21tdQ== 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:01 +0200 Subject: [PATCHv6 2/8] dma-debug: add support for resource mappings 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-3-git-send-email-niklas.soderlund+renesas@ragnatech.se> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org A MMIO mapped resource can not be represented by a struct page so a new debug type is needed to handle this. This patch add such type and functionality to add/remove entries and how to translate them to a physical address. Signed-off-by: Niklas S?derlund --- include/linux/dma-debug.h | 19 +++++++++++++++++ lib/dma-debug.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h index fe8cb61..c7d844f 100644 --- a/include/linux/dma-debug.h +++ b/include/linux/dma-debug.h @@ -56,6 +56,13 @@ extern void debug_dma_alloc_coherent(struct device *dev, size_t size, extern void debug_dma_free_coherent(struct device *dev, size_t size, void *virt, dma_addr_t addr); +extern void debug_dma_map_resource(struct device *dev, phys_addr_t addr, + size_t size, int direction, + dma_addr_t dma_addr); + +extern void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, int direction); + extern void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction); @@ -141,6 +148,18 @@ static inline void debug_dma_free_coherent(struct device *dev, size_t size, { } +static inline void debug_dma_map_resource(struct device *dev, phys_addr_t addr, + size_t size, int direction, + dma_addr_t dma_addr) +{ +} + +static inline void debug_dma_unmap_resource(struct device *dev, + dma_addr_t dma_addr, size_t size, + int direction) +{ +} + static inline void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction) diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 4a1515f..fb12d5c 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c @@ -43,6 +43,7 @@ enum { dma_debug_page, dma_debug_sg, dma_debug_coherent, + dma_debug_resource, }; enum map_err_types { @@ -150,8 +151,9 @@ static const char *const maperr2str[] = { [MAP_ERR_CHECKED] = "dma map error checked", }; -static const char *type2name[4] = { "single", "page", - "scather-gather", "coherent" }; +static const char *type2name[5] = { "single", "page", + "scather-gather", "coherent", + "resource" }; static const char *dir2name[4] = { "DMA_BIDIRECTIONAL", "DMA_TO_DEVICE", "DMA_FROM_DEVICE", "DMA_NONE" }; @@ -397,6 +399,9 @@ static void hash_bucket_del(struct dma_debug_entry *entry) static unsigned long long phys_addr(struct dma_debug_entry *entry) { + if (entry->type == dma_debug_resource) + return PHYS_PFN(entry->pfn) + entry->offset; + return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset; } @@ -1493,6 +1498,49 @@ void debug_dma_free_coherent(struct device *dev, size_t size, } EXPORT_SYMBOL(debug_dma_free_coherent); +void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size, + int direction, dma_addr_t dma_addr) +{ + struct dma_debug_entry *entry; + + if (unlikely(dma_debug_disabled())) + return; + + entry = dma_entry_alloc(); + if (!entry) + return; + + entry->type = dma_debug_resource; + entry->dev = dev; + entry->pfn = __phys_to_pfn(addr); + entry->offset = addr - PHYS_PFN(entry->pfn); + entry->size = size; + entry->dev_addr = dma_addr; + entry->direction = direction; + entry->map_err_type = MAP_ERR_NOT_CHECKED; + + add_dma_entry(entry); +} +EXPORT_SYMBOL(debug_dma_map_resource); + +void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, int direction) +{ + struct dma_debug_entry ref = { + .type = dma_debug_resource, + .dev = dev, + .dev_addr = dma_addr, + .size = size, + .direction = direction, + }; + + if (unlikely(dma_debug_disabled())) + return; + + check_unmap(&ref); +} +EXPORT_SYMBOL(debug_dma_unmap_resource); + void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, int direction) { -- 2.8.2