mmuArmLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:22k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* mmuArmLib.h - ARM MMU library header file */
  2. /* Copyright 1996-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01p,15jan02,m_h  920,940 thumb incorrectly defined as CPU_940_T not CPU_940T_T
  7. 01o,05oct01,rec  added I-SRAM and D-SRAM CP15, R1 bit defs.
  8. 01n,03oct01,jpd  added WRITETHROUGH definitions for 946E.
  9. 01m,26jul01,scm  add extended small page table support for XScale...
  10. 01l,25jul01,scm  add support for extended page attributres on XScale...
  11. 01k,23jul01,scm  change XScale name to conform to coding standards...
  12. 01j,11dec00,scm  replace references to ARMSA2 with XScale
  13. 01i,01sep00,scm  add sa2 support...
  14. 01h,07sep99,jpd  added ARM740T, ARM920T support.
  15. 01g,20jan99,cdp  removed support for old ARM libraries;
  16.  add prefix to MMU_IDs.
  17. 01f,24nov98,jpd  added ARM940T support, added other CPU ids; removed
  18.  mmuIntLock/Unlock as intIFLock/Unlock to be used instead;
  19.             cdp  restructured for multiple cache/MMU libraries; big-endian.
  20. 01e,09mar98,jpd  added MMUCTR_ definitions for ARM810 and extra cache states.
  21. 01d,20jan98,jpd  added _func_armPhysToVirt() etc. function pointers.
  22. 01c,17sep97,jpd  added MMU_INIT_VALUE and mmuIntLock/Unlock definitions.
  23. 01b,24jan97,jpd  modified mmuAEnable definition.
  24. 01a,09may96,cdp  created.
  25. */
  26. #ifndef __INCmmuArmLibh
  27. #define __INCmmuArmLibh
  28. /*
  29.  * N.B. although this library contains code written for the ARM810 CPU,
  30.  * at the time of writing, this code has not been fully tested on
  31.  * that CPU. YOU HAVE BEEN WARNED.
  32.  */
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. #ifndef _ASMLANGUAGE
  37. #include "memLib.h"
  38. #endif /* _ASMLANGUAGE */
  39. /*
  40.  * MMUs are not fitted to all processors, and so the definitions below
  41.  * should not need to be included for processors without MMUs.
  42.  */
  43. #if (ARMMMU != ARMMMU_NONE)
  44. /*
  45.  * MMU identifiers as read from ID register (not all tested, some from
  46.  * datasheets).
  47.  */
  48. #if (CPU==XSCALE)
  49. #define MMU_ID_CPU_MASK 0xFFFFF000 /* Mask for CPU types */
  50. #define MMU_ID_XSCALE           0x69052000 /* XScale needs validation */
  51. #else
  52. #define MMU_ID_CPU_MASK 0xFFFFF0 /* Mask for CPU types */
  53. #define MMU_ID_ARM710A 0x047100
  54. #define MMU_ID_ARM710T 0x807100
  55. #define MMU_ID_ARM720T 0x807200
  56. #define MMU_ID_ARM810 0x018100
  57. #define MMU_ID_SA110 0x01A100
  58. #define MMU_ID_SA1100 0x01A110
  59. #define MMU_ID_SA1500 0x01A150
  60. #define MMU_ID_ARM920T 0x029200
  61. #define MMU_ID_ARM940T 0x029400
  62. #define MMU_ID_ARM740T_8 0x807400 /* 8 kB cache variant */
  63. #define MMU_ID_ARM740T_4 0x817400 /* 4 kB cache variant */
  64. #define MMU_ID_ARM946E 0x049460
  65. #endif /* if CPU=XSCALE */
  66. /*
  67.  * The page size we will use. Ignore the sub-page, Large Page and Tiny
  68.  * Page features. Page size is still defined for MPUs, (it is the
  69.  * minimum size for a region).
  70.  */
  71. #define PAGE_SIZE 4096
  72. #if (!ARM_HAS_MPU) /* definitions for page-table type MMUs */
  73. /*
  74.  * The amount described by a Level 1 Descriptor, which equals the smallest
  75.  * amount of VM allocatable in VxWorks.
  76.  */
  77. #define PAGE_BLOCK_SIZE 0x100000 /* 1 MB */
  78. #define PTE_INDEX_MASK 0x000FF000 /* extract PTE index from Virt Addr */
  79. #define PTE_INDEX_SHIFT 12 /* shift to make that into PTE index */
  80. #define L1D_TO_BASE_SHIFT 10 /* to turn L1D to PT base addr */
  81. #define ADDR_PI_MASK 0x00000FFF /* extract page index from Virt Addr */
  82. #define ADDR_TO_PAGE 12 /* shift phys address to PTE page base address */
  83. /* Level 1 Descriptor types */
  84. #define DESC_TYPE_PAGE 1
  85. #define DEF_L1_PAGE 0x00000011 /* domain zero, Page descriptor */
  86. /*
  87.  * Section descriptors, such as might be used to set up an intermediate
  88.  * set of page tables on processors such as SA-1100/SA-1500 where this
  89.  * needs to be done from BSP initialisation, before vm(Base)Lib sets up
  90.  a proper set of page tables.
  91.  */
  92. #define RAM_SECT_DESC    0xC1E   /* R/W cacheable bufferable domain 0 */
  93. #define MINICACHE_SECT_DESC 0xC1A   /* R/W C+ B- domain 0 */
  94. #define OTHER_SECT_DESC 0xC12   /* R/W C- B- domain 0 */
  95. /* Level 2 Descriptor or Page Table Entry (PTE) types */
  96. #define PTE_TYPE_FAULT  0 /* any access will cause a fault */
  97. #define PTE_TYPE_SM_PAGE 2 /* Small page descriptor */
  98. #define PTE_TYPE_EX_PAGE 3 /* Extended page descriptor */
  99. /*
  100.  * The Translation Table Base register (TTBR) points to a table of Level 1
  101.  * Descriptors. these are either Invalid Section descriptors, Section
  102.  * Descriptors, or Page Table Descriptors. If Page Table Descriptors, they
  103.  * each point to a table of Level 2 Page Descriptors, or Page Table Entries
  104.  * (PTEs).
  105.  * The 32-bit (virtual) address space allows for 4096 M. Each Level 1
  106.  * Descriptor describes a 1 M area of memory. There are therefore 4096 Level
  107.  * 1 Descriptors, and each table of 256 Level 2 Page Descriptors (PTEs)
  108.  * describes 256 4 kbyte pages.
  109.  */
  110. #define NUM_L1_DESCS 4096
  111. #define NUM_L2_DESCS 256
  112. #define L1_TABLE_SIZE (NUM_L1_DESCS * sizeof(LEVEL_1_DESC))
  113. /* No. of pages a Level 1 Descriptor table takes up */
  114. #define L1_DESC_PAGES (L1_TABLE_SIZE / PAGE_SIZE)
  115. /* Size of a Page Table */
  116. #define PAGE_TABLE_SIZE (NUM_L2_DESCS * sizeof(PTE))
  117. /*
  118.  * Architecture-dependent MMU states. These are states settable for pages and
  119.  * here they correspond to settings in the Page Table Entries (PTEs).
  120.  *
  121.  * We set Valid/Invalid by setting a Fault second-level descriptor rather
  122.  * than by using the Access Permissions within a small page second-level
  123.  * descriptor. This is because we will want to use the Access Permissions to
  124.  * allow read/write from supervisor mode and we cannot then use the AP bits
  125.  * to disallow access as the SR bits in the MMU Control register must be set
  126.  * to 01 in order to control read/write access from Supervisor mode.
  127.  */
  128. #define MMU_STATE_MASK_VALID 0x03 /* 2nd level desc type*/
  129. #if (CPU==XSCALE)
  130. #define MMU_STATE_MASK_WRITABLE 0x00000030 /* AP bits */
  131. #else
  132. #define MMU_STATE_MASK_WRITABLE 0x00000FF0 /* All APn bits */
  133. #endif /* if CPU=XSCALE */
  134. #define MMU_STATE_MASK_CACHEABLE 0x0000000C /* CB bits */
  135. #if (CPU==XSCALE)
  136. #define MMU_STATE_MASK_EX_CACHEABLE 0x0000004C /* X bit, and CB bits */
  137. #endif
  138. #if (CPU==XSCALE)
  139. #define MMU_STATE_VALID PTE_TYPE_EX_PAGE /* set to page type */
  140. #else
  141. #define MMU_STATE_VALID PTE_TYPE_SM_PAGE /* set to page type */
  142. #endif /* if CPU=XSCALE */
  143. #define MMU_STATE_VALID_NOT PTE_TYPE_FAULT /* set to type fault */
  144. #if (CPU==XSCALE)
  145. #define MMU_STATE_WRITABLE 0x00000030 /* AP bits to 11 */
  146. #else
  147. #define MMU_STATE_WRITABLE 0x00000FF0 /* APn bits to 11 */
  148. #endif /* if CPU=XSCALE */
  149. #define MMU_STATE_WRITABLE_NOT 0x0 /* APn bits to 00 */
  150. #if ((ARMMMU == ARMMMU_710A) || (ARMMMU == ARMMMU_720T) || 
  151.      (ARMMMU == ARMMMU_XSCALE))
  152. /* Write-through mode is only available on some CPUs */
  153. #define MMU_STATE_CACHEABLE_WRITETHROUGH 0x8
  154. #endif /* (ARMMMU == ARMMMU_710A/720T/XSCALE) */
  155. #if ((ARMMMU == ARMMMU_SA1100) || (ARMMMU == ARMMMU_SA1500) || 
  156.      (ARMMMU == ARMMMU_XSCALE))
  157. /* Minicacheable state only available on some CPUs. */
  158. #if (CPU==XSCALE)
  159. #define MMU_STATE_CACHEABLE_MINICACHE 0x48 /* allocate in minicache, X=1, CB=10  */
  160. #else
  161. #define MMU_STATE_CACHEABLE_MINICACHE 0x8  /* allocate in minicache */
  162. #endif /* if CPU=XSCALE */
  163. #endif
  164. #define MMU_STATE_CACHEABLE_COPYBACK 0xC  /* write back */
  165. #if (CPU==XSCALE)
  166. #define MMU_STATE_CACHEABLE_EX_COPYBACK 0x4C /* allow read/write allocate, X=1, CB=11  */
  167. #endif /* if CPU=XSCALE */
  168. /*
  169.  * Set the default state to be copyback. CACHEABLE_WRITETHROUGH can also be
  170.  * selected on 710A.
  171.  */
  172. #define MMU_STATE_CACHEABLE MMU_STATE_CACHEABLE_COPYBACK
  173. #if (CPU==XSCALE)
  174. #define MMU_STATE_EX_CACHEABLE MMU_STATE_CACHEABLE_EX_COPYBACK
  175. #endif /* if CPU=XSCALE */
  176. #define MMU_STATE_CACHEABLE_NOT 0x0
  177. #if (CPU==XSCALE)
  178. #define MMU_STATE_EX_CACHEABLE_NOT 0x0
  179. #endif /* if CPU=XSCALE */
  180. #define MMU_STATE_BUFFERABLE 0x4 /* bufferable, not cacheable */
  181. #define MMU_STATE_BUFFERABLE_NOT 0x0 /* will also set not cacheable */
  182. #if (CPU==XSCALE)
  183. #define MMU_STATE_EX_BUFFERABLE 0x44 /* bufferable, not cacheable, no coalesce */
  184. #define MMU_STATE_EX_BUFFERABLE_NOT 0x0 /* will also set not cacheable, no coalesce */
  185. #endif /* if CPU=XSCALE */
  186. #else /* (!ARM_HAS_MPU) */
  187. #define MPU_REGION_BASE_MASK 0xFFFFF000
  188. #define MPU_REGION_SIZE_MASK 0x0000003E
  189. #define MPU_REGION_SIZE_MAX 0x0000003E
  190. #define MMU_STATE_MASK_VALID 0x03 /* 2 AP bits */
  191. #define MMU_STATE_MASK_CACHEABLE 0xC0 /* CB bits */
  192. #define MMU_STATE_VALID 0x03 /* Full access */
  193. #define MMU_STATE_VALID_NOT 0x00 /* No access */
  194. /* cacheable and bufferable states are not real physical bit definitions */
  195. #if ((ARMMMU == ARMMMU_740T) || (ARMMMU == ARMMMU_946E))
  196. /* Write-through mode is not available on all CPUs */
  197. #define MMU_STATE_CACHEABLE_WRITETHROUGH 0x80
  198. #endif /* (ARMMMU == ARMMMU_740T,946E) */
  199. #define MMU_STATE_CACHE_BIT 0x80
  200. #define MMU_STATE_CACHEABLE_COPYBACK 0xC0
  201. /*
  202.  * Set the default state to be copyback. CACHEABLE_WRITETHROUGH can also be
  203.  * selected on 740T/946E.
  204.  */
  205. #define MMU_STATE_CACHEABLE MMU_STATE_CACHEABLE_COPYBACK
  206. #define MMU_STATE_CACHEABLE_NOT 0x0
  207. #define MMU_STATE_BUFFERABLE 0x40 /* bufferable, not cacheable */
  208. #define MMU_STATE_BUFFERABLE_NOT 0x0 /* will also set not cacheable*/
  209. /*
  210.  * For MPUs, we need a size for a region that means the entire address
  211.  * space.  It is perfectly reasonable to wish to define such a region
  212.  * and it is of course, not expressible within a UINT. So, define a
  213.  * special size.
  214.  */
  215. #define MMU_ENTIRE_SPACE 0
  216. #endif /* (!ARM_HAS_MPU) */
  217. /* MMU Control Register bit allocations */
  218. #define MMUCR_M_ENABLE  (1<<0)  /* MMU enable */
  219. #define MMUCR_A_ENABLE  (1<<1)  /* Address alignment fault enable */
  220. #define MMUCR_C_ENABLE  (1<<2)  /* (data) cache enable */
  221. #define MMUCR_W_ENABLE  (1<<3)  /* write buffer enable */
  222. #define MMUCR_PROG32  (1<<4)  /* PROG32 */
  223. #define MMUCR_DATA32  (1<<5)  /* DATA32 */
  224. #define MMUCR_L_ENABLE  (1<<6)  /* Late abort on earlier CPUs */
  225. #define MMUCR_BIGEND  (1<<7)  /* Big-endian (=1), little-endian (=0) */
  226. #define MMUCR_SYSTEM  (1<<8)  /* System bit, modifies MMU protections */
  227. #define MMUCR_ROM  (1<<9)  /* ROM bit, modifies MMU protections */
  228. #define MMUCR_F  (1<<10) /* Should Be Zero */
  229. #define MMUCR_Z_ENABLE  (1<<11) /* Branch prediction enable on 810 */
  230. #define MMUCR_I_ENABLE  (1<<12) /* Instruction cache enable */
  231. #if ((defined CPU_946ES) || (defined CPU_946ES_T))
  232. #define MMUCR_ALTVECT      (1<<13) /* alternate vector select */
  233. #define MMUCR_ROUND_ROBIN    (1<<14) /* round-robin placement */
  234. #define MMUCR_DISABLE_TBIT   (1<<15) /* disable TBIT */
  235. #define MMUCR_DSRAM_EN       (1<<16) /* D-SRAM enable  */
  236. #define MMUCR_DSRAM_LOADMODE (1<<17) /* D-SRAM load mode select  */
  237. #define MMUCR_ISRAM_EN       (1<<18) /* I-SRAM enable  */
  238. #define MMUCR_ISRAM_LOADMODE (1<<19) /* I-SRAM load mode select  */
  239. #endif /* CPU_946ES */
  240. #if ((defined CPU_966ES) || (defined CPU_966ES_T))
  241. #define MMUCR_ALTVECT      (1<<13) /* alternate vector select */
  242. #define MMUCR_DISABLE_TBIT   (1<<15) /* disable TBIT */
  243. #endif /* CPU_966ES */
  244. #if ((defined CPU_920T) || (defined CPU_920T_T) || 
  245.      (defined CPU_940T) || (defined CPU_940T_T))
  246. #define MMUCR_FB_DISABLE (1<<30) /* nFastBus bit */
  247. #define MMUCR_ASYNC_BIT  (1<<31) /* Async bit*/
  248. #define MMUCR_SYNC  (1<<30) /* Synchronous mode */
  249. #define MMUCR_ASYNC  (3<<30) /* Asynchronous mode */
  250. #endif /* CPU_920T or CPU_940T */
  251. /*
  252.  * Values to be used when mmuEnable() is called. This will be after the MMU has
  253.  * been initialised by sysInit()/romInit() and after cacheLib has set whatever
  254.  * cache enable settings have been chosen.
  255.  *
  256.  * M 1 Enable MMU
  257.  * A 0 Enable address alignment fault
  258.  * C X ((D-)Cache Enable) Controlled by cacheLib
  259.  * W X (Write Buffer) Controlled by cacheLib
  260.  * P X (PROG32) should be set before this
  261.  * D X (DATA32) should be set before this
  262.  * L X (Late abort on earlier CPUs) ignore
  263.  * B X (Big/Little-endian) should be set before this
  264.  * S 0 (System)
  265.  * R 1 (ROM)
  266.  * F 0 Should be Zero
  267.  * Z X (Branch prediction enable on 810) Controlled by cacheLib
  268.  * I X (I-cache enable) Controlled by cacheLib
  269.  *
  270.  * For time being, do not enable the address alignment fault, as GCC
  271.  * currently generates unaligned accesses in its code, and switching this
  272.  * on will cause immediate faults. So, do not put it into the enable
  273.  * mask.
  274.  *
  275.  * We used to clear all the Reserved/Should Be Zero bits when the
  276.  * MMU/MPU was enabled, by including one bits for them in the definition
  277.  * of MMU_ENABLE_MASK. We no longer do this, as CPU designers may extend
  278.  * the definitions of the bits within the MMU Control Register. The MMU
  279.  * Control register is initialised within romInit()/sysInit(), as the BSP
  280.  * is the only place where the particular details of the CPU/MMU are
  281.  * actually known. In general, it will be appropriate for the BSP to
  282.  * initialise the MMUCR Reserved/Should Be Zero bits to zero. When the
  283.  * MMU is enabled, we will only change the bits we are particularly
  284.  * concerned about, by using a Read-Modify-Write strategy.
  285.  */
  286. #if (ARMMMU == ARMMMU_810)
  287. #define MMU_ENABLE_MASK  (MMUCR_M_ENABLE | MMUCR_SYSTEM | MMUCR_ROM | 
  288.   MMUCR_Z_ENABLE)
  289. #else
  290. #define MMU_ENABLE_MASK  (MMUCR_M_ENABLE | MMUCR_SYSTEM | MMUCR_ROM)
  291. #endif /* (ARMMMU == ARMMMU_810) */
  292. #if 0
  293. #if ((ARMMMU == ARMMMU_940T) || (ARMMMU == ARMMMU_920T))
  294. /*
  295.  * When enabling the 940T/920T, we should not alter the clocking mode that
  296.  * has been selected earlier (by the BSP).
  297.  */
  298. #define MMU_ENABLE_MASK  (0x3FFFE000 | 
  299. MMUCR_M_ENABLE | 
  300. MMUCR_SYSTEM | MMUCR_ROM | MMUCR_F | MMUCR_Z_ENABLE)
  301. #else
  302. #define MMU_ENABLE_MASK  (0xFFFFE000 | 
  303. MMUCR_M_ENABLE | 
  304. MMUCR_SYSTEM | MMUCR_ROM | MMUCR_F | MMUCR_Z_ENABLE)
  305. #endif /* (ARMMMU == ARMMMU_940T/920T) */
  306. #endif /* <<< 0 */
  307. #if ((ARMMMU == ARMMMU_710A) || (ARMMMU == ARMMMU_720T) || 
  308.      (ARMMMU == ARMMMU_920T))
  309. #define MMU_ENABLE_VALUE (MMUCR_M_ENABLE | MMUCR_ROM)
  310. #endif
  311. #if (ARMMMU == ARMMMU_810)
  312. #define MMU_ENABLE_VALUE (MMUCR_M_ENABLE | MMUCR_ROM )
  313. #endif
  314. #if ((ARMMMU == ARMMMU_SA110) || (ARMMMU == ARMMMU_SA1100) || 
  315.      (ARMMMU == ARMMMU_SA1500) || (ARMMMU == ARMMMU_XSCALE))
  316. #define MMU_ENABLE_VALUE (MMUCR_M_ENABLE | MMUCR_ROM)
  317. #endif
  318. #if ((ARMMMU == ARMMMU_940T) || (ARMMMU == ARMMMU_740T) || 
  319.      (ARMMMU == ARMMMU_946E))
  320. #define MMU_ENABLE_VALUE (MMUCR_M_ENABLE)
  321. #endif
  322. /*
  323.  * Values to be used when the MMU Control Register is initialised from
  324.  * within romInit.s or sysALib.s (before the MMU is enabled). Note that
  325.  * on 710A, this is also used to initialise the soft-copy of the MMU CR
  326.  * that we need to keep (in order to emulate Read-Modify-Write
  327.  * operations). So, 710A BSPs *MUST* initialise the MMU CR with the value
  328.  * contained here, or else trouble will ensue. This restriction does
  329.  * not apply to non-710A BSPs, but caution must be exercised in choosing a
  330.  * value different to that defined here.
  331.  */
  332. #if (_BYTE_ORDER == _LITTLE_ENDIAN)
  333. /* little-endian */
  334. #if ((ARMMMU == ARMMMU_710A) || (ARMMMU == ARMMMU_720T))
  335. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  336. MMUCR_ROM)
  337. #endif
  338. #if (ARMMMU == ARMMMU_810)
  339. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  340. MMUCR_ROM)
  341. #endif
  342. #if ((ARMMMU == ARMMMU_SA110) || (ARMMMU == ARMMMU_SA1100) || 
  343.      (ARMMMU == ARMMMU_SA1500) || (ARMMMU == ARMMMU_XSCALE))
  344. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  345. MMUCR_ROM)
  346. #endif
  347. #if ((ARMMMU == ARMMMU_940T) || (ARMMMU == ARMMMU_946E))
  348. /* W bit is Should Be One */
  349. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  350. MMUCR_W_ENABLE)
  351. #endif
  352. #if (ARMMMU == ARMMMU_740T)
  353. #define MMU_INIT_VALUE 0
  354. #endif
  355. #if (ARMMMU == ARMMMU_920T)
  356. /* W bit is Should Be One */
  357. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  358. MMUCR_ROM | MMUCR_W_ENABLE)
  359. #endif
  360. #else /* (_BYTE_ORDER == _LITTLE_ENDIAN) */
  361. /* big-endian */
  362. #if ((ARMMMU == ARMMMU_710A) || (ARMMMU == ARMMMU_720T))
  363. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  364. MMUCR_BIGEND | MMUCR_ROM)
  365. #endif
  366. #if (ARMMMU == ARMMMU_810)
  367. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  368. MMUCR_BIGEND | MMUCR_ROM)
  369. #endif
  370. #if ((ARMMMU == ARMMMU_SA110) || (ARMMMU == ARMMMU_SA1100) || 
  371.      (ARMMMU == ARMMMU_SA1500) || (ARMMMU == ARMMMU_XSCALE))
  372. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  373. MMUCR_BIGEND | MMUCR_ROM)
  374. #endif
  375. #if ((ARMMMU == ARMMMU_940T) || (ARMMMU == ARMMMU_946E))
  376. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  377. MMUCR_BIGEND | MMUCR_W_ENABLE)
  378. #endif
  379. #if (ARMMMU == ARMMMU_740T)
  380. #define MMU_INIT_VALUE MMUCR_BIGEND
  381. #endif
  382. #if (ARMMMU == ARMMMU_920T)
  383. #define MMU_INIT_VALUE (MMUCR_PROG32 | MMUCR_DATA32 | MMUCR_L_ENABLE | 
  384. MMUCR_W_ENABLE | MMUCR_BIGEND | MMUCR_ROM)
  385. #endif
  386. #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
  387. #if (ARMMMU == ARMMMU_810)
  388. /*
  389.  * Definitions for register 15 of the MMU coprocessor (clock and test
  390.  * configuration).
  391.  */
  392. #define MMUCTR_D  (1<<0) /* Enable Dynamic Clock switching */
  393. #define MMUCTR_S  (1<<1) /* Enable Synchronous clock switching */
  394. #define MMUCTR_F_BUS (0<<2) /* Fast clock source: ... bus clock */
  395. #define MMUCTR_F_REF (1<<2) /* ... REFCLK */
  396. #define MMUCTR_F_PLL (3<<2) /* ... PLL output clock */
  397. #endif /* (ARMMMU == ARMMMU_810) */
  398. #ifndef _ASMLANGUAGE
  399. #if (!ARM_HAS_MPU)
  400. #if (_BYTE_ORDER == _LITTLE_ENDIAN)
  401. /* little-endian */
  402. typedef struct
  403.     {
  404.     UINT type : 2; /* descriptor type, 1 => page */
  405.     UINT pad1 : 2; /* SBZ */
  406.     UINT pad2 : 1; /* SBO */
  407.     UINT domain : 4; /* domain number */
  408.     UINT pad3 : 1; /* SBZ */
  409.     UINT addr : 22; /* base address of page table */
  410.     } PAGE_DESC_FIELD;
  411. /* Layout of Page Table Entries (PTEs), actually small page descriptors */
  412. typedef struct
  413.     {
  414. #if (CPU==XSCALE)
  415.     UINT type : 2; /* page type, 3 => extended small page */
  416.     UINT cb : 2; /* cacheable/bufferable bits */
  417.     UINT ap : 2; /* access permission */
  418.     UINT tex  : 4; /* type extension field */
  419.     UINT sbz : 2; /* should be zero */
  420.     UINT addr : 20; /* page base address */
  421. #else
  422.     UINT type : 2; /* page type, 2 => small page */
  423.     UINT cb : 2; /* cacheable/bufferable bits */
  424.     UINT ap0 : 2; /* access permission, sub-page 0 */
  425.     UINT ap1 : 2; /* access permission, sub-page 1 */
  426.     UINT ap2 : 2; /* access permission, sub-page 2 */
  427.     UINT ap3 : 2; /* access permission, sub-page 3 */
  428.     UINT addr : 20; /* page base address */
  429. #endif /* if CPU=XSCALE */
  430.     } PTE_FIELD;
  431. #else /* (_BYTE_ORDER == _LITTLE_ENDIAN) */
  432. /* big-endian */
  433. typedef struct
  434.     {
  435.     UINT addr : 22; /* descriptor type, 1 => page */
  436.     UINT pad3 : 1; /* SBZ */
  437.     UINT domain : 4; /* domain number */
  438.     UINT pad2 : 1; /* SBO */
  439.     UINT pad1 : 2; /* SBZ */
  440.     UINT type : 2; /* base address of page table */
  441.     } PAGE_DESC_FIELD;
  442. /* Layout of Page Table Entries (PTEs), actually small page descriptors */
  443. typedef struct
  444.     {
  445. #if (CPU==XSCALE)
  446.     UINT addr : 20; /* page base address */
  447.     UINT sbz : 2; /* should be zero */
  448.     UINT tex  : 4; /* type extension field */
  449.     UINT ap : 2; /* access permission */
  450.     UINT cb : 2; /* cacheable/bufferable bits */
  451.     UINT type : 2; /* page type, 3 => extended small page */
  452. #else
  453.     UINT addr : 20; /* page base address */
  454.     UINT ap3 : 2; /* access permission, sub-page 3 */
  455.     UINT ap2 : 2; /* access permission, sub-page 2 */
  456.     UINT ap1 : 2; /* access permission, sub-page 1 */
  457.     UINT ap0 : 2; /* access permission, sub-page 0 */
  458.     UINT cb : 2; /* cacheable/bufferable bits */
  459.     UINT type : 2; /* page type, 2 => small page */
  460. #endif /* if CPU=XSCALE */
  461.     } PTE_FIELD;
  462. #endif /* (_BYTE_ORDER == _LITTLE_ENDIAN) */
  463. typedef union
  464.     {
  465.     PAGE_DESC_FIELD fields;
  466.     UINT32 bits;
  467.     } LEVEL_1_DESC;
  468. typedef union
  469.     {
  470.     PTE_FIELD fields;
  471.     UINT32 bits;
  472.     } PTE;
  473. typedef struct mmuTransTblStruct
  474.     {
  475.     LEVEL_1_DESC *pLevel1Table;
  476.     } MMU_TRANS_TBL;
  477. #else /* (!ARM_HAS_MPU) */
  478. #define MPU_NUM_REGIONS 8
  479. #if (_BYTE_ORDER == _LITTLE_ENDIAN)
  480. typedef struct
  481.     {
  482.     UINT enable : 1; /* 1 => region enabled */
  483.     UINT size : 5; /* size  */
  484.     UINT pad : 6; /* padding */
  485.     UINT base : 20; /* region base address */
  486.     } MPU_REGION_FIELDS;
  487. #else /* (_BYTE_ORDER == _LITTLE_ENDIAN) */
  488. /* Big-Endian */
  489. typedef struct
  490.     {
  491.     UINT base : 20; /* region base address */
  492.     UINT pad : 6; /* padding */
  493.     UINT size : 5; /* size  */
  494.     UINT enable : 1; /* 1 => region enabled */
  495.     } MPU_REGION_FIELDS;
  496. #endif /* (_BYTE_ORDER == _LITTLE_ENDIAN) */
  497. typedef union
  498.     {
  499.     MPU_REGION_FIELDS fields;
  500.     UINT32 bits;
  501.     } MPU_REGION_REG;
  502. typedef struct mmuTransTblStruct
  503.     {
  504.     MPU_REGION_REG regs[MPU_NUM_REGIONS];
  505.     } MMU_TRANS_TBL;
  506. #endif /* (!ARM_HAS_MPU) */
  507. /* Externally visible mmuLib, mmuMapLib and mmuALib2 routines */
  508. IMPORT UINT32 mmuReadId (void);
  509. IMPORT void * mmuVirtToPhys (void * addr);
  510. IMPORT void * mmuPhysToVirt (void * addr);
  511. IMPORT UINT32 (* mmuCrGet) (void);
  512. IMPORT void (* mmuModifyCr) (UINT32 value, UINT32 mask);
  513. IMPORT UINT32 mmuHardCrGet (void);
  514. IMPORT UINT32 mmuSoftCrGet (void);
  515. IMPORT void mmuModifyHardCr (UINT32 value, UINT32 mask);
  516. IMPORT void mmuModifySoftCr (UINT32 value, UINT32 mask);
  517. #if (ARMMMU == ARMMMU_710A)
  518. #include "mmuArm710aLib.h"
  519. #elif (ARMMMU == ARMMMU_720T)
  520. #include "mmuArm720tLib.h"
  521. #elif (ARMMMU == ARMMMU_740T)
  522. #include "mmuArm740tLib.h"
  523. #elif (ARMMMU == ARMMMU_810)
  524. #include "mmuArm810Lib.h"
  525. #elif (ARMMMU == ARMMMU_SA110)
  526. #include "mmuArmSA110Lib.h"
  527. #elif (ARMMMU == ARMMMU_SA1100)
  528. #include "mmuArmSA1100Lib.h"
  529. #elif (ARMMMU == ARMMMU_SA1500)
  530. #include "mmuArmSA1500Lib.h"
  531. #elif (ARMMMU == ARMMMU_920T)
  532. #include "mmuArm920tLib.h"
  533. #elif (ARMMMU == ARMMMU_940T)
  534. #include "mmuArm940tLib.h"
  535. #elif (ARMMMU == ARMMMU_946E)
  536. #include "mmuArm946eLib.h"
  537. #elif (ARMMMU == ARMMMU_XSCALE)
  538. #include "mmuArmXSCALELib.h"
  539. #endif /* ARMMMU == ARMMMU_710A */
  540. #if (!ARM_HAS_MPU)
  541. /*
  542.  * Pointer to a function that can be filled in by the BSP to point to a
  543.  * function that returns a memory partition id for an area of memory to store
  544.  * the Level 1 and Level 2 page tables. This area must be big enough for all
  545.  * use. No provision is made to use that memory and then continue using
  546.  * system memory once that has been filled.
  547.  * N.B. at the time of writing, this feature has NEVER been tested at all.
  548.  */
  549. IMPORT PART_ID (* _func_armPageSource) (void);
  550. #endif /* (!ARM_HAS_MPU) */
  551. #endif /* _ASMLANGUAGE */
  552. #endif /* (ARMMMU != ARMMMU_NONE) */
  553. #ifdef __cplusplus
  554. }
  555. #endif
  556. #endif /* __INCmmuArmLibh */