File indexing completed on 2025-05-11 08:23:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <rtems/asm.h>
0019 #include <rtems/score/cpu.h>
0020 #include <libcpu/io.h>
0021 #include <libcpu/bat.h>
0022
0023
0024
0025
0026 #define PPC_601 0x1
0027 #define PPC_603 0x3
0028 #define PPC_604 0x4
0029 #define PPC_603e 0x6
0030 #define PPC_603ev 0x7
0031 #define PPC_750 0x8
0032 #define PPC_604e 0x9
0033 #define PPC_604r 0xA
0034 #define PPC_7400 0xC
0035 #define PPC_7455 0x8001
0036 #define PPC_7457 0x8002
0037 #define PPC_620 0x16
0038 #define PPC_860 0x50
0039 #define PPC_821 PPC_860
0040 #define PPC_8260 0x81
0041 #define PPC_8240 PPC_8260
0042
0043
0044 #define DSSALL .long 0x7e00066c
0045
0046
0047 #define CACHE_LINE_SIZE 32
0048
0049 #ifndef MSSCR0
0050 #define MSSCR0 1014
0051 #endif
0052
0053 #define DL1HWF (1<<(31-8))
0054 #define L2HWF (1<<(31-20))
0055
0056 #FIXME Should really move this to C code
0057
0058 .globl L1_caches_enables
0059 .type L1_caches_enables, @function
0060
0061 L1_caches_enables:
0062
0063
0064
0065 mfspr r9,PPC_PVR
0066 rlwinm r9,r9,16,16,31
0067 cmpi 0,r9,PPC_601
0068 beq 4f
0069 mfspr r11,HID0
0070 andi. r0,r11,HID0_DCE
0071 ori r11,r11,HID0_ICE|HID0_DCE
0072 ori r8,r11,HID0_ICFI
0073 bne 3f
0074 ori r8,r8,HID0_DCI
0075 3:
0076 sync
0077 mtspr HID0,r8
0078 sync
0079 mtspr HID0,r11
0080 sync
0081 isync
0082 cmpi 1,r9,PPC_604
0083 cmpi 2,r9,PPC_604e
0084 cmpi 3,r9,PPC_604r
0085 cror 6,6,10
0086 cror 6,6,14
0087 cmpi 2,r9,PPC_750
0088 cror 6,6,10
0089 cmpi 2,r9,PPC_7400
0090 cror 6,6,10
0091 cmpli 0,r9,PPC_7455
0092 beq 1f
0093 cmpli 0,r9,PPC_7457
0094 bne 2f
0095 1:
0096
0097
0098
0099
0100
0101
0102 oris r11,r11,(HID0_LRSTK|HID0_FOLD|HID0_TBEN)@h
0103 ori r11,r11,(HID0_LRSTK|HID0_FOLD|HID0_TBEN)@l
0104 2: cror 2,2,10
0105 bne 3f
0106 ori r11,r11,HID0_BTIC
0107 3: cror 2,2,6
0108 bne 4f
0109
0110 ori r11,r11,HID0_SIED|HID0_BHTE
0111 bne 2,5f
0112 ori r11,r11,HID0_BTCD
0113 5: mtspr HID0,r11
0114 sync
0115 isync
0116 4:
0117 blr
0118
0119 .globl get_L1CR
0120 .type get_L1CR, @function
0121 get_L1CR:
0122 mfspr r3,HID0
0123 blr
0124
0125 .globl get_L2CR
0126 .type get_L2CR, @function
0127 get_L2CR:
0128
0129 mfspr r3,PPC_PVR
0130 rlwinm r3,r3,16,16,31
0131 cmplwi r3,PPC_750
0132 beq 1f
0133 cmplwi r3,PPC_7400
0134 beq 1f
0135 cmplwi r3,PPC_7455
0136 beq 1f
0137 cmplwi r3,PPC_7457
0138 beq 1f
0139 li r3,-1
0140 blr
0141
0142 1:
0143
0144 mfspr r3,L2CR
0145 blr
0146
0147 .globl set_L2CR
0148 .type set_L2CR, @function
0149 set_L2CR:
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180 mfspr r0,PPC_PVR
0181 rlwinm r0,r0,16,16,31
0182 cmplwi r0,PPC_750
0183 beq thisIs750
0184 cmplwi r0,PPC_7400
0185 beq thisIs750
0186 cmplwi r0,PPC_7455
0187 beq thisIs750
0188 cmplwi r0,PPC_7457
0189 beq thisIs750
0190 li r3,-1
0191 blr
0192
0193 thisIs750:
0194
0195 mfspr r4,L2CR
0196 rlwinm r4,r4,0,0,0
0197
0198
0199 rlwinm r6,r3,0,10,10
0200 rlwinm. r5,r3,0,0,0
0201 rlwinm r3,r3,0,11,9
0202 rlwinm r3,r3,0,1,31
0203 or r3,r3,r4
0204 mfmsr r7
0205 rlwinm r4,r7,0,17,15
0206
0207 mtmsr r4
0208 bne dontDisableCache
0209
0210 cmplwi r0,PPC_7400
0211 bne disableCache
0212
0213
0214 DSSALL
0215 sync
0216
0217 mfspr r4, MSSCR0
0218 oris r4, r4, DL1HWF@h
0219 mtspr MSSCR0, r4
0220 sync
0221
0222 mfspr r4, L2CR
0223 ori r4, r4, L2HWF
0224 mtspr L2CR, r4
0225 sync
0226
0227 b flushDone
0228
0229 disableCache:
0230
0231 rlwinm r4,r4,0,28,26
0232 cmplwi r0,PPC_7455
0233 beq 1f
0234 cmplwi r0,PPC_7457
0235 bne not745x
0236 1:
0237
0238 DSSALL
0239 mtmsr r4
0240 sync
0241 isync
0242 mfspr r4, MSSCR0
0243 rlwinm r4,r4,0,29,0
0244 mtspr MSSCR0, r4
0245 sync
0246
0247 lis r4,0x0001
0248 mtctr r4
0249 li r4,0
0250 li r0,0
0251 loadFlush:
0252 lwzx r0,r0,r4
0253 dcbf r0,r4
0254 addi r4,r4,CACHE_LINE_SIZE
0255 bdnz loadFlush
0256 sync
0257
0258 mfspr r0, L2CR
0259 lis r4,L2CR_LOCK_745x@h
0260 ori r4,r4,L2CR_LOCK_745x@l
0261 or r4,r0,r4
0262 rlwinm r4,r4,0,11,9
0263 mtspr L2CR, r4
0264 sync
0265 ori r4, r4, L2HWF
0266 mtspr L2CR, r4
0267 sync
0268
0269 b reenableDR
0270
0271 not745x:
0272 sync
0273 mtmsr r4
0274 isync
0275
0276
0277
0278
0279
0280 lis r4,0x0001
0281 mtctr r4
0282 li r4,0
0283 loadLoop:
0284 lwzx r0,r0,r4
0285 addi r4,r4,CACHE_LINE_SIZE
0286 bdnz loadLoop
0287
0288
0289 lis r4,0x0001
0290 mtctr r4
0291 li r4,0
0292 sync
0293 flushLoop:
0294 dcbf r0,r4
0295 addi r4,r4,CACHE_LINE_SIZE
0296 bdnz flushLoop
0297 reenableDR:
0298 rlwinm r4,r7,0,17,15
0299 sync
0300 mtmsr r4
0301 isync
0302
0303 flushDone:
0304
0305
0306 rlwinm r3,r3,0,1,31
0307
0308 dontDisableCache:
0309
0310 sync
0311 mtspr L2CR,r3
0312 sync
0313 cmplwi r6,0
0314 beq noInval
0315
0316
0317 oris r3,r3,0x0020
0318 sync
0319 mtspr L2CR,r3
0320 sync
0321 invalCompleteLoop:
0322 mfspr r3,L2CR
0323 rlwinm. r4,r3,0,31,31
0324 bne invalCompleteLoop
0325
0326 rlwinm r3,r3,0,11,9;
0327 sync
0328 mtspr L2CR,r3
0329
0330 noInval:
0331 sync
0332
0333 mtmsr r7
0334
0335 cmplwi r5,0
0336 beqlr
0337
0338 enableCache:
0339
0340 oris r3,r3,0x8000
0341 mtspr L2CR,r3
0342 sync
0343 blr
0344
0345
0346 .globl get_L3CR
0347 .type get_L3CR, @function
0348 get_L3CR:
0349
0350 mfspr r3,PPC_PVR
0351 rlwinm r3,r3,16,16,31
0352 cmplwi r3,PPC_7455
0353 beq 1f
0354 cmplwi r3,PPC_7457
0355 beq 1f
0356 li r3,-1
0357 blr
0358
0359 1:
0360
0361 mfspr r3,L3CR
0362 blr
0363
0364 .globl set_L3CR
0365 .type set_L3CR, @function
0366 set_L3CR:
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380 mfspr r0,PPC_PVR
0381 rlwinm r0,r0,16,16,31
0382 cmplwi r0,PPC_7455
0383 beq thisIs7455
0384 cmplwi r0,PPC_7457
0385 beq thisIs7455
0386 li r3,-1
0387 blr
0388
0389 thisIs7455:
0390
0391 mfspr r4,L3CR
0392 rlwinm r4,r4,0,0,0
0393
0394
0395 rlwinm r6,r3,0,10,10
0396 rlwinm. r5,r3,0,0,0
0397 rlwinm r3,r3,0,11,9
0398 rlwinm r3,r3,0,1,31
0399 or r3,r3,r4
0400 mfmsr r7
0401 rlwinm r4,r7,0,17,15
0402
0403 mtmsr r4
0404 bne dontDisableL3Cache
0405
0406
0407 rlwinm r4,r4,0,28,26
0408 DSSALL
0409 sync
0410 mtmsr r4
0411 isync
0412
0413
0414 mfspr r0, L3CR
0415 lis r4, L3CR_LOCK_745x@h
0416 ori r4,r4, L3CR_LOCK_745x@l
0417 or r4,r0,r4
0418 rlwinm r4,r4,0,11,9
0419 mtspr L3CR, r4
0420 sync
0421 ori r4, r4, L3CR_L3HWF
0422 mtspr L3CR, r4
0423 sync
0424
0425 rlwinm r4,r7,0,17,15
0426 sync
0427 mtmsr r4
0428 isync
0429
0430
0431 rlwinm r3,r3,0,1,31
0432
0433 dontDisableL3Cache:
0434
0435 sync
0436 mtspr L3CR,r3
0437 sync
0438 ifL3Inval:
0439 cmplwi r6,0
0440 beq noL3Inval
0441
0442
0443 oris r3,r3,0x0020
0444 sync
0445 mtspr L3CR,r3
0446 sync
0447 invalCompleteL3:
0448 mfspr r3,L3CR
0449 rlwinm. r4,r3,0,31,31
0450 bne invalCompleteL3
0451
0452 rlwinm r3,r3,0,11,9;
0453 sync
0454 mtspr L3CR,r3
0455 sync
0456
0457 noL3Inval:
0458
0459 mtmsr r7
0460
0461 cmplwi r5,0
0462 beqlr
0463
0464 enableL3Cache:
0465
0466 oris r3,r3,0x8000
0467 mtspr L3CR,r3
0468 sync
0469 blr
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479 .globl CPU_clear_bats_early
0480 .type CPU_clear_bats_early,@function
0481 CPU_clear_bats_early:
0482 li r3,0
0483 mfspr r4,PPC_PVR
0484 rlwinm r4,r4,16,16,31
0485 cmpwi r4, 1
0486 sync
0487 isync
0488 beq 1f
0489 cmplwi r4,0x8001
0490 blt 2f
0491 cmplwi r4,0x8004
0492 bgt 2f
0493 mtspr DBAT4U,r3
0494 mtspr DBAT4L,r3
0495 mtspr DBAT5U,r3
0496 mtspr DBAT5L,r3
0497 mtspr DBAT6U,r3
0498 mtspr DBAT6L,r3
0499 mtspr DBAT7U,r3
0500 mtspr DBAT7L,r3
0501 mtspr IBAT4U,r3
0502 mtspr IBAT4L,r3
0503 mtspr IBAT5U,r3
0504 mtspr IBAT5L,r3
0505 mtspr IBAT6U,r3
0506 mtspr IBAT6L,r3
0507 mtspr IBAT7U,r3
0508 mtspr IBAT7L,r3
0509 2:
0510 mtspr DBAT0U,r3
0511 mtspr DBAT0L,r3
0512 mtspr DBAT1U,r3
0513 mtspr DBAT1L,r3
0514 mtspr DBAT2U,r3
0515 mtspr DBAT2L,r3
0516 mtspr DBAT3U,r3
0517 mtspr DBAT3L,r3
0518 1:
0519 mtspr IBAT0U,r3
0520 mtspr IBAT0L,r3
0521 mtspr IBAT1U,r3
0522 mtspr IBAT1L,r3
0523 mtspr IBAT2U,r3
0524 mtspr IBAT2L,r3
0525 mtspr IBAT3U,r3
0526 mtspr IBAT3L,r3
0527 sync
0528 isync
0529 blr
0530