diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-12-04 03:58:56 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-12-04 03:58:56 +0000 |
commit | 1d67e90f19a7acfd9a05dc59678e7d0c5090bd0d (patch) | |
tree | 357efc7b93f8f5102110d20d293f41360ec212fc /arch/ppc/kernel/misc.S | |
parent | aea27b2e18d69af87e673972246e66657b4fa274 (diff) |
Merge with Linux 2.3.21.
Diffstat (limited to 'arch/ppc/kernel/misc.S')
-rw-r--r-- | arch/ppc/kernel/misc.S | 174 |
1 files changed, 102 insertions, 72 deletions
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index c4bed05e9..32be1899a 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S @@ -45,17 +45,34 @@ _GLOBAL(reloc_offset) mtlr r0 blr -_GLOBAL(__cli) +/* void __no_use_save_flags(unsigned long *flags) */ +_GLOBAL(__no_use_save_flags) + mfmsr r4 + stw r4,0(r3) + blr + +/* void __no_use_restore_flags(unsigned long flags) */ +_GLOBAL(__no_use_restore_flags) + andi. r4,r3,MSR_EE + bne 10f + lis r4,ppc_n_lost_interrupts@ha + lwz r4,ppc_n_lost_interrupts@l(r4) + cmpi 0,r4,0 /* lost interrupts to process first? */ + bne- do_lost_interrupts +10: sync + mtmsr r3 + isync + blr + +_GLOBAL(__no_use_cli) mfmsr r0 /* Get current interrupt state */ rlwinm r3,r0,16+1,32-1,31 /* Extract old value of 'EE' */ - li r4,0 /* Need [unsigned] value of MSR_EE */ - ori r4,r4,MSR_EE /* Set to turn off bit */ - andc r0,r0,r4 /* Clears bit in (r4) */ + rlwinm r0,r0,0,17,15 /* clear MSR_EE in r0 */ sync /* Some chip revs have problems here... */ mtmsr r0 /* Update machine state */ blr /* Done */ -_GLOBAL(__sti) +_GLOBAL(__no_use_sti) lis r4,ppc_n_lost_interrupts@ha lwz r4,ppc_n_lost_interrupts@l(r4) mfmsr r3 /* Get current state */ @@ -472,6 +489,7 @@ _GLOBAL(_outsl_ns) * * ashrdi3: XXXYYY/ZZZAAA -> SSSXXX/YYYZZZ * ashldi3: XXXYYY/ZZZAAA -> YYYZZZ/AAA000 + * lshrdi3: XXXYYY/ZZZAAA -> 000XXX/YYYZZZ */ _GLOBAL(__ashrdi3) li r6,32 @@ -481,7 +499,7 @@ _GLOBAL(__ashrdi3) or r4,r4,r7 /* YYYZZZ */ sraw r3,r3,r5 /* SSSXXX */ blr - + _GLOBAL(__ashldi3) li r6,32 sub r6,r6,r5 @@ -491,6 +509,15 @@ _GLOBAL(__ashldi3) or r3,r3,r7 /* YYYZZZ */ blr +_GLOBAL(__lshrdi3) + li r6,32 + sub r6,r6,r5 + slw r7,r3,r6 /* isolate YYY */ + srw r4,r4,r5 /* isolate ZZZ */ + or r4,r4,r7 /* YYYZZZ */ + srw r3,r3,r5 /* 000XXX */ + blr + _GLOBAL(abs) cmpi 0,r3,0 bge 10f @@ -553,36 +580,42 @@ _GLOBAL(_get_PVR) Author: Terry Greeniaus (tgree@phys.ualberta.ca) Please e-mail updates to this file to me, thanks! */ +/* Usage: + + When setting the L2CR register, you must do a few special + things. If you are enabling the cache, you must perform a + global invalidate. If you are disabling the cache, you must + flush the cache contents first. This routine takes care of + doing these things. When first enabling the cache, make sure + you pass in the L2CR you want, as well as passing in the + global invalidate bit set. A global invalidate will only be + performed if the L2I bit is set in applyThis. When enabling + the cache, you should also set the L2E bit in applyThis. If + you want to modify the L2CR contents after the cache has been + enabled, the recommended procedure is to first call + __setL2CR(0) to disable the cache and then call it again with + the new values for L2CR. Examples: + + _setL2CR(0) - disables the cache + _setL2CR(0xB3A04000) - enables my G3 upgrade card: + - L2E set to turn on the cache + - L2SIZ set to 1MB + - L2CLK set to 1:1 + - L2RAM set to pipelined synchronous late-write + - L2I set to perform a global invalidation + - L2OH set to 0.5 nS + - L2DF set because this upgrade card + requires it + + A similar call should work for your card. You need to know + the correct setting for your card and then place them in the + fields I have outlined above. Other fields support optional + features, such as L2DO which caches only data, or L2TS which + causes cache pushes from the L1 cache to go to the L2 cache + instead of to main memory. +*/ _GLOBAL(_set_L2CR) - /* Usage: - - When setting the L2CR register, you must do a few special things. If you are enabling the - cache, you must perform a global invalidate. If you are disabling the cache, you must - flush the cache contents first. This routine takes care of doing these things. When first - enabling the cache, make sure you pass in the L2CR you want, as well as passing in the - global invalidate bit set. A global invalidate will only be performed if the L2I bit is set - in applyThis. When enabling the cache, you should also set the L2E bit in applyThis. If you - want to modify the L2CR contents after the cache has been enabled, the recommended - procedure is to first call __setL2CR(0) to disable the cache and then call it again with - the new values for L2CR. Examples: - - _setL2CR(0) - disables the cache - _setL2CR(0xB3A04000) - enables my G3 upgrade card: - - L2E set to turn on the cache - - L2SIZ set to 1MB - - L2CLK set to 1:1 - - L2RAM set to pipelined syncronous late-write - - L2I set to perform a global invalidation - - L2OH set to 0.5 nS - - L2DF set because this upgrade card requires it - - A similar call should work for your card. You need to know the correct setting for your - card and then place them in the fields I have outlined above. Other fields support optional - features, such as L2DO which caches only data, or L2TS which causes cache pushes from - the L1 cache to go to the L2 cache instead of to main memory. - */ - /* Make sure this is a 750 chip */ mfspr r4,PVR rlwinm r4,r4,16,16,31 @@ -594,76 +627,74 @@ _GLOBAL(_set_L2CR) thisIs750: /* Get the current enable bit of the L2CR into r4 */ mfspr r4,L2CR - rlwinm r4,r4,0,0,0 + mfmsr r7 /* See if we want to perform a global inval this time. */ - rlwinm r6,r3,0,10,10 /* r6 contains the new invalidate bit */ - rlwinm. r5,r3,0,0,0 /* r5 contains the new enable bit */ - rlwinm r3,r3,0,11,9 /* Turn off the invalidate bit */ - rlwinm r3,r3,0,1,31 /* Turn off the enable bit */ - or r3,r3,r4 /* Keep the enable bit the same as it was for now. */ - bne dontDisableCache /* Only disable the cache if L2CRApply has the enable bit off */ + rlwinm r6,r3,0,10,10 /* r6 contains the new invalidate bit */ + rlwinm. r5,r3,0,0,0 /* r5 contains the new enable bit */ + rlwinm r3,r3,0,11,9 /* Turn off the invalidate bit */ + rlwimi r3,r4,0,0,0 /* Keep the enable bit the same as it was. */ + bne dontDisableCache /* Only disable the cache if L2CRApply + has the enable bit off */ disableCache: - /* Disable the cache. First, we turn off data relocation. */ - mfmsr r7 - rlwinm r4,r7,0,28,26 /* Turn off DR bit */ - rlwinm r4,r4,0,17,15 /* Turn off EE bit - an external exception while we are flushing - the cache is fatal (comment this line and see!) */ + /* Disable the cache. First, we turn off interrupts. + An interrupt while we are flushing the cache could bring + in data which may not get properly flushed. */ + rlwinm r4,r7,0,17,15 /* Turn off EE bit */ sync mtmsr r4 sync - /* - Now, read the first 2MB of memory to put new data in the cache. - (Actually we only need the size of the L2 cache plus - the size of the L1 cache, but 2MB will cover everything just to be safe). - */ +/* + Now, read the first 2MB of memory to put new data in the cache. + (Actually we only need the size of the L2 cache plus the size + of the L1 cache, but 2MB will cover everything just to be safe). +*/ lis r4,0x0001 mtctr r4 - li r4,0 -loadLoop: - lwzx r0,r0,r4 + lis r4,KERNELBASE@h +1: lwzx r0,r0,r4 addi r4,r4,0x0020 /* Go to start of next cache line */ - bdnz loadLoop + bdnz 1b /* Now, flush the first 2MB of memory */ lis r4,0x0001 mtctr r4 - li r4,0 + lis r4,KERNELBASE@h sync -flushLoop: - dcbf r0,r4 +2: dcbf r0,r4 addi r4,r4,0x0020 /* Go to start of next cache line */ - bdnz flushLoop + bdnz 2b /* Turn off the L2CR enable bit. */ rlwinm r3,r3,0,1,31 - /* Reenable data relocation. */ - sync - mtmsr r7 - sync - dontDisableCache: /* Set up the L2CR configuration bits */ sync mtspr L2CR,r3 sync + + /* Reenable interrupts if necessary. */ + mtmsr r7 + sync + cmplwi r6,0 beq noInval /* Perform a global invalidation */ oris r3,r3,0x0020 sync - mtspr 1017,r3 + mtspr L2CR,r3 sync -invalCompleteLoop: /* Wait for the invalidation to complete */ - mfspr r3,1017 + + /* Wait for the invalidation to complete */ +3: mfspr r3,L2CR rlwinm. r4,r3,0,31,31 - bne invalCompleteLoop + bne 3b - rlwinm r3,r3,0,11,9; /* Turn off the L2I bit */ + rlwinm r3,r3,0,11,9 /* Turn off the L2I bit */ sync mtspr L2CR,r3 sync @@ -672,8 +703,7 @@ noInval: /* See if we need to enable the cache */ cmplwi r5,0 beqlr - -enableCache: + /* Enable the cache */ oris r3,r3,0x8000 mtspr L2CR,r3 @@ -967,7 +997,7 @@ sys_call_table: .long sys_getresuid /* 165 */ .long sys_query_module .long sys_poll -#ifdef CONFIG_NFSD +#ifdef CONFIG_NFSD .long sys_nfsservctl #else .long sys_ni_syscall |