flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn)
 {
        if (pfn_valid(pfn)) {
+               flush_tlb_page(vma, vmaddr);
                if (likely(vma->vm_mm->context.space_id)) {
-                       flush_tlb_page(vma, vmaddr);
                        __flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
                } else {
                        __purge_cache_page(vma, vmaddr, PFN_PHYS(pfn));
 {
        unsigned long start = (unsigned long)vaddr;
        unsigned long end = start + size;
+       unsigned long flags, physaddr;
 
        if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
            (unsigned long)size >= parisc_cache_flush_threshold) {
                return;
        }
 
-       flush_kernel_dcache_range_asm(start, end);
-       flush_tlb_kernel_range(start, end);
+       while (start < end) {
+               physaddr = lpa(start);
+               purge_tlb_start(flags);
+               pdtlb(SR_KERNEL, start);
+               purge_tlb_end(flags);
+               flush_dcache_page_asm(physaddr, start);
+               start += PAGE_SIZE;
+       }
 }
 EXPORT_SYMBOL(flush_kernel_vmap_range);
 
 {
        unsigned long start = (unsigned long)vaddr;
        unsigned long end = start + size;
+       unsigned long flags, physaddr;
 
        if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
            (unsigned long)size >= parisc_cache_flush_threshold) {
                return;
        }
 
-       purge_kernel_dcache_range_asm(start, end);
-       flush_tlb_kernel_range(start, end);
+       while (start < end) {
+               physaddr = lpa(start);
+               purge_tlb_start(flags);
+               pdtlb(SR_KERNEL, start);
+               purge_tlb_end(flags);
+               purge_dcache_page_asm(physaddr, start);
+               start += PAGE_SIZE;
+       }
 }
 EXPORT_SYMBOL(invalidate_kernel_vmap_range);