pcxl_dma_ops.alloc_noncoherent = pa11_dma_alloc_consistent?
duplicate pa11_dma_alloc_consistent; more appropriate appears pa11_dma_alloc_noncoherent here.
Not tested, please confirm that this fix is correct
---
fix noncoherent allocation
---
arch/parisc/kernel/pci-dma.c +1 -1
@@ -549,7 +549,7 @@ static void pa11_dma_sync_sg_for_device(struct device *dev, struct scatterlist *struct hppa_dma_ops pcxl_dma_ops = { .dma_supported = pa11_dma_supported, .alloc_consistent = pa11_dma_alloc_consistent, - .alloc_noncoherent = pa11_dma_alloc_consistent, + .alloc_noncoherent = pa11_dma_alloc_noncoherent, .free_consistent = pa11_dma_free_consistent, .map_single = pa11_dma_map_single, .unmap_single = pa11_dma_unmap_single,
Quoted 4 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.Not tested, please confirm that this fix is correct
I don't think it is. The memories are fading, so I don't recall why it is we do it this way, but I'm pretty sure it's correct the way it is.
Signature · 4 lines
Intel are signing my paycheques ... these opinions are still mine "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step."
James Bottomley
maintainerQuoted 4 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.Not tested, please confirm that this fix is correct
No, it looks completely incorrect to me. What makes you think a pcxl box has a problem with coherency?
James
Quoted 9 lines · Matthew Wilcox
Quoted 4 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.Not tested, please confirm that this fix is correct
I don't think it is. The memories are fading, so I don't recall why it is we do it this way, but I'm pretty sure it's correct the way it is.
Maybe this helps a bit: later I found that something similar occurs in drivers/parisc/{ccio-dma.c, sba_iommu.c}:
1010: .alloc_consistent = ccio_alloc_consistent,
.alloc_noncoherent = ccio_alloc_consistent,
1036: .alloc_consistent = sba_alloc_consistent,
.alloc_noncoherent = sba_alloc_consistent,
However in these files the functions {ccio_alloc, sba_alloc}_noncoherent do not exist.
James Bottomley
maintainerQuoted 8 lines · Matthew Wilcox
Quoted 4 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.Not tested, please confirm that this fix is correct
I don't think it is. The memories are fading, so I don't recall why it is we do it this way, but I'm pretty sure it's correct the way it is.
dma_alloc_noncoherent is a fallback for boxes with coherency problems which cannot allocate coherent memory. The API asks for coherent memory but the driver promises to behave correctly even if an incoherent area is returned. dma_alloc_coherent() requires only coherent memory. The pcx boxes (PA7200 and below) can't do the uncached trick for coherent memory, so the API is designed for them. The PCXL can, so we allocate coherent memory even for dma_alloc_noncoherent() in that case (and nop out the coherency handlers the driver uses).
James
Quoted 8 lines · James Bottomley
Quoted 4 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.Not tested, please confirm that this fix is correct
No, it looks completely incorrect to me. What makes you think a pcxl box has a problem with coherency?
Ok, please ignore the patch then. It just appeared suspicious to me that the function did exist, but the names assigned were different.
Re: [PATCH?][arch/parisc/kernel/pci-dma.c] pcxl_dma_ops.alloc_noncoherent
Quoted 5 lines
Quoted 4 lines · James Bottomley
Quoted 3 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Not tested, please confirm that this fix is correct
No, it looks completely incorrect to me. What makes you think a pcxl box has a problem with coherency?
Ok, please ignore the patch then. It just appeared suspicious to me that the function did exist, but the names assigned were different.
How about a comment?
Dave
Signature · 2 lines
J. David Anglin [email protected] National Research Council of Canada (613) 990-0752 (FAX: 952-6602)
Re: [PATCH?][arch/parisc/kernel/pci-dma.c] pcxl_dma_ops.alloc_noncoherent
Quoted 5 lines · John David Anglin
Quoted 5 lines
Quoted 4 lines · James Bottomley
Quoted 3 lines · Roel Kluin
duplicate
pa11_dma_alloc_consistent; more appropriate appearspa11_dma_alloc_noncoherenthere.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Not tested, please confirm that this fix is correct
No, it looks completely incorrect to me. What makes you think a pcxl box has a problem with coherency?
Ok, please ignore the patch then. It just appeared suspicious to me that the function did exist, but the names assigned were different.
How about a comment?
Based on James Bottomley's explanation maybe a comment like this?
---
Explain why dma_alloc_noncoherent is only used for boxes PA7200 and below
---
arch/parisc/kernel/pci-dma.c +8 -0
@@ -567,6 +567,10 @@ static void *fail_alloc_consistent(struct device *dev, size_t size,return NULL ; } +/* +* dma_alloc_noncoherent is a fallback for boxes PA7200 and below which +* cannot allocate coherent memory. +*/ static void *pa11_dma_alloc_noncoherent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag) {
@@ -586,6 +590,10 @@ static void pa11_dma_free_noncoherent(struct device *dev, size_t size,return ; } +/* +* PCXL allocates coherent memory even for dma_alloc_noncoherent() due to the +* uncached trick for coherent memory. +*/ struct hppa_dma_ops pcx_dma_ops = { .dma_supported = pa11_dma_supported, .alloc_consistent = fail_alloc_consistent,
Re: [PATCH?][arch/parisc/kernel/pci-dma.c] pcxl_dma_ops.alloc_noncoherent
arch/parisc/kernel/pci-dma.c static void *fail_alloc_consistent(struct device *dev, size_t size, · line 576
Quoted 7 lines · Roel Kluin
arch/parisc/kernel/pci-dma.c +4
-0+/* +* dma_alloc_noncoherent is a fallback for boxes PA7200 and below which +* cannot allocate coherent memory. +*/ static void *pa11_dma_alloc_noncoherent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag) {
Why? This is located below pcxl_dma_ops so its obviously only relevant for pcx.
arch/parisc/kernel/pci-dma.c static void pa11_dma_free_noncoherent(struct device *dev, size_t size, · line 596
Quoted 8 lines
arch/parisc/kernel/pci-dma.c +4
-0@@ -586,6 +590,10 @@ static void pa11_dma_free_noncoherent(struct device *dev, size_t size,return ; } +/* +* PCXL allocates coherent memory even for dma_alloc_noncoherent() due to the +* uncached trick for coherent memory. +*/
This isn't correct either.
Quoted 4 lines
arch/parisc/kernel/pci-dma.c +0
-0struct hppa_dma_ops pcx_dma_ops = { .dma_supported = pa11_dma_supported, .alloc_consistent = fail_alloc_consistent,
Quoted 1 line · Roel Kluin
How about just doing something like this:
arch/parisc/kernel/pci-dma.c +9 -9
@@ -409,7 +409,7 @@ pcxl_dma_init(void)__initcall (pcxl_dma_init); -static void *pa11_dma_alloc_consistent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag) +static void *pcxl_dma_alloc_consistent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag) {unsigned long vaddr;unsigned long paddr;
@@ -435,7 +435,7 @@ static void * pa11_dma_alloc_consistent (struct device *dev, size_t size, dma_adreturn (void *)vaddr; } -static void pa11_dma_free_consistent (struct device *dev,size_t size,void *vaddr,dma_addr_t dma_handle) +static void pcxl_dma_free_consistent (struct device *dev,size_t size,void *vaddr,dma_addr_t dma_handle) {int order;
@@ -548,9 +548,9 @@ static void pa11_dma_sync_sg_for_device(struct device *dev, struct scatterlist *struct hppa_dma_ops pcxl_dma_ops = { .dma_supported = pa11_dma_supported, - .alloc_consistent = pa11_dma_alloc_consistent, - .alloc_noncoherent = pa11_dma_alloc_consistent, - .free_consistent = pa11_dma_free_consistent, + .alloc_consistent = pcxl_dma_alloc_consistent, + .alloc_noncoherent = pcxl_dma_alloc_consistent, + .free_consistent = pcxl_dma_free_consistent, .map_single = pa11_dma_map_single, .unmap_single = pa11_dma_unmap_single, .map_sg = pa11_dma_map_sg,
@@ -567,7 +567,7 @@ static void *fail_alloc_consistent(struct device *dev, size_t size,return NULL ; } -static void *pa11_dma_alloc_noncoherent (struct device *dev,size_t size, +static void *pcx_dma_alloc_noncoherent (struct device *dev,size_t size,dma_addr_t *dma_handle,gfp_t flag) {void *addr;
@@ -579,7 +579,7 @@ static void *pa11_dma_alloc_noncoherent(struct device *dev, size_t size,return addr; } -static void pa11_dma_free_noncoherent (struct device *dev,size_t size, +static void pcx_dma_free_noncoherent (struct device *dev,size_t size,void *vaddr,dma_addr_t iova) {free_pages ((unsigned long )vaddr,get_order (size));
@@ -589,8 +589,8 @@ static void pa11_dma_free_noncoherent(struct device *dev, size_t size,struct hppa_dma_ops pcx_dma_ops = { .dma_supported = pa11_dma_supported, .alloc_consistent = fail_alloc_consistent, - .alloc_noncoherent = pa11_dma_alloc_noncoherent, - .free_consistent = pa11_dma_free_noncoherent, + .alloc_noncoherent = pcx_dma_alloc_noncoherent, + .free_consistent = pcx_dma_free_noncoherent, .map_single = pa11_dma_map_single, .unmap_single = pa11_dma_unmap_single, .map_sg = pa11_dma_map_sg,