• John David Anglin's avatar
    parisc: Rewrite cache flush code for PA8800/PA8900 · 2de8b4cc
    John David Anglin authored
    Originally, I was convinced that we needed to use tmpalias flushes
    everwhere, for both user and kernel flushes. However, when I modified
    flush_kernel_dcache_page_addr, to use a tmpalias flush, my c8000
    would crash quite early when booting.
    
    The PDC returns alias values of 0 for the icache and dcache. This
    indicates that either the alias boundary is greater than 16MB or
    equivalent aliasing doesn't work. I modified the tmpalias code to
    make it easy to try alternate boundaries. I tried boundaries up to
    128MB but still kernel tmpalias flushes didn't work on c8000.
    
    This led me to conclude that tmpalias flushes don't work on PA8800
    and PA8900 machines, and that we needed to flush directly using the
    virtual address of user and kernel pages. This is likely the major
    cause of instability on the c8000 and rp34xx machines.
    
    Flushing user pages requires doing a temporary context switch as we
    have to flush pages that don't belong to the current context. Further,
    we have to deal with pages that aren't present. If a page isn't
    present, the flush instructions fault on every line.
    
    Other code has been rearranged and simplified based on testing. For
    example, I introduced a flush_cache_dup_mm routine. flush_cache_mm
    and flush_cache_dup_mm differ in that flush_cache_mm calls
    purge_cache_pages and flush_cache_dup_mm calls flush_cache_pages.
    In some implementations, pdc is more efficient than fdc. Based on
    my testing, I don't believe there's any performance benefit on the
    c8000.
    Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    2de8b4cc
page.h 5.49 KB