cache.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armo/cache.h
  3.  *
  4.  *  Copyright (C) 1999-2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Cache handling for 26-bit ARM processors.
  11.  */
  12. #define flush_cache_all() do { } while (0)
  13. #define flush_cache_mm(mm) do { } while (0)
  14. #define flush_cache_range(mm,start,end) do { } while (0)
  15. #define flush_cache_page(vma,vmaddr) do { } while (0)
  16. #define flush_page_to_ram(page) do { } while (0)
  17. #define invalidate_dcache_range(start,end) do { } while (0)
  18. #define clean_dcache_range(start,end) do { } while (0)
  19. #define flush_dcache_range(start,end) do { } while (0)
  20. #define flush_dcache_page(page) do { } while (0)
  21. #define clean_dcache_entry(_s)      do { } while (0)
  22. #define clean_cache_entry(_start) do { } while (0)
  23. #define flush_icache_range(start,end) do { } while (0)
  24. #define flush_icache_page(vma,page) do { } while (0)
  25. /* DAG: ARM3 will flush cache on MEMC updates anyway? so don't bother */
  26. #define clean_cache_area(_start,_size) do { } while (0)
  27. /*
  28.  * TLB flushing:
  29.  *
  30.  *  - flush_tlb_all() flushes all processes TLBs
  31.  *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
  32.  *  - flush_tlb_page(vma, vmaddr) flushes one page
  33.  *  - flush_tlb_range(mm, start, end) flushes a range of pages
  34.  */
  35. #define flush_tlb_all() memc_update_all()
  36. #define flush_tlb_mm(mm) memc_update_mm(mm)
  37. #define flush_tlb_range(mm,start,end)
  38. do { memc_update_mm(mm); (void)(start); (void)(end); } while (0)
  39. #define flush_tlb_page(vma, vmaddr) do { } while (0)
  40. /*
  41.  * The following handle the weird MEMC chip
  42.  */
  43. static inline void memc_update_all(void)
  44. {
  45. struct task_struct *p;
  46. cpu_memc_update_all(init_mm.pgd);
  47. for_each_task(p) {
  48. if (!p->mm)
  49. continue;
  50. cpu_memc_update_all(p->mm->pgd);
  51. }
  52. processor._set_pgd(current->active_mm->pgd);
  53. }
  54. static inline void memc_update_mm(struct mm_struct *mm)
  55. {
  56. cpu_memc_update_all(mm->pgd);
  57. if (mm == current->active_mm)
  58. processor._set_pgd(mm->pgd);
  59. }
  60. static inline void
  61. memc_clear(struct mm_struct *mm, struct page *page)
  62. {
  63. cpu_memc_update_entry(mm->pgd, (unsigned long) page_address(page), 0);
  64. if (mm == current->active_mm)
  65. processor._set_pgd(mm->pgd);
  66. }
  67. static inline void
  68. memc_update_addr(struct mm_struct *mm, pte_t pte, unsigned long vaddr)
  69. {
  70. cpu_memc_update_entry(mm->pgd, pte_val(pte), vaddr);
  71. if (mm == current->active_mm)
  72. processor._set_pgd(mm->pgd);
  73. }
  74. static inline void
  75. update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
  76. {
  77. struct mm_struct *mm = vma->vm_mm;
  78. memc_update_addr(mm, pte, addr);
  79. }