|
@@ -179,10 +179,47 @@ in_flash:
|
|
|
#endif
|
|
|
#endif /* CFG_RAMBOOT */
|
|
|
|
|
|
- bl setup_stack_in_data_cache_on_r1
|
|
|
+ /* setup the bats */
|
|
|
+ bl setup_bats
|
|
|
+ sync
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Cache must be enabled here for stack-in-cache trick.
|
|
|
+ * This means we need to enable the BATS.
|
|
|
+ * This means:
|
|
|
+ * 1) for the EVB, original gt regs need to be mapped
|
|
|
+ * 2) need to have an IBAT for the 0xf region,
|
|
|
+ * we are running there!
|
|
|
+ * Cache should be turned on after BATs, since by default
|
|
|
+ * everything is write-through.
|
|
|
+ * The init-mem BAT can be reused after reloc. The old
|
|
|
+ * gt-regs BAT can be reused after board_init_f calls
|
|
|
+ * board_early_init_f (EVB only).
|
|
|
+ */
|
|
|
+ /* enable address translation */
|
|
|
+ bl enable_addr_trans
|
|
|
+ sync
|
|
|
+
|
|
|
+ /* enable and invalidate the data cache */
|
|
|
+ bl dcache_enable
|
|
|
+ sync
|
|
|
+#ifdef CFG_INIT_RAM_LOCK
|
|
|
+ bl lock_ram_in_cache
|
|
|
+ sync
|
|
|
+#endif
|
|
|
+
|
|
|
+ /* set up the stack pointer in our newly created
|
|
|
+ * cache-ram (r1) */
|
|
|
+ lis r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
|
|
|
+ ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
|
|
|
+
|
|
|
+ li r0, 0 /* Make room for stack frame header and */
|
|
|
+ stwu r0, -4(r1) /* clear final stack frame so that */
|
|
|
+ stwu r0, -4(r1) /* stack backtraces terminate cleanly */
|
|
|
+
|
|
|
|
|
|
/* let the C-code set up the rest */
|
|
|
- /* */
|
|
|
+ /* */
|
|
|
/* Be careful to keep code relocatable & stack humble */
|
|
|
/*------------------------------------------------------*/
|
|
|
|
|
@@ -509,6 +546,221 @@ init_e300_core: /* time t 10 */
|
|
|
/*------------------------------*/
|
|
|
blr
|
|
|
|
|
|
+ .globl invalidate_bats
|
|
|
+invalidate_bats:
|
|
|
+ /* invalidate BATs */
|
|
|
+ mtspr IBAT0U, r0
|
|
|
+ mtspr IBAT1U, r0
|
|
|
+ mtspr IBAT2U, r0
|
|
|
+ mtspr IBAT3U, r0
|
|
|
+#if (CFG_HID2 & HID2_HBE)
|
|
|
+ mtspr IBAT4U, r0
|
|
|
+ mtspr IBAT5U, r0
|
|
|
+ mtspr IBAT6U, r0
|
|
|
+ mtspr IBAT7U, r0
|
|
|
+#endif
|
|
|
+ isync
|
|
|
+ mtspr DBAT0U, r0
|
|
|
+ mtspr DBAT1U, r0
|
|
|
+ mtspr DBAT2U, r0
|
|
|
+ mtspr DBAT3U, r0
|
|
|
+#if (CFG_HID2 & HID2_HBE)
|
|
|
+ mtspr DBAT4U, r0
|
|
|
+ mtspr DBAT5U, r0
|
|
|
+ mtspr DBAT6U, r0
|
|
|
+ mtspr DBAT7U, r0
|
|
|
+#endif
|
|
|
+ isync
|
|
|
+ sync
|
|
|
+ blr
|
|
|
+
|
|
|
+ /* setup_bats - set them up to some initial state */
|
|
|
+ .globl setup_bats
|
|
|
+setup_bats:
|
|
|
+ addis r0, r0, 0x0000
|
|
|
+
|
|
|
+ /* IBAT 0 */
|
|
|
+ addis r4, r0, CFG_IBAT0L@h
|
|
|
+ ori r4, r4, CFG_IBAT0L@l
|
|
|
+ addis r3, r0, CFG_IBAT0U@h
|
|
|
+ ori r3, r3, CFG_IBAT0U@l
|
|
|
+ mtspr IBAT0L, r4
|
|
|
+ mtspr IBAT0U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 0 */
|
|
|
+ addis r4, r0, CFG_DBAT0L@h
|
|
|
+ ori r4, r4, CFG_DBAT0L@l
|
|
|
+ addis r3, r0, CFG_DBAT0U@h
|
|
|
+ ori r3, r3, CFG_DBAT0U@l
|
|
|
+ mtspr DBAT0L, r4
|
|
|
+ mtspr DBAT0U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 1 */
|
|
|
+ addis r4, r0, CFG_IBAT1L@h
|
|
|
+ ori r4, r4, CFG_IBAT1L@l
|
|
|
+ addis r3, r0, CFG_IBAT1U@h
|
|
|
+ ori r3, r3, CFG_IBAT1U@l
|
|
|
+ mtspr IBAT1L, r4
|
|
|
+ mtspr IBAT1U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 1 */
|
|
|
+ addis r4, r0, CFG_DBAT1L@h
|
|
|
+ ori r4, r4, CFG_DBAT1L@l
|
|
|
+ addis r3, r0, CFG_DBAT1U@h
|
|
|
+ ori r3, r3, CFG_DBAT1U@l
|
|
|
+ mtspr DBAT1L, r4
|
|
|
+ mtspr DBAT1U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 2 */
|
|
|
+ addis r4, r0, CFG_IBAT2L@h
|
|
|
+ ori r4, r4, CFG_IBAT2L@l
|
|
|
+ addis r3, r0, CFG_IBAT2U@h
|
|
|
+ ori r3, r3, CFG_IBAT2U@l
|
|
|
+ mtspr IBAT2L, r4
|
|
|
+ mtspr IBAT2U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 2 */
|
|
|
+ addis r4, r0, CFG_DBAT2L@h
|
|
|
+ ori r4, r4, CFG_DBAT2L@l
|
|
|
+ addis r3, r0, CFG_DBAT2U@h
|
|
|
+ ori r3, r3, CFG_DBAT2U@l
|
|
|
+ mtspr DBAT2L, r4
|
|
|
+ mtspr DBAT2U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 3 */
|
|
|
+ addis r4, r0, CFG_IBAT3L@h
|
|
|
+ ori r4, r4, CFG_IBAT3L@l
|
|
|
+ addis r3, r0, CFG_IBAT3U@h
|
|
|
+ ori r3, r3, CFG_IBAT3U@l
|
|
|
+ mtspr IBAT3L, r4
|
|
|
+ mtspr IBAT3U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 3 */
|
|
|
+ addis r4, r0, CFG_DBAT3L@h
|
|
|
+ ori r4, r4, CFG_DBAT3L@l
|
|
|
+ addis r3, r0, CFG_DBAT3U@h
|
|
|
+ ori r3, r3, CFG_DBAT3U@l
|
|
|
+ mtspr DBAT3L, r4
|
|
|
+ mtspr DBAT3U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+#if (CFG_HID2 & HID2_HBE)
|
|
|
+ /* IBAT 4 */
|
|
|
+ addis r4, r0, CFG_IBAT4L@h
|
|
|
+ ori r4, r4, CFG_IBAT4L@l
|
|
|
+ addis r3, r0, CFG_IBAT4U@h
|
|
|
+ ori r3, r3, CFG_IBAT4U@l
|
|
|
+ mtspr IBAT4L, r4
|
|
|
+ mtspr IBAT4U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 4 */
|
|
|
+ addis r4, r0, CFG_DBAT4L@h
|
|
|
+ ori r4, r4, CFG_DBAT4L@l
|
|
|
+ addis r3, r0, CFG_DBAT4U@h
|
|
|
+ ori r3, r3, CFG_DBAT4U@l
|
|
|
+ mtspr DBAT4L, r4
|
|
|
+ mtspr DBAT4U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 5 */
|
|
|
+ addis r4, r0, CFG_IBAT5L@h
|
|
|
+ ori r4, r4, CFG_IBAT5L@l
|
|
|
+ addis r3, r0, CFG_IBAT5U@h
|
|
|
+ ori r3, r3, CFG_IBAT5U@l
|
|
|
+ mtspr IBAT5L, r4
|
|
|
+ mtspr IBAT5U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 5 */
|
|
|
+ addis r4, r0, CFG_DBAT5L@h
|
|
|
+ ori r4, r4, CFG_DBAT5L@l
|
|
|
+ addis r3, r0, CFG_DBAT5U@h
|
|
|
+ ori r3, r3, CFG_DBAT5U@l
|
|
|
+ mtspr DBAT5L, r4
|
|
|
+ mtspr DBAT5U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 6 */
|
|
|
+ addis r4, r0, CFG_IBAT6L@h
|
|
|
+ ori r4, r4, CFG_IBAT6L@l
|
|
|
+ addis r3, r0, CFG_IBAT6U@h
|
|
|
+ ori r3, r3, CFG_IBAT6U@l
|
|
|
+ mtspr IBAT6L, r4
|
|
|
+ mtspr IBAT6U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 6 */
|
|
|
+ addis r4, r0, CFG_DBAT6L@h
|
|
|
+ ori r4, r4, CFG_DBAT6L@l
|
|
|
+ addis r3, r0, CFG_DBAT6U@h
|
|
|
+ ori r3, r3, CFG_DBAT6U@l
|
|
|
+ mtspr DBAT6L, r4
|
|
|
+ mtspr DBAT6U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* IBAT 7 */
|
|
|
+ addis r4, r0, CFG_IBAT7L@h
|
|
|
+ ori r4, r4, CFG_IBAT7L@l
|
|
|
+ addis r3, r0, CFG_IBAT7U@h
|
|
|
+ ori r3, r3, CFG_IBAT7U@l
|
|
|
+ mtspr IBAT7L, r4
|
|
|
+ mtspr IBAT7U, r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* DBAT 7 */
|
|
|
+ addis r4, r0, CFG_DBAT7L@h
|
|
|
+ ori r4, r4, CFG_DBAT7L@l
|
|
|
+ addis r3, r0, CFG_DBAT7U@h
|
|
|
+ ori r3, r3, CFG_DBAT7U@l
|
|
|
+ mtspr DBAT7L, r4
|
|
|
+ mtspr DBAT7U, r3
|
|
|
+ isync
|
|
|
+#endif
|
|
|
+
|
|
|
+ /* Invalidate TLBs.
|
|
|
+ * -> for (val = 0; val < 0x20000; val+=0x1000)
|
|
|
+ * -> tlbie(val);
|
|
|
+ */
|
|
|
+ lis r3, 0
|
|
|
+ lis r5, 2
|
|
|
+
|
|
|
+1:
|
|
|
+ tlbie r3
|
|
|
+ addi r3, r3, 0x1000
|
|
|
+ cmp 0, 0, r3, r5
|
|
|
+ blt 1b
|
|
|
+
|
|
|
+ blr
|
|
|
+
|
|
|
+ .globl enable_addr_trans
|
|
|
+enable_addr_trans:
|
|
|
+ /* enable address translation */
|
|
|
+ mfmsr r5
|
|
|
+ ori r5, r5, (MSR_IR | MSR_DR)
|
|
|
+ mtmsr r5
|
|
|
+ isync
|
|
|
+ blr
|
|
|
+
|
|
|
+ .globl disable_addr_trans
|
|
|
+disable_addr_trans:
|
|
|
+ /* disable address translation */
|
|
|
+ mflr r4
|
|
|
+ mfmsr r3
|
|
|
+ andi. r0, r3, (MSR_IR | MSR_DR)
|
|
|
+ beqlr
|
|
|
+ andc r3, r3, r0
|
|
|
+ mtspr SRR0, r4
|
|
|
+ mtspr SRR1, r3
|
|
|
+ rfi
|
|
|
+
|
|
|
/* Cache functions.
|
|
|
*
|
|
|
* Note: requires that all cache bits in
|
|
@@ -550,26 +802,25 @@ icache_status:
|
|
|
.globl dcache_enable
|
|
|
dcache_enable:
|
|
|
mfspr r3, HID0
|
|
|
- ori r3, r3, HID0_ENABLE_DATA_CACHE
|
|
|
- lis r4, 0
|
|
|
- ori r4, r4, HID0_LOCK_DATA_CACHE
|
|
|
- andc r3, r3, r4
|
|
|
- ori r4, r3, HID0_LOCK_INSTRUCTION_CACHE
|
|
|
- sync
|
|
|
- mtspr HID0, r4 /* sets enable and invalidate, clears lock */
|
|
|
+ li r5, HID0_DCFI|HID0_DLOCK
|
|
|
+ andc r3, r3, r5
|
|
|
+ mtspr HID0, r3 /* no invalidate, unlock */
|
|
|
+ ori r3, r3, HID0_DCE
|
|
|
+ ori r5, r3, HID0_DCFI
|
|
|
+ mtspr HID0, r5 /* enable + invalidate */
|
|
|
+ mtspr HID0, r3 /* enable */
|
|
|
sync
|
|
|
- mtspr HID0, r3 /* clears invalidate */
|
|
|
blr
|
|
|
|
|
|
.globl dcache_disable
|
|
|
dcache_disable:
|
|
|
mfspr r3, HID0
|
|
|
lis r4, 0
|
|
|
- ori r4, r4, HID0_ENABLE_DATA_CACHE|HID0_LOCK_DATA_CACHE
|
|
|
+ ori r4, r4, HID0_DCE|HID0_DLOCK
|
|
|
andc r3, r3, r4
|
|
|
- ori r4, r3, HID0_INVALIDATE_DATA_CACHE
|
|
|
+ ori r4, r3, HID0_DCI
|
|
|
sync
|
|
|
- mtspr HID0, r4 /* sets invalidate, clears enable and lock */
|
|
|
+ mtspr HID0, r4 /* sets invalidate, clears enable and lock */
|
|
|
sync
|
|
|
mtspr HID0, r3 /* clears invalidate */
|
|
|
blr
|
|
@@ -674,46 +925,29 @@ relocate_code:
|
|
|
* Now flush the cache: note that we must start from a cache aligned
|
|
|
* address. Otherwise we might miss one cache line.
|
|
|
*/
|
|
|
-4:
|
|
|
- bl un_setup_stack_in_data_cache
|
|
|
- mr r7, r3
|
|
|
- mr r8, r4
|
|
|
- bl dcache_disable
|
|
|
- mr r3, r7
|
|
|
- mr r4, r8
|
|
|
-
|
|
|
- cmpwi r6,0
|
|
|
+4: cmpwi r6,0
|
|
|
add r5,r3,r5
|
|
|
- beq 7f /* Always flush prefetch queue in any case */
|
|
|
+ beq 7f /* Always flush prefetch queue in any case */
|
|
|
subi r0,r6,1
|
|
|
andc r3,r3,r0
|
|
|
- mfspr r7,HID0 /* don't do dcbst if dcache is disabled*/
|
|
|
- rlwinm r7,r7,HID0_DCE_SHIFT,31,31
|
|
|
- cmpwi r7,0
|
|
|
- beq 9f
|
|
|
mr r4,r3
|
|
|
5: dcbst 0,r4
|
|
|
add r4,r4,r6
|
|
|
cmplw r4,r5
|
|
|
blt 5b
|
|
|
- sync /* Wait for all dcbst to complete on bus */
|
|
|
-9: mfspr r7,HID0 /* don't do icbi if icache is disabled */
|
|
|
- rlwinm r7,r7,HID0_DCE_SHIFT,31,31
|
|
|
- cmpwi r7,0
|
|
|
- beq 7f
|
|
|
+ sync /* Wait for all dcbst to complete on bus */
|
|
|
mr r4,r3
|
|
|
6: icbi 0,r4
|
|
|
add r4,r4,r6
|
|
|
cmplw r4,r5
|
|
|
blt 6b
|
|
|
-7: sync /* Wait for all icbi to complete on bus */
|
|
|
+7: sync /* Wait for all icbi to complete on bus */
|
|
|
isync
|
|
|
|
|
|
/*
|
|
|
* We are done. Do not return, instead branch to second part of board
|
|
|
* initialization, now running from RAM.
|
|
|
*/
|
|
|
-
|
|
|
addi r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
|
|
|
mtlr r0
|
|
|
blr
|
|
@@ -871,6 +1105,27 @@ trap_reloc:
|
|
|
blr
|
|
|
|
|
|
#ifdef CFG_INIT_RAM_LOCK
|
|
|
+lock_ram_in_cache:
|
|
|
+ /* Allocate Initial RAM in data cache.
|
|
|
+ */
|
|
|
+ lis r3, (CFG_INIT_RAM_ADDR & ~31)@h
|
|
|
+ ori r3, r3, (CFG_INIT_RAM_ADDR & ~31)@l
|
|
|
+ li r2, ((CFG_INIT_RAM_END & ~31) + \
|
|
|
+ (CFG_INIT_RAM_ADDR & 31) + 31) / 32
|
|
|
+ mtctr r2
|
|
|
+1:
|
|
|
+ dcbz r0, r3
|
|
|
+ addi r3, r3, 32
|
|
|
+ bdnz 1b
|
|
|
+
|
|
|
+ /* Lock the data cache */
|
|
|
+ mfspr r0, HID0
|
|
|
+ ori r0, r0, 0x1000
|
|
|
+ sync
|
|
|
+ mtspr HID0, r0
|
|
|
+ sync
|
|
|
+ blr
|
|
|
+
|
|
|
.globl unlock_ram_in_cache
|
|
|
unlock_ram_in_cache:
|
|
|
/* invalidate the INIT_RAM section */
|
|
@@ -884,6 +1139,15 @@ unlock_ram_in_cache:
|
|
|
bdnz 1b
|
|
|
sync /* Wait for all icbi to complete on bus */
|
|
|
isync
|
|
|
+
|
|
|
+ /* Unlock the data cache and invalidate it */
|
|
|
+ mfspr r3, HID0
|
|
|
+ li r5, HID0_DLOCK|HID0_DCFI
|
|
|
+ andc r3, r3, r5 /* no invalidate, unlock */
|
|
|
+ ori r5, r3, HID0_DCFI /* invalidate, unlock */
|
|
|
+ mtspr HID0, r5 /* invalidate, unlock */
|
|
|
+ mtspr HID0, r3 /* no invalidate, unlock */
|
|
|
+ sync
|
|
|
blr
|
|
|
#endif
|
|
|
|
|
@@ -952,148 +1216,3 @@ remap_flash_by_law0:
|
|
|
stw r4, LBLAWBAR1(r3)
|
|
|
stw r4, LBLAWAR1(r3) /* Off LBIU LAW1 */
|
|
|
blr
|
|
|
-
|
|
|
-setup_stack_in_data_cache_on_r1:
|
|
|
- lis r3, (CFG_IMMRBAR)@h
|
|
|
-
|
|
|
- /* setup D-BAT for the D-Cache (with out real memory backup) */
|
|
|
-
|
|
|
- lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
|
|
|
- mtspr DBAT0U, r4
|
|
|
- ori r4, r4, 0x0002
|
|
|
- mtspr DBAT0L, r4
|
|
|
- isync
|
|
|
-
|
|
|
-#if 0
|
|
|
- /* Enable MMU */
|
|
|
- mfmsr r4
|
|
|
- ori r4, r4, (MSR_DR | MSR_IR)@l
|
|
|
- mtmsr r4
|
|
|
-#endif
|
|
|
-
|
|
|
- /* Enable and invalidate data cache. */
|
|
|
- mfspr r4, HID0
|
|
|
- mr r5, r4
|
|
|
- ori r4, r4, HID0_DCE | HID0_DCI
|
|
|
- ori r5, r5, HID0_DCE
|
|
|
- sync
|
|
|
- mtspr HID0, r4
|
|
|
- mtspr HID0, r5
|
|
|
- sync
|
|
|
-
|
|
|
- /* Allocate Initial RAM in data cache.*/
|
|
|
- li r0, 0
|
|
|
- lis r4, (CFG_INIT_RAM_ADDR)@h
|
|
|
- ori r4, r4, (CFG_INIT_RAM_ADDR)@l
|
|
|
- li r5, 128*8 /* 128*8*32=32Kb */
|
|
|
- mtctr r5
|
|
|
-1:
|
|
|
- dcbz r0, r4
|
|
|
- addi r4, r4, 32
|
|
|
- bdnz 1b
|
|
|
- isync
|
|
|
-
|
|
|
- /* Lock all the D-cache, basically leaving the reset of the program without dcache */
|
|
|
- mfspr r4, HID0
|
|
|
- ori r4, r4, (HID0_DLOCK)@l
|
|
|
- sync
|
|
|
- mtspr HID0 , r4
|
|
|
-
|
|
|
- /* setup the stack pointer in r1 */
|
|
|
- lis r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
|
|
|
- ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
|
|
|
- li r0, 0 /* Make room for stack frame header and */
|
|
|
-
|
|
|
- stwu r0, -4(r1) /* clear final stack frame so that */
|
|
|
- stwu r0, -4(r1) /* stack backtraces terminate cleanly */
|
|
|
-
|
|
|
- blr
|
|
|
-
|
|
|
-un_setup_stack_in_data_cache:
|
|
|
- blr
|
|
|
- mr r14, r4
|
|
|
- mr r15, r5
|
|
|
-
|
|
|
-
|
|
|
- lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
|
|
|
- mtspr DBAT0U, r4
|
|
|
- ori r4, r4, 0x0002
|
|
|
- mtspr DBAT0L, r4
|
|
|
- isync
|
|
|
-
|
|
|
- /* un lock all the D-cache */
|
|
|
- mfspr r4, HID0
|
|
|
- lis r5, (~(HID0_DLOCK))@h
|
|
|
- ori r5, r5, (~(HID0_DLOCK))@l
|
|
|
- and r4, r4, r5
|
|
|
- sync
|
|
|
- mtspr HID0 , r4
|
|
|
-
|
|
|
- /* Re - Allocate Initial RAM in data cache.*/
|
|
|
- li r0, 0
|
|
|
- lis r4, (CFG_INIT_RAM_ADDR)@h
|
|
|
- ori r4, r4, (CFG_INIT_RAM_ADDR)@l
|
|
|
- li r5, 128*8 /* 128*8*32=32Kb */
|
|
|
- mtctr r5
|
|
|
-1:
|
|
|
- dcbz r0, r4
|
|
|
- addi r4, r4, 32
|
|
|
- bdnz 1b
|
|
|
- isync
|
|
|
-
|
|
|
- mflr r16
|
|
|
- bl dcache_disable
|
|
|
- mtlr r16
|
|
|
-
|
|
|
- blr
|
|
|
-
|
|
|
-#if 0
|
|
|
-#define GREEN_LIGHT 0x2B0D4046
|
|
|
-#define RED_LIGHT 0x250D4046
|
|
|
-#define LIB_CNT 0x4FFF
|
|
|
-
|
|
|
-/*
|
|
|
- * Lib Light
|
|
|
- */
|
|
|
-
|
|
|
- .globl liblight
|
|
|
-liblight:
|
|
|
- lis r3, CFG_IMMRBAR@h
|
|
|
- ori r3, r3, CFG_IMMRBAR@l
|
|
|
- li r4, 0x3002
|
|
|
- mtmsr r4
|
|
|
- xor r4, r4, r4
|
|
|
- mtspr HID0, r4
|
|
|
- mtspr HID2, r4
|
|
|
- lis r4, 0xF8000000@h
|
|
|
- ori r4, r4, 0xF8000000@l
|
|
|
- stw r4, LBLAWBAR1(r3)
|
|
|
- lis r4, 0x8000000E@h
|
|
|
- ori r4, r4, 0x8000000E@l
|
|
|
- stw r4, LBLAWAR1(r3)
|
|
|
- lis r4, 0xF8000801@h
|
|
|
- ori r4, r4, 0xF8000801@l
|
|
|
- stw r4, BR1(r3)
|
|
|
- lis r4, 0xFFFFE8f0@h
|
|
|
- ori r4, r4, 0xFFFFE8f0@l
|
|
|
- stw r4, OR1(r3)
|
|
|
-
|
|
|
- lis r4, 0xF8000000@h
|
|
|
- ori r4, r4, 0xF8000000@l
|
|
|
- lis r5, GREEN_LIGHT@h
|
|
|
- ori r5, r5, GREEN_LIGHT@l
|
|
|
- lis r6, RED_LIGHT@h
|
|
|
- ori r6, r6, RED_LIGHT@l
|
|
|
- lis r7, LIB_CNT@h
|
|
|
- ori r7, r7, LIB_CNT@l
|
|
|
-
|
|
|
-1:
|
|
|
- stw r5, 0(r4)
|
|
|
- mtctr r7
|
|
|
-2: bdnz 2b
|
|
|
- stw r6, 0(r4)
|
|
|
- mtctr r7
|
|
|
-3: bdnz 3b
|
|
|
- b 1b
|
|
|
-
|
|
|
-#endif
|