加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PPC的MCU初始化

发布时间:2020-12-15 06:15:05 所属栏目:百科 来源:网络整理
导读:MMU初始化重要的有2个,TLB和LAW ??? 通过TLB,把EA(Effective address)转换为RA(Real Address) ??? 通过LAW,把RA送到物理总线上去,即总线地址 下面以MPC8560来举例 -------------------------- 格机格机格机格机格机格机 ------------------------------

MMU初始化重要的有2个,TLB和LAW
??? 通过TLB,把EA(Effective address)转换为RA(Real Address)
??? 通过LAW,把RA送到物理总线上去,即总线地址
下面以MPC8560来举例

-------------------------- 格机格机格机格机格机格机 ------------------------------


Effective Address?? -->????Virtual Address?? -->???Real Address??? -->?Bus Addess
???EA 有效地址
????????????????VA 虚拟地址?????????????RA 物理地址??????????总线地址
?????32 bit????????????????????41 bit??????????????????32 bit???????? 取决于地址总线位宽

下面是一张图,讲述了TLB把EA转换为RA的过程



第一步:根据 EA有效地址产生 VA虚拟地址。虚拟地址为 41位,构成如下:

bit[0],AS,地址空间域
??? 0 是和中断处理及系统级的代码和数据关联
??? 1 是应用程序的代码和数据?

??? 用户模式的程序运行时,一般 MSR[IS,DS]为 1,只允许访问应用程序的代码及数据地址空间。
??? 进入中断时,MSR[IS,DS]自带清 0,因此可以利用系统级的 TLB(TS=0)来访问中断处理相关的代码。?

bit[1-8],TID,进程标识符

??? 由 PID寄存器提供,多数操作系统都未实现,默认 0

bit[9-40]?即原来的 EA地址 (页表号+页内offset,)


第二步:根据虚拟地址匹配TLB,匹配过程如下:

V域为 1,当前 TLB项有效;
MSR[IS,DS]和 TLB表项的 TS域一致;
TID一致或者 TLB表达 TID为 0,全局共享;
由表项的SIZE域根据公式 n = 32–log2 (page size in bytes)计算虚拟地址中 EPN的值,然后和TLB的 EPN域进行匹配且匹配成功。

第三步,根据TLB生成 RA

TLB匹配成功后,将提取 TLB表的 RPN和 ERPN域,构成 RA物理实际地址的页编号部分,而页内偏移由 EA的低地址部分提供,相关构成如下:

RA = ERPN0:3 || RPN0:n–1 || EAn:31


第四步,匹配LAW,生成总线地址


用RA来检索LAW entry,下面是一个LAW的例子

?
比如命中了 PCI law entry,就会通过PCI的相关地址转换寄存器生成bus address总线地址,
然后送到PCI总线上

-------------------------- 格机格机格机格机格机格机 ------------------------------


基本原理是用一些静态数组的值来初始化 TLB 和 LAW 的 entry

  1. ########################?文件 /uboot/cpu/mpc8560/start.S?#################
  2. 221?/*
  3. 222?*?Invalidate MMU L1/L2
  4. 223?*
  5. 224?*?Note:?There?is?a fixup earlier?for?Errata CPU4?on
  6. 225?*?Rev 1 parts that must precede this MMU invalidation.
  7. 226?*/
  8. 227 li r2,?0x001e
  9. 228 mtspr MMUCSR0 229 isync
  10. 230
  11. 231?*
  12. 232?*?Invalidate all TLB0 entries.?禁用所有TLB0的entry , 只有4个?
  13. 233?/
  14. 234 li r3 235 li r4 236 tlbivax r4 237?*
  15. 238?*?To?avoid REV1 Errata CPU6 issues 239?*?the instruction following tlbivax?is?not?a store.
  16. 240?/
  17. 241
  18. 242?*
  19. 243?*?After resetis?located at CFG_CCSRBAR_DEFAULT.e.
  20. 244?*?0xff700000-0xff800000.?We need add a TLB1 entry?for?this 1MB
  21. 245?*?region before we can access any CCSR registers such as L2
  22. 246?*?registersetc.?We will also re-allocate
  23. 247?*?CFG_CCSRBAR_DEFAULT?to?CFG_CCSRBAR immediately after TLB1 setup.
  24. 248?*
  25. 249?*?Please refer?to?board-specif directory?for?TLB1 entry configuration.
  26. 250?(e.g.?board<yourboard>/init.S)
  27. 251?*
  28. 252?/
  29. 253?bl tlb1_entry??*?注意,tlb1_entry 这个section可以看做一个数组,来描述TLB0和TLB1?/
  30. 254?mr r5*?注意,r0 里存的是第68行的 EA, 此EA里保存的是TLB entry数组的大小值?/
  31. 255 li r1*?max 16 TLB1 plus some TLB0 entries/
  32. 256 mtctr r1
  33. 257?lwzu r4(r5)?*?how many TLB1 entries we actually use 从(r5中存的)EA中load值到r4中,现在r4里面存的是TLB entry 的个数/?
  34. 258
  35. 259?0:?cmpwi r4*?这就是循环初始化TLB entry了,每初始化一个,r4就减1,r4为0时跳转到第276行/
  36. 260?beq 1f
  37. 261?lwzu r0)???*?r5 在不断的增加4,即EA在不断的增加4,即在遍历TLB entry 数组?/
  38. 262?lwzu r1)
  39. 263?lwzu r2)
  40. 264?lwzu r3)
  41. 265?mtspr MAS0*?用从TLB entry 数组来初始化 TLB?/
  42. 266?mtspr MAS1 267?mtspr MAS2 268?mtspr MAS3 269?isync
  43. 270?msync
  44. 271?tlbwe
  45. 272?isync
  46. 273?addi r4-1
  47. 274?bdnz 0b
  48. 275
  49. 276 1:
  50. 277 #if?(CFG_CCSRBAR_DEFAULT?!=?CFG_CCSRBAR)
  51. 278?*?Special sequence needed?to?update CCSRBAR itself?即CCSR重定向/
  52. 279 lis r4 280 ori r4?CFG_CCSRBAR_DEFAULT@l
  53. 281
  54. 282 lis r5 283 ori r5?CFG_CCSRBAR@l
  55. 284 srwi r612
  56. 285 stw r6(r4)
  57. 286 isync
  58. 287
  59. 288 lis r5 289 ori r5 290 lwz r5)
  60. 291 isync
  61. 292
  62. 293 lis r3 294 lwz r5(r3)
  63. 295 isync
  64. 296 #endif
  65. 297
  66. 298
  67. 299?set?up local access windows<boardname.S?/
  68. 300 lis r7 301 ori r7CFG_CCSRBAR@l
  69. 302
  70. 303?bl law_entry??????*?注意,law_entry 这个section可以看做一个数组,来描述LAW?/
  71. 304?mr r6*?注意,r0 里存的是第321行的 EA, 此EA里保存的是LAW entry数组的大小值?/
  72. 305
  73. 306 li r1*?10 LAWs?for?MPC8548.?The LAWs value?in?board.S must?not?over the CPU max LAWs.?又是Counter寄存器,初始化它干什么用的?/
  74. 307 mtctr r1
  75. 308?lwzu r5(r6)?*?how many windows we actually use 从(r6中存的)EA中load值到r5中,现在r5里面存的是TLB entry 的个数/
  76. 309
  77. 310 li r2*?the first pair?is?reserved?for?boot-over-rio-or-pci?/
  78. 311 li r1 312
  79. 313?0:?cmpwi r5*?循环初始化LAW entry,每初始化一个,r5减1,r5为0时跳转到第325行?/
  80. 314?beq 1f
  81. 315?lwzu r4)????*?)EA中load值<-?r6+4 r4?-?/
  82. 316?lwzu r3)
  83. 317?stwx r4*?写LAWBAR寄存器?(r7+r2)?-?r4?/
  84. 318?stwx r3 319?addi r5-1
  85. 320?addi r20x0020????*?LAWBAR[0-7]寄存器的偏移量是0x0020 r2?-?r2?+?0x0020?/
  86. 321?addi r10x0020
  87. 322?bdnz 0b
  88. 323
  89. 324?*?Jump out the last 4K page?and?continue?to?'normal'?start?/
  90. 325 1:?bl 3f
  91. 326 b _start
  92. 327
  93. 328 3:?li r0 329 mtspr SRR1*?Keep things disabled?for?now?/
  94. 330 mflr r1
  95. 331 mtspr SRR0 332 rfi


  96. ###############?文件 board/pq37pc/pq37pc_8560/init.S?########################

  97. ?33?*
  98. ?34?*?TLB0?and?TLB1 Entries
  99. ?35?*
  100. ?36?*?Out of reset's Entry 0 maps the highest 4K?for?CCSRBAR.
  101. ?37?*?Howeverthen?relocated?to?CFG_CCSRBAR?right?after
  102. ?38?*?these TLB entries are established.
  103. ?39?*
  104. ?40?*?The TLB entries?for?DDR are dynamically setup?in?spd_sdram()
  105. ?41?and?use TLB1 Entries 8 through 15 as needed according?to?the
  106. ?42?*?size of DDR memory.
  107. ?43?*
  108. ?44?*?MAS0:?tlbsel?nv
  109. ?45?*?MAS1:?valid?tid?tsize
  110. ?46?*?MAS2:?epn?x0?w?g ?47?*?MAS3:?rpn-u3?sx?sw?sr
  111. ?48?/
  112. ?49
  113. ?50 #define entry_start?
  114. ?51?mflr r1?;??????/把LR的值,即bl tlb1_entry 的下一条指令的EA 保存到 r1 中(即第254行的地址)
  115. ?52?bl 0f?;?????????/?就是直接跳到0处执行代码,起始就是符号entry_end处(即第55行)
  116. ?53
  117. ?54 #define entry_end?
  118. ?55?0:?mflr r0??/把LR的值,即bl 0f的下一条指令的EA 存到 r0 中?(即第68行)
  119. ?56?mtlr r1?????/?把r1的值放到LR中,LR中值是 bl tlb1_entry的下一条指令的EA?)
  120. ?57?blr?;??????????/?跳转到LR处,即执行 bl tlb1_entry的下一条指令?)
  121. ?58
  122. ?59
  123. ?60?.section?.bootpg"ax"
  124. ?61?.globl tlb1_entry
  125. ?62?tlb1_entry:
  126. ?63?entry_start
  127. ?64
  128. ?65?*
  129. ?66?*?Number of TLB0?and?TLB1 entries?in?the following table
  130. ?67?/
  131. ?68?.long 21
  132. ?69
  133. ?70 #)
  134. ?71?*
  135. ?72?*?TLB0 4K Non-cacheable ?73?*?0xff700000 4K Initial CCSRBAR mapping
  136. ?74?*
  137. ?75?*?This ends up at a TLB0 Index==0 entryand?must?not?collide
  138. ?76?*?with other TLB0 Entries.
  139. ?77?/
  140. ?78?.long TLB1_MAS0(0)
  141. ?79?.long TLB1_MAS1(1)
  142. ?80?.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT))
  143. ?81?.long TLB1_MAS3(E500_TLB_RPN)
  144. ?82 #else
  145. ?83 #error("Update the number of table entries in tlb1_entry")
  146. ?84 #endif
  147. ?85
  148. ?86?*
  149. ?87?*?TLB0 16K Cacheable-guarded
  150. ?88?*?0xd001_0000 16K Temporary Global data?for?initialization
  151. ?89?*
  152. ?90?*?Use four 4K TLB0 entries.?These entries must be cacheable
  153. ?91?*?as they provide the bootstrap memory before the memory
  154. ?92?*?controler?and?real memory have been configured.
  155. ?93?*
  156. ?94?*?These entries?end?up at TLB0 Indicies 0x10?0x18?and?0x1c ?95?not?collide with other TLB0 entries.
  157. ?96?/
  158. ?97?)
  159. ?98?)
  160. ?99?(CFG_INIT_RAM_ADDR)
  161. 100?)
  162. 101
  163. 102?)
  164. 103?)
  165. 104?(CFG_INIT_RAM_ADDR?+?4?*?1024)
  166. 105?)
  167. 106
  168. 107?)
  169. 108?)
  170. 109?+?8?)
  171. 110?)
  172. 111
  173. 112?)
  174. 113?)
  175. 114?+?12?)
  176. 115?)
  177. 116
  178. 117
  179. 118?*
  180. 119?*?TLB 0:?16M Non 120?*?0xfff80000 512k FLASH
  181. 121?*?Out of reset this entry?is?only 4K.
  182. 122?/
  183. 123?)
  184. 124??CFG_MAX_FLASH_TSIZE)
  185. 125?(CFG_BOOT_FLASH_BASE)
  186. 126?)
  187. 127
  188. 128
  189. 129
  190. 130?*
  191. 131?*?TLB 1:?256M Non 132?*?0x80000000 256M PCI1 MEM First half
  192. 133?/
  193. 134?)
  194. 135?)
  195. 136?(CFG_PCI1_MEM_BASE)
  196. 137?)
  197. 138
  198. 139?*
  199. 140?*?TLB 2 141?*?0x90000000 256M PCI1 MEM?Second?half
  200. 142?/
  201. 143?)
  202. 144?)
  203. 145?(CFG_PCI1_MEM_BASE?+?0x10000000)
  204. 146?)
  205. 147
  206. 148
  207. 149 #if?0
  208. 150?*
  209. 151?*?TLB 3 152?*?0xa0000000 256M Rapid IO MEM First half
  210. 153?/
  211. 154?)
  212. 155?)
  213. 156?(CFG_RIO_MEM_BASE)
  214. 157?)
  215. 158
  216. 159?*
  217. 160?*?TLB 4 161?*?0xb0000000 256M Rapid IO MEM?Second?half
  218. 162?/
  219. 163?)
  220. 164?)
  221. 165?(CFG_RIO_MEM_BASE?)
  222. 166?)
  223. 167
  224. 168 #endif
  225. 169
  226. 170?*
  227. 171?in?my designnot?use's marco?for?other interface
  228. 172?:
  229. 173?*?0xa0000000 256M Rapid IO MEM?Second?half
  230. 174?/
  231. 175?)
  232. 176?)
  233. 177?)
  234. 178?)
  235. 179
  236. 180?*
  237. 181?:?64M Non 182?*?0xe000_0000 1M CCSRBAR
  238. 183?*?0xe200_0000 16M PCI1 IO
  239. 184?/
  240. 185?)
  241. 186?)
  242. 187?(CFG_CCSRBAR)
  243. 188?)
  244. 189
  245. 190?*
  246. 191?*?TLB 5:?16K Non 192?*?0xf8000000 16K registers
  247. 193?/
  248. 194?)
  249. 195?*BOOKE_PAGESZ_16K?for?LED_BASE/
  250. 196?(CFG_LED_BASE)
  251. 197?)
  252. 198
  253. 199
  254. 200?*
  255. 201?*?TLB 6:?128M Non 202?*?0xf0000000 128M registers
  256. 203?/
  257. 204?)
  258. 205?)
  259. 206?(CFG_FLASH_BASE)
  260. 207?)
  261. 208
  262. 209?)
  263. 210?)
  264. 211?(CFG_FLASH_BASE?+?0x04000000)
  265. 212?)
  266. 213
  267. 214
  268. 215
  269. 216?*
  270. 217?*?TLB 810:?for?1G DDR
  271. 218?*?TLB 8 0x00000000 256M DDR System memory
  272. 219?*?TLB 9 0x10000000 256M DDR System memory
  273. 220?*?TLB 10 0x20000000 256M DDR System memory
  274. 221?*?TLB 11 0x30000000 256M DDR System memory
  275. 222?*?Without SPD EEPROM configured DDR.
  276. 223?*?Make sure the TLB count at the top of this table?is?correct.
  277. 224?*?Likely it needs?to?be increased by two?for?these entries.
  278. 225?/
  279. 226?)
  280. 227?)
  281. 228?(CFG_DDR_SDRAM_BASE)
  282. 229?)
  283. 230
  284. 231?)
  285. 232?)
  286. 233?(CFG_DDR_SDRAM_BASE?)
  287. 234?)
  288. 235
  289. 236?)
  290. 237?)
  291. 238?+?0x20000000)
  292. 239?)
  293. 240
  294. 241?)
  295. 242?)
  296. 243?+?0x30000000)
  297. 244?)
  298. 245
  299. 246?/follow?is?added by zhangsy
  300. 247?*
  301. 248?*?TLB 1214for?1G DDR
  302. 249?*?TLB 12 0x40000000 256M DDR System memory
  303. 250?*?TLB 13 0x50000000 256M DDR System memory
  304. 251?*?TLB 14 0x60000000 256M DDR System memory
  305. 252?*?TLB 15 0x70000000 256M DDR System memory
  306. 253?/
  307. 254
  308. 255?)
  309. 256?)
  310. 257?+?0x40000000)
  311. 258?)
  312. 259
  313. 260?)
  314. 261?)
  315. 262?+?0x50000000)
  316. 263?)
  317. 264
  318. 265?)
  319. 266?)
  320. 267?+?0x60000000)
  321. 268?)
  322. 269
  323. 270?)
  324. 271?)
  325. 272?+?0x70000000)
  326. 273?)
  327. 274
  328. 275
  329. 276?entry_end
  330. 277
  331. 278?*
  332. 279?*?LAW(Local Access?Window)?configuration:
  333. 280?*
  334. 281?*?0x0000_0000 0x7fff_ffff DDR 2G
  335. 282?*?0x8000_0000 0x9fff_ffff PCI1 MEM 512M
  336. 283?*?0xc000_0000 0xdfff_ffff RapidIO 512M
  337. 284?*?0xe000_0000 0xe000_ffff CCSR 1M
  338. 285?*?0xe200_0000 0xe2ff_ffff PCI1 IO 16M
  339. 286?*?0xf000_0000 0xf3ff_ffff SDRAM 64M
  340. 287?*?0xf800_0000 0xf800_7fff DEBUG LED?and?board ID 16K
  341. 288?*?0xff80_0000 0xffbf_ffff FLASH?(2nd bank)?4M
  342. 289?*?0xffc0_0000 0xffff_ffff FLASH?(boot bank)?4M
  343. 290?*
  344. 291?*?Notes:
  345. 292?*?CCSRBAR?and?L2-as-SRAM don't need a configured Local Access?.
  346. 293?If?flash?is?8M at default position?(last 8M.
  347. 294?/
  348. 295
  349. 296 #define LAWBAR0?>12&?0xfffff)
  350. 297 #define LAWAR0?(LAWAR_EN?|?LAWAR_TRGT_IF_DDR?|?(LAWAR_SIZE?&?LAWAR_SIZE_2G)
  351. 298
  352. 299?*
  353. 300?*?Rapid IO at 0xc000_0000?for?512 M
  354. 301?/
  355. 302 #define LAWBAR3?)
  356. 303 #define LAWAR3?|?LAWAR_TRGT_IF_LBC?&?LAWAR_SIZE_256M)
  357. 304
  358. 305
  359. 306
  360. 307?*?LBC?window?-?maps 256M 0xf0000000?>?0xffffffff?/
  361. 308 #define LAWBAR4?(CFG_LBC_BASE_1)
  362. 309 #define LAWAR4?|?LAWAR_TRGT_IF_PCI?&?LAWAR_SIZE_512M)
  363. 310
  364. 311
  365. 312
  366. 313 #define LAWBAR5?(CFG_LBC_BASE_3)
  367. 314 #define LAWAR5?)
  368. 315
  369. 316
  370. 317?"ax"
  371. 318?.globl law_entry
  372. 319?law_entry:
  373. 320?entry_start
  374. 321?.long 0x04
  375. 322?.long LAWBAR0 323?.long LAWBAR3 324?.long LAWBAR4 325?.long LAWBAR5 326?entry_end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读