From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: ARC-Seal: i=1; a=rsa-sha256; t=1516758455; cv=none; d=google.com; s=arc-20160816; b=KKW+bP9ZOHt1os0qFjk695l8HX3AETBCdpygNaY3FEsqCDb64NTn1FC4QZIScsk5ey YGfZnYH1pzwv7fajiAYZLwOy3PVWXhAC11+Qd1BZlT+k4TI97z1Yx77qAeHpZ9qH0LTU 4fuoHD0rzvTZe3ekoUsEyaNCalVVGpotGbh4QB9Cg4Xg2kR3sEjgTED+pbzJsrJeZfC0 CO/qzXyJHwYrJISKWhbe2XkoOwAGCoa3xuYUkRcCo6tEcyh3rabtx1wi9CCaMS/swMUr IxI8JvR/dCR1/sZ4FhtuI9Jsnvbz9DWGZMFw+kLRXNnLBR2wnYlmx/UY0ztZ1+wpw32h spww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=+6rqXv9AXTcBwc+TsrwbZvOmQ4mk4O2j8RbNBCpW2Xc=; b=idOCVhZ8XKDGe9EoBL+ESlkg2OeM68v0dPb5IREA1YA2+nrIKnaXMwXizZdSirarCl rzm/ZLBGZfthtapeR0A0EPmm8jRSHQD9p7QvSpv47nu8BDHna0aXz/UpeH+GJKBzd/9c dlEb7YXqemzV3dqI+NsuxSETq+jb5XDzmac/oEg3SmliMGNvevAl7FSGd46SXvjtqmob ySbEyLJSNQ7/HaFMRO/bVvAobPYwszvZ9j4JKvS9oQ5lG3wTq4n0lP7Y4FoBGLxTazFJ sN4+/7U5VUto13YXuqXtuC5J6Qa9p9muA4ZFLn7mkwv0Gi9f+kEFfQbWkc3evGC3NTUx HPdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=V8/l4EQk; spf=pass (google.com: domain of f.fainelli@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=f.fainelli@gmail.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=V8/l4EQk; spf=pass (google.com: domain of f.fainelli@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=f.fainelli@gmail.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com X-Google-Smtp-Source: AH8x2274TK/aTQNKDg18boJtiaKmSezB7DAKrA0uUCXZrVv3IPCU9CdJkNDmOOO94/FFfot897lgHw== From: Florian Fainelli To: linux-mips@linux-mips.org Cc: Florian Fainelli , Florian Fainelli , Ralf Baechle , Kevin Cernekee , James Hogan , Paul Burton , Matt Redfearn , "Maciej W. Rozycki" , Huacai Chen , Kate Stewart , Greg Kroah-Hartman , Marcin Nowakowski , Andrew Morton , "Eric W. Biederman" , Ingo Molnar , David Howells , Kees Cook , Thomas Meyer , "Bryan O'Donoghue" , Robin Murphy , Michal Hocko , Lucas Stach , Vladimir Murzin , Bart Van Assche , linux-kernel@vger.kernel.org (open list) Subject: [PATCH RFC 2/6] MIPS: Allow platforms to override mapping/unmapping coherent Date: Tue, 23 Jan 2018 17:47:02 -0800 Message-Id: <1516758426-8127-3-git-send-email-f.fainelli@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516758426-8127-1-git-send-email-f.fainelli@gmail.com> References: <1516758426-8127-1-git-send-email-f.fainelli@gmail.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1590436514603234672?= X-GMAIL-MSGID: =?utf-8?q?1590436514603234672?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: Florian Fainelli In preparation for allowing support for Broadcom's eXtended Kseg0/1 feature, allow platforms to override how coherent DMA mappings are done by providing plat_map_coherent() and plat_unmap_coherent() hooks, which default to the current implementation with CAC/UNCAC unless changed. Signed-off-by: Florian Fainelli --- arch/mips/include/asm/mach-generic/dma-coherence.h | 16 ++++++++++++++++ arch/mips/mm/dma-default.c | 10 +++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/arch/mips/include/asm/mach-generic/dma-coherence.h b/arch/mips/include/asm/mach-generic/dma-coherence.h index e6e7dfa15801..42a1546e7d10 100644 --- a/arch/mips/include/asm/mach-generic/dma-coherence.h +++ b/arch/mips/include/asm/mach-generic/dma-coherence.h @@ -98,4 +98,20 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) #endif #endif /* CONFIG_SWIOTLB */ +#ifndef plat_map_coherent +static inline int plat_map_coherent(dma_addr_t handle, void *cac_va, size_t size, + void **uncac_va, gfp_t gfp) +{ + *uncac_va = UNCAC_ADDR(cac_va); + return 0; +} +#endif + +#ifndef plat_unmap_coherent +static inline void *plat_unmap_coherent(void *addr) +{ + return CAC_ADDR(addr); +} +#endif + #endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */ diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index e3e94d05f0fd..f82f00dcc841 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c @@ -151,7 +151,11 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size, if (!(attrs & DMA_ATTR_NON_CONSISTENT) && !plat_device_is_coherent(dev)) { dma_cache_wback_inv((unsigned long) ret, size); - ret = UNCAC_ADDR(ret); + if (plat_map_coherent(*dma_handle, ret, PFN_ALIGN(size), + &ret, gfp)) { + free_pages((unsigned long)ret, size); + ret = NULL; + } } return ret; @@ -167,7 +171,7 @@ static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr, plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL); if (!(attrs & DMA_ATTR_NON_CONSISTENT) && !plat_device_is_coherent(dev)) - addr = CAC_ADDR(addr); + addr = (unsigned long)plat_unmap_coherent(vaddr); page = virt_to_page((void *) addr); @@ -187,7 +191,7 @@ static int mips_dma_mmap(struct device *dev, struct vm_area_struct *vma, int ret = -ENXIO; if (!plat_device_is_coherent(dev)) - addr = CAC_ADDR(addr); + addr = (unsigned long)plat_unmap_coherent((void *)addr); pfn = page_to_pfn(virt_to_page((void *)addr)); -- 2.7.4