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).
Signed-off-by: Huacai Chen chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com 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
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.
Signed-off-by: Huacai Chen chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com
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
On Fri, Jun 22, 2012 at 1:25 PM, Lucas Stach dev@lynxeye.de 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 chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com
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
Hello Huacai,
On 22.06.2012 07:59, Huacai Chen wrote:
On Fri, Jun 22, 2012 at 1:25 PM, Lucas Stachdev@lynxeye.de wrote:
Hello Huacai,
Am Freitag, den 22.06.2012, 11:01 +0800 schrieb Huacai Chen:
[SNIP]
Signed-off-by: Huacai Chenchenhc@lemote.com Signed-off-by: Hongliang Taotaohl@lemote.com Signed-off-by: Hua Yanyanh@lemote.com Reviewed-by: Michel Dänzermichel@daenzer.net Reviewed-by: Alex Deucheralexdeucher@gmail.com Reviewed-by: Lucas Stachdev@lynxeye.de Reviewed-by: j.glissej.glisse@gmail.com
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.
Yes indeed, a "Reviewed-by" line usually means that the person giving you that line has read your code and has none or very few negative comments about it, e.g. something like "change this and that and then its "Reviewed-by: ....".
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
I would suggest to either split the patches into seperate ones for drm, ttm & radeon or change the subject line, cause a subject line starting with "drm/radeon..." usually means that you have only changed something in the radeon driver.
In the unlikely case that you broke someones else code it would be quite surprising that a patch with a subject line indicating only drm/radeon changes breaks common drm code.
Otherwise it is nice to know that only a few define changes gets the driver going on a complete different CPU platform, keep up with the good work.
Regards, Christian.
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
dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
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 chenhuacai@gmail.com wrote:
On Fri, Jun 22, 2012 at 1:25 PM, Lucas Stach dev@lynxeye.de 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 chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com
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
On Fri, Jun 22, 2012 at 1:25 PM, Lucas Stach dev@lynxeye.de 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.
Hi, Lucas, I disable SWIOTLB and still make sure DMA <4G, radeon and sound card seems work fine, but OHCI still can't work. From git log arch/mips/cavium-octeon/dma-octeon.c, it seems Cavium also need SWIOTLB to avoid OHCI issue.
Signed-off-by: Huacai Chen chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com
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
Hi,
Huacai Chen chenhuacai@gmail.com writes:
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).
Signed-off-by: Huacai Chen chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com 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);
btw, would it be a good idea to use uncached accelerated instead ?
Arnaud
On Fri, Jun 22, 2012 at 5:39 PM, Arnaud Patard arnaud.patard@rtp-net.org wrote:
Hi,
Huacai Chen chenhuacai@gmail.com writes:
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).
Signed-off-by: Huacai Chen chenhc@lemote.com Signed-off-by: Hongliang Tao taohl@lemote.com Signed-off-by: Hua Yan yanh@lemote.com Reviewed-by: Michel Dänzer michel@daenzer.net Reviewed-by: Alex Deucher alexdeucher@gmail.com Reviewed-by: Lucas Stach dev@lynxeye.de Reviewed-by: j.glisse j.glisse@gmail.com 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);
btw, would it be a good idea to use uncached accelerated instead ?
I have tried uncached accelerated, there will be random points in the monitor, it seems a hw issue...
Arnaud
On Fri, Jun 22, 2012 at 06:55:40PM +0800, Huacai Chen wrote:
btw, would it be a good idea to use uncached accelerated instead ?
I have tried uncached accelerated, there will be random points in the monitor, it seems a hw issue...
Have you flushed the pages from memory before switching their cache mode to uncached accelerated? The MIPS architecture defines the result of mixing cache modes as UNPREDICTABLE so be careful to flush caches before switching cache mode of a page.
Ralf
On Fri, Jun 22, 2012 at 7:11 PM, Ralf Baechle ralf@linux-mips.org wrote:
On Fri, Jun 22, 2012 at 06:55:40PM +0800, Huacai Chen wrote:
btw, would it be a good idea to use uncached accelerated instead ?
I have tried uncached accelerated, there will be random points in the monitor, it seems a hw issue...
Have you flushed the pages from memory before switching their cache mode to uncached accelerated? The MIPS architecture defines the result of mixing cache modes as UNPREDICTABLE so be careful to flush caches before switching cache mode of a page.
Not because of flushing, CPU designing team told us a method but very complex, and that method will cause other performance drop. So, we won't use uncached accelerate mode.
Ralf
On Fri, Jun 22, 2012 at 11:39:19AM +0200, Arnaud Patard wrote:
--- 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);
btw, would it be a good idea to use uncached accelerated instead ?
Not unconditionally. Only some MIPS cores support uncached accelerated. Basically you can only assume that cache modes 2 (uncached) (3 cachable non-coherent) are supported. On a SMP system use of 2 and 3 may be unwise (SGI IP27 and IP35 may throw obscure exceptions to indicate their dislike of these.) and on multi-processor systems there is mode 5, which is cachable coherent.
The necessary logic is too complex to got into drm_io_prot() which already is an #ifdef mess anyway so that function should be changed to call some sort of architecutre specific hook so that function should be changed to call some sort of architecture specific hook...
Ralf
dri-devel@lists.freedesktop.org