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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/cpu-multi32.h
  3.  *
  4.  *  Copyright (C) 2000 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. #ifndef __ASSEMBLY__
  11. #include <asm/memory.h>
  12. #include <asm/page.h>
  13. /* forward-declare task_struct */
  14. struct task_struct;
  15. /*
  16.  * Don't change this structure - ASM code
  17.  * relies on it.
  18.  */
  19. extern struct processor {
  20. /* MISC
  21.  * get data abort address/flags
  22.  */
  23. void (*_data_abort)(unsigned long pc);
  24. /*
  25.  * check for any bugs
  26.  */
  27. void (*_check_bugs)(void);
  28. /*
  29.  * Set up any processor specifics
  30.  */
  31. void (*_proc_init)(void);
  32. /*
  33.  * Disable any processor specifics
  34.  */
  35. void (*_proc_fin)(void);
  36. /*
  37.  * Special stuff for a reset
  38.  */
  39. volatile void (*reset)(unsigned long addr);
  40. /*
  41.  * Idle the processor
  42.  */
  43. int (*_do_idle)(int mode);
  44. /*
  45.  * Processor architecture specific
  46.  */
  47. struct { /* CACHE */
  48. /*
  49.  * flush all caches
  50.  */
  51. void (*clean_invalidate_all)(void);
  52. /*
  53.  * flush a specific page or pages
  54.  */
  55. void (*clean_invalidate_range)(unsigned long address, unsigned long end, int flags);
  56. /*
  57.  * flush a page to RAM
  58.  */
  59. void (*_flush_ram_page)(void *virt_page);
  60. } cache;
  61. struct { /* D-cache */
  62. /*
  63.  * invalidate the specified data range
  64.  */
  65. void (*invalidate_range)(unsigned long start, unsigned long end);
  66. /*
  67.  * clean specified data range
  68.  */
  69. void (*clean_range)(unsigned long start, unsigned long end);
  70. /*
  71.  * obsolete flush cache entry
  72.  */
  73. void (*clean_page)(void *virt_page);
  74. /*
  75.  * clean a virtual address range from the
  76.  * D-cache without flushing the cache.
  77.  */
  78. void (*clean_entry)(unsigned long start);
  79. } dcache;
  80. struct { /* I-cache */
  81. /*
  82.  * invalidate the I-cache for the specified range
  83.  */
  84. void (*invalidate_range)(unsigned long start, unsigned long end);
  85. /*
  86.  * invalidate the I-cache for the specified virtual page
  87.  */
  88. void (*invalidate_page)(void *virt_page);
  89. } icache;
  90. struct { /* TLB */
  91. /*
  92.  * flush all TLBs
  93.  */
  94. void (*invalidate_all)(void);
  95. /*
  96.  * flush a specific TLB
  97.  */
  98. void (*invalidate_range)(unsigned long address, unsigned long end);
  99. /*
  100.  * flush a specific TLB
  101.  */
  102. void (*invalidate_page)(unsigned long address, int flags);
  103. } tlb;
  104. struct { /* PageTable */
  105. /*
  106.  * Set the page table
  107.  */
  108. void (*set_pgd)(unsigned long pgd_phys);
  109. /*
  110.  * Set a PMD (handling IMP bit 4)
  111.  */
  112. void (*set_pmd)(pmd_t *pmdp, pmd_t pmd);
  113. /*
  114.  * Set a PTE
  115.  */
  116. void (*set_pte)(pte_t *ptep, pte_t pte);
  117. } pgtable;
  118. } processor;
  119. extern const struct processor arm6_processor_functions;
  120. extern const struct processor arm7_processor_functions;
  121. extern const struct processor sa110_processor_functions;
  122. #define cpu_data_abort(pc) processor._data_abort(pc)
  123. #define cpu_check_bugs() processor._check_bugs()
  124. #define cpu_proc_init() processor._proc_init()
  125. #define cpu_proc_fin() processor._proc_fin()
  126. #define cpu_reset(addr) processor.reset(addr)
  127. #define cpu_do_idle(mode) processor._do_idle(mode)
  128. #define cpu_cache_clean_invalidate_all() processor.cache.clean_invalidate_all()
  129. #define cpu_cache_clean_invalidate_range(s,e,f) processor.cache.clean_invalidate_range(s,e,f)
  130. #define cpu_flush_ram_page(vp) processor.cache._flush_ram_page(vp)
  131. #define cpu_dcache_clean_page(vp) processor.dcache.clean_page(vp)
  132. #define cpu_dcache_clean_entry(addr) processor.dcache.clean_entry(addr)
  133. #define cpu_dcache_clean_range(s,e) processor.dcache.clean_range(s,e)
  134. #define cpu_dcache_invalidate_range(s,e) processor.dcache.invalidate_range(s,e)
  135. #define cpu_icache_invalidate_range(s,e) processor.icache.invalidate_range(s,e)
  136. #define cpu_icache_invalidate_page(vp) processor.icache.invalidate_page(vp)
  137. #define cpu_tlb_invalidate_all() processor.tlb.invalidate_all()
  138. #define cpu_tlb_invalidate_range(s,e) processor.tlb.invalidate_range(s,e)
  139. #define cpu_tlb_invalidate_page(vp,f) processor.tlb.invalidate_page(vp,f)
  140. #define cpu_set_pgd(pgd) processor.pgtable.set_pgd(pgd)
  141. #define cpu_set_pmd(pmdp, pmd) processor.pgtable.set_pmd(pmdp, pmd)
  142. #define cpu_set_pte(ptep, pte) processor.pgtable.set_pte(ptep, pte)
  143. #define cpu_switch_mm(pgd,tsk) cpu_set_pgd(__virt_to_phys((unsigned long)(pgd)))
  144. #define cpu_get_pgd()
  145. ({
  146. unsigned long pg;
  147. __asm__("mrc p15, 0, %0, c2, c0, 0"
  148.  : "=r" (pg));
  149. pg &= ~0x3fff;
  150. (pgd_t *)phys_to_virt(pg);
  151. })
  152. #endif