2003-09-09 09:09:47

by Dmytro Bablinyuk

[permalink] [raw]
Subject: Problem with remap_page_range


We have a DSP shared memory which we should access (from PowerPC).
The problem is when I do ioremap I can see the memory correctly from the
driver (see below) but when I do remap_page_range to the user space
application then data appears to be wrong, I can recognize some values
there, but they are in the wrong places and other values around from
everywhere else (see below).

I tried mem_map_reserve - but still without luck.

Could somebody please give me a clue on this.

Thank you very much in advance for any help.

Below: the dsp_area prints correct values from DSP RAM but remap_page_range does not work properly.

dsp_ptr=ioremap_nocache( DSP_ADDR, WINDOW_SIZE);
dsp_area=(ushort *)(((unsigned long)dsp_ptr + PAGE_SIZE -1) &
PAGE_MASK);
/* for (virt_addr=(unsigned long)dsp_area; virt_addr<(unsigned
long)dsp_area+WINDOW_SIZE; */
/* virt_addr+=PAGE_SIZE) { */
/* /\* reserve all pages to make them remapable *\/ */
/* mem_map_reserve(virt_to_page(virt_addr)); */
/* } */

printk("dsp_area[0]=%04x\n", dsp_area[0]); //prints correct values
...
vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO | VM_RESERVED);

if (remap_page_range(vma->vm_start,
DSP_ADDR,
size,
vma->vm_page_prot
))
{
printk("remap page range failed\n");
return -ENXIO;
}

Here is the ouput:
//correct from the driver
dsp_area[0]=0000
dsp_area[1]=bc00
dsp_area[2]=eb17
dsp_area[3]=2643
dsp_area[4]=54cd
dsp_area[5]=5405
dsp_area[6]=91ba
dsp_area[7]=49c2
dsp_area[8]=1f61
hpi_mmap: vma->vm_start=3006f000, vma->vm_end=30097000
vma->vm_flags=864fb

//wrong from the user space application
kadr=0x3006f000
kadr[0]=1c59
kadr[1]=49c2
kadr[2]=5405
kadr[3]=bc00
kadr[4]=49c2
kadr[5]=54cd
kadr[6]=bc00
kadr[7]=54cd




2003-09-09 09:59:36

by Jamie Lokier

[permalink] [raw]
Subject: Re: Problem with remap_page_range

Dmytro Bablinyuk wrote:
> if (remap_page_range(vma->vm_start,

Try io_remap_page_range() instead?

-- Jamie

2003-09-09 10:15:12

by Dmytro Bablinyuk

[permalink] [raw]
Subject: Re: Problem with remap_page_range

>
>
>Try io_remap_page_range() instead?
>
>
I just tried - the problem remains, but what is interesting:

Correct values (driver):

dsp_area[0]=91ba
dsp_area[1]=bc00
dsp_area[2]=eb17
dsp_area[3]=2643
dsp_area[4]=54cd
dsp_area[5]=5405
dsp_area[6]=91ba
dsp_area[7]=49c2
dsp_area[8]=1f61

Wrong values (application):

kadr[0]=1c59
kadr[1]=5405
kadr[2]=1f61
kadr[3]=49c2
kadr[4]=49c2
kadr[5]=eb17
kadr[6]=1f61
kadr[7]=2643


It's looks like application has some correct values but it's kind of mess.
What else could be wrong?

Thank you very much

2003-09-09 17:02:54

by Matt Porter

[permalink] [raw]
Subject: Re: Problem with remap_page_range

On Tue, Sep 09, 2003 at 09:13:49PM -0400, Dmytro Bablinyuk wrote:
>
> We have a DSP shared memory which we should access (from PowerPC).
> The problem is when I do ioremap I can see the memory correctly from the
> driver (see below) but when I do remap_page_range to the user space
> application then data appears to be wrong, I can recognize some values
> there, but they are in the wrong places and other values around from
> everywhere else (see below).

<snip>

> if (remap_page_range(vma->vm_start,
> DSP_ADDR,
> size,
> vma->vm_page_prot
> ))

Your remap call isn't adding _PAGE_NO_CACHE and _PAGE_GUARDED flags
like ioremap_nocache()/ioremap() do on PPC. You'll get bad results
because of the ordering and cache issues resulting from not using
these PTE flags. In 2.6, these can be added using pgprot_noncached()
that is defined per-arch.

BTW, ioremap_nocache() and ioremap() are identical on PPC.

-Matt

2003-09-09 17:04:57

by Matt Porter

[permalink] [raw]
Subject: Re: Problem with remap_page_range

On Tue, Sep 09, 2003 at 10:59:26AM +0100, Jamie Lokier wrote:
> Dmytro Bablinyuk wrote:
> > if (remap_page_range(vma->vm_start,
>
> Try io_remap_page_range() instead?

These are identical on PPC.

-Matt

2003-09-09 21:51:54

by Dmytro Bablinyuk

[permalink] [raw]
Subject: Re: Problem with remap_page_range

>
>
>> if (remap_page_range(vma->vm_start,
>> DSP_ADDR,
>> size,
>> vma->vm_page_prot
>> ))
>>
>>
>
>Your remap call isn't adding _PAGE_NO_CACHE and _PAGE_GUARDED flags
>like ioremap_nocache()/ioremap() do on PPC. You'll get bad results
>because of the ordering and cache issues resulting from not using
>these PTE flags. In 2.6, these can be added using pgprot_noncached()
>that is defined per-arch.
>
>
>
Thank you Matt,

Coud you please give me en example on how to add these flags to remap in
kernel 2.4.21 (powerpc).
It seems I could not find these flags available in my kernel.

Thank you very much



2003-09-09 22:06:38

by Matt Porter

[permalink] [raw]
Subject: Re: Problem with remap_page_range

On Wed, Sep 10, 2003 at 09:54:20AM +1200, Dmytro Bablinyuk wrote:
> >
> >
> >> if (remap_page_range(vma->vm_start,
> >> DSP_ADDR,
> >> size,
> >> vma->vm_page_prot
> >> ))
> >>
> >>
> >
> >Your remap call isn't adding _PAGE_NO_CACHE and _PAGE_GUARDED flags
> >like ioremap_nocache()/ioremap() do on PPC. You'll get bad results
> >because of the ordering and cache issues resulting from not using
> >these PTE flags. In 2.6, these can be added using pgprot_noncached()
> >that is defined per-arch.
> >
> >
> >
> Thank you Matt,
>
> Coud you please give me en example on how to add these flags to remap in
> kernel 2.4.21 (powerpc).
> It seems I could not find these flags available in my kernel.

They're defined in include/asm-ppc/pgtable.h

-Matt