User buffers and cache flushing.

Greg Johnson gjohnson at research.canon.com.au
Thu Mar 16 13:40:40 EST 2000


Hi y'all,

The buffers I need to IDMA out to a peripheral are allocated by
the user with conventional malloc, and are rather dynamic so
the driver does not have a lot of control over them that I can
see.

So I have decided that I will be flushing the cache, either by
calling 'flush_page_to_ram' or 'flush_dcache_range'. Now, these
require a Kernel virtual address to work on (correct?), and the
caller has given me a User virtual address (through 'write (2)').
Therefore, before calling the flush function, I need to:

* Convert the User virtual address for each page to a Physical
  address by doing something along the lines of:

    pgd = pgd_offset(current->mm, addr)
    pmd = pmd_offset(pgd, addr)
    pte = pte_offset(pte, addr)
    etc.

* Convert the Physical address to a Kernel virtual address by
  calling 'phys_to_virt'.

Then I can call flush on each page I intend to IDMA out.

Does this sound reasonable?

Thanks

Greg.

Quoth Dan Malek:
>
>
> Greg Johnson wrote:
>
> > ....Since I
> > am not wanting to be double handling this data, and the data will
> > most likely be fragmented in memory,
>
> That's no problem, CPM buffer descriptors are made for that.
>
>
> > ....and call flush_dcache_range on each of these fragments.
>
> Depends upon how the data is handled.  In some cases I find it is
> faster to just map the pages uncached and skip the cache push.  Do
> some system design and analysis to determine what works best.
>
> > Have I overlooked anything? (other than the lack of support for IDMA
> > currently in the MPC8xx kernel)
>
> This is pretty trivial, considering all CPM devices use the same DMA
> engine as IDMA.  Take an existing driver, rip the guts of data comm
> out of it, and you nearly have the IDMA driver.
>
>
> 	-- Dan
>
>
>


--
+----------------------------------------------------+
| Do you want to know more?                          |
|               --== Greg Johnson ==--               |
| HW/SW Engineer      gjohnson at research.canon.com.au |
| Canon   Information  Systems   Research  Australia |
| 1 Thomas Holt Dr, North Ryde, NSW, 2113, Australia |
| "I FLEXed my BISON and it went YACC!" - me.        |
+----------------------------------------------------+

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-embedded mailing list