Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753970Ab2HBGaX (ORCPT ); Thu, 2 Aug 2012 02:30:23 -0400 Received: from mail-lpp01m010-f46.google.com ([209.85.215.46]:49491 "EHLO mail-lpp01m010-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752773Ab2HBGaV convert rfc822-to-8bit (ORCPT ); Thu, 2 Aug 2012 02:30:21 -0400 MIME-Version: 1.0 In-Reply-To: References: <1340334073-17804-1-git-send-email-chenhc@lemote.com> <1340334073-17804-12-git-send-email-chenhc@lemote.com> <1340342704.1381.9.camel@tellur> Date: Thu, 2 Aug 2012 14:30:19 +0800 Message-ID: Subject: Re: [PATCH V3 11/16] drm/radeon: Make radeon card usable for Loongson. From: Huacai Chen To: Lucas Stach Cc: Ralf Baechle , linux-mips@linux-mips.org, Zhangjin Wu , Hua Yan , Fuxin Zhang , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Hongliang Tao , Huacai Chen Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6516 Lines: 150 Hi, Lucas, sorry for so long a delay because I have a holiday for one month. I found Loongson-3 must turn on SWIOTLB if the system memory has addresses above 4G. As I know, there are two ways to get a DMA addr, the first way is use dma_alloc_coherent(), and the other one is use map_page()/map_sg() on an exsisting address. The first way can make sure DMA addr below 4G, but the second way cannot (unless the memory is so little that all the address space is below 4G). Take SATA driver as an example, during initialization an 'ata_device' struct is allocated and its address is probably above 4G (because this is first used by CPU, not for DMA). 'ata_device' has a member 'id' and 'id' will be use for DMA in such a call path: ata_host_register() --> ata_scsi_add_hosts() --> async_port_probe() --> ata_port_probe() --> ata_bus_probe() --> ata_dev_read_id() --> ata_exec_internal() --> ata_exec_internal_sg() --> ata_qc_issue() --> ata_sg_setup() --> dma_map_sg() Here, dma_map_sg() will get a DMA addr above 4G, then SATA init failed. In OHCI driver, there are similar situations. P.S.: With recently drm changes, I found radeon with SWIOTLB can already work after suspend/resume, so my next version of Loongson patches will not modify radeon_ttm.c. On Fri, Jun 22, 2012 at 1:59 PM, Huacai Chen wrote: > On Fri, Jun 22, 2012 at 1:25 PM, Lucas Stach wrote: >> Hello Huacai, >> >> Am Freitag, den 22.06.2012, 11:01 +0800 schrieb Huacai Chen: >>> 1, Handle io prot correctly for MIPS. >>> 2, Define SAREA_MAX as the size of one page. >>> 3, Don't use swiotlb on Loongson machines (Loonson need swioitlb, but >>> when use swiotlb, GPU reset occurs at resume from suspend). >>> >> I still think this is wrong. You say Loongson needs SWIOTLB, but when >> it's actually used you ignore it in the radeon driver code. >> >> I looked up why you are using SWIOTLB and I don't agree with you that it >> is needed. SWIOTLB just gives you bounce pages for DMA memory above >> DMA32 and therefore papers over your >4GB DMA platform bug in some >> cases, while hurting performance. >> >> Please fix your DMA platform code so that region DMA is an alias for >> region DMA32. It should allow you to drop all those ugly workarounds. >> > Hmm, you are probably right, I think I should have a discuss with the > original author of this part of code. > >>> Signed-off-by: Huacai Chen >>> Signed-off-by: Hongliang Tao >>> Signed-off-by: Hua Yan >>> Reviewed-by: Michel D?nzer >>> Reviewed-by: Alex Deucher >>> Reviewed-by: Lucas Stach >>> Reviewed-by: j.glisse >> >> You should probably only stick this tag on your patches after the people >> you are naming explicitly gave their r-b for a specific version of a >> patch. >> >> Thanks, >> Lucas >>> Cc: dri-devel@lists.freedesktop.org >>> --- >>> drivers/gpu/drm/drm_vm.c | 2 +- >>> drivers/gpu/drm/radeon/radeon_ttm.c | 6 +++--- >>> drivers/gpu/drm/ttm/ttm_bo_util.c | 2 +- >>> include/drm/drm_sarea.h | 2 ++ >>> 4 files changed, 7 insertions(+), 5 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c >>> index 961ee08..3f06166 100644 >>> --- a/drivers/gpu/drm/drm_vm.c >>> +++ b/drivers/gpu/drm/drm_vm.c >>> @@ -62,7 +62,7 @@ static pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma) >>> tmp = pgprot_writecombine(tmp); >>> else >>> tmp = pgprot_noncached(tmp); >>> -#elif defined(__sparc__) || defined(__arm__) >>> +#elif defined(__sparc__) || defined(__arm__) || defined(__mips__) >>> tmp = pgprot_noncached(tmp); >>> #endif >>> return tmp; >>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c >>> index c94a225..f49bdd1 100644 >>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c >>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c >>> @@ -630,7 +630,7 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm) >>> } >>> #endif >>> >>> -#ifdef CONFIG_SWIOTLB >>> +#if defined(CONFIG_SWIOTLB) && !defined(CONFIG_CPU_LOONGSON3) >>> if (swiotlb_nr_tbl()) { >>> return ttm_dma_populate(>t->ttm, rdev->dev); >>> } >>> @@ -676,7 +676,7 @@ static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm) >>> } >>> #endif >>> >>> -#ifdef CONFIG_SWIOTLB >>> +#if defined(CONFIG_SWIOTLB) && !defined(CONFIG_CPU_LOONGSON3) >>> if (swiotlb_nr_tbl()) { >>> ttm_dma_unpopulate(>t->ttm, rdev->dev); >>> return; >>> @@ -906,7 +906,7 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev) >>> radeon_mem_types_list[i].show = &ttm_page_alloc_debugfs; >>> radeon_mem_types_list[i].driver_features = 0; >>> radeon_mem_types_list[i++].data = NULL; >>> -#ifdef CONFIG_SWIOTLB >>> +#if defined(CONFIG_SWIOTLB) && !defined(CONFIG_CPU_LOONGSON3) >>> if (swiotlb_nr_tbl()) { >>> sprintf(radeon_mem_types_names[i], "ttm_dma_page_pool"); >>> radeon_mem_types_list[i].name = radeon_mem_types_names[i]; >>> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c >>> index f8187ea..0df71ea 100644 >>> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c >>> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c >>> @@ -472,7 +472,7 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp) >>> else >>> tmp = pgprot_noncached(tmp); >>> #endif >>> -#if defined(__sparc__) >>> +#if defined(__sparc__) || defined(__mips__) >>> if (!(caching_flags & TTM_PL_FLAG_CACHED)) >>> tmp = pgprot_noncached(tmp); >>> #endif >>> diff --git a/include/drm/drm_sarea.h b/include/drm/drm_sarea.h >>> index ee5389d..1d1a858 100644 >>> --- a/include/drm/drm_sarea.h >>> +++ b/include/drm/drm_sarea.h >>> @@ -37,6 +37,8 @@ >>> /* SAREA area needs to be at least a page */ >>> #if defined(__alpha__) >>> #define SAREA_MAX 0x2000U >>> +#elif defined(__mips__) >>> +#define SAREA_MAX 0x4000U >>> #elif defined(__ia64__) >>> #define SAREA_MAX 0x10000U /* 64kB */ >>> #else >> >> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/