Non-cacheable memory
Justin (Gus) Hurwitz
ghurwitz at dyndns.com
Fri Aug 10 08:49:02 EST 2001
On Tue, 7 Aug 2001, Daris A Nevil wrote:
> Gus, Tom,
>
> Here is the procedure I used to allocate pages and mark them as non-cached in
> the 2.2.5 kernel (SNMC's QSLinux):
>
> mem_addr = __get_free_page(GFP_KERNEL);
> pte = va_to_pe(&init_task, mem_addr);
> pte_val(*pte) |= _PAGE_NO_CACHE;
> flush_tlb_page(current->mm_mmap, mem_addr);
>
> I used these pages for SCC buffer descriptors, so they were never returned to
> the system. I'm not sure if this is the preferred way, but it certainly works.
> I have not tried this in the 2.4 kernel yet. The functions __get_free_page()
> and flush_tlb_page() do exist in 2.4.4, but I could not locate va_to_pe() (I
> think that was a macro in 2.2.5).
>
> You may also want to look at the file linux/asm/pgalloc.h, esp. the functions
> get_pgd_slow() and get_pgd_fast().
Indeed, that does look quite like what I would expect to do. But, trust my
luck, it didn't work. I'm on a 2.4 kernel (a few weeks old from the devel
tree (2.4.7-pre6?). Here's how my code looks:
dev->mem_start = (int)__get_free_pages(GFP_KERNEL, 0);
#ifndef CONFIG_NO_DCACHE
{
/* This is where code goes to set the above allocated memory as
* non-cacheable. These lines DO NOT WORK right now. */
pte_t *pte = va_to_pte(dev->mem_start);
pte_val(*pte) |= _PAGE_NO_CACHE;
flush_tlb_page(init_mm.mmap, dev->mem_start);
}
#endif
Notes: CONFIG_NO_DCACHE is an option I added which disables the L1 cache
(no cache means no need for uncached memory :) Also, va_to_pte is in
arch/ppc/mm/fault.c, and is ifdef'd with a CONFIG_8xx. I altered that
ifdef to also include the function for my board.
I might also need to set the addresses 0x10710000 and 0x10718000 to be
non-cacheable (for MMIO with the chip). Would those addresses be in the
page table? And if not, thoughts on how to un-cache those areas (which are
each only a few bytes)?
Thanks,
--Gus
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list