~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/powerpc/kernel/cpu_setup_ppc970.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-or-later */
  2 /*
  3  * This file contains low level CPU setup functions.
  4  *    Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
  5  */
  6 
  7 #include <asm/processor.h>
  8 #include <asm/page.h>
  9 #include <asm/cputable.h>
 10 #include <asm/ppc_asm.h>
 11 #include <asm/asm-offsets.h>
 12 #include <asm/cache.h>
 13 
 14 _GLOBAL(__cpu_preinit_ppc970)
 15         /* Do nothing if not running in HV mode */
 16         mfmsr   r0
 17         rldicl. r0,r0,4,63
 18         beqlr
 19 
 20         /* Make sure HID4:rm_ci is off before MMU is turned off, that large
 21          * pages are enabled with HID4:61 and clear HID5:DCBZ_size and
 22          * HID5:DCBZ32_ill
 23          */
 24         li      r0,0
 25         mfspr   r3,SPRN_HID4
 26         rldimi  r3,r0,40,23     /* clear bit 23 (rm_ci) */
 27         rldimi  r3,r0,2,61      /* clear bit 61 (lg_pg_en) */
 28         sync
 29         mtspr   SPRN_HID4,r3
 30         isync
 31         sync
 32         mfspr   r3,SPRN_HID5
 33         rldimi  r3,r0,6,56      /* clear bits 56 & 57 (DCBZ*) */
 34         sync
 35         mtspr   SPRN_HID5,r3
 36         isync
 37         sync
 38 
 39         /* Setup some basic HID1 features */
 40         mfspr   r0,SPRN_HID1
 41         li      r3,0x1200               /* enable i-fetch cacheability */
 42         sldi    r3,r3,44                /* and prefetch */
 43         or      r0,r0,r3
 44         mtspr   SPRN_HID1,r0
 45         mtspr   SPRN_HID1,r0
 46         isync
 47 
 48         /* Clear HIOR */
 49         li      r0,0
 50         sync
 51         mtspr   SPRN_HIOR,0             /* Clear interrupt prefix */
 52         isync
 53         blr
 54 
 55 /* Definitions for the table use to save CPU states */
 56 #define CS_HID0         0
 57 #define CS_HID1         8
 58 #define CS_HID4         16
 59 #define CS_HID5         24
 60 #define CS_SIZE         32
 61 
 62         .data
 63         .balign L1_CACHE_BYTES,0
 64 cpu_state_storage:
 65         .space  CS_SIZE
 66         .balign L1_CACHE_BYTES,0
 67         .text
 68 
 69 
 70 _GLOBAL(__setup_cpu_ppc970)
 71         /* Do nothing if not running in HV mode */
 72         mfmsr   r0
 73         rldicl. r0,r0,4,63
 74         beq     no_hv_mode
 75 
 76         mfspr   r0,SPRN_HID0
 77         li      r11,5                   /* clear DOZE and SLEEP */
 78         rldimi  r0,r11,52,8             /* set NAP and DPM */
 79         li      r11,0
 80         rldimi  r0,r11,32,31            /* clear EN_ATTN */
 81         b       load_hids               /* Jump to shared code */
 82 
 83 
 84 _GLOBAL(__setup_cpu_ppc970MP)
 85         /* Do nothing if not running in HV mode */
 86         mfmsr   r0
 87         rldicl. r0,r0,4,63
 88         beq     no_hv_mode
 89 
 90         mfspr   r0,SPRN_HID0
 91         li      r11,0x15                /* clear DOZE and SLEEP */
 92         rldimi  r0,r11,52,6             /* set DEEPNAP, NAP and DPM */
 93         li      r11,0
 94         rldimi  r0,r11,32,31            /* clear EN_ATTN */
 95 
 96 load_hids:
 97         mtspr   SPRN_HID0,r0
 98         mfspr   r0,SPRN_HID0
 99         mfspr   r0,SPRN_HID0
100         mfspr   r0,SPRN_HID0
101         mfspr   r0,SPRN_HID0
102         mfspr   r0,SPRN_HID0
103         mfspr   r0,SPRN_HID0
104         sync
105         isync
106 
107         /* Try to set LPES = 01 in HID4 */
108         mfspr   r0,SPRN_HID4
109         clrldi  r0,r0,1                 /* clear LPES0 */
110         ori     r0,r0,HID4_LPES1        /* set LPES1 */
111         sync
112         mtspr   SPRN_HID4,r0
113         isync
114 
115         /* Save away cpu state */
116         LOAD_REG_ADDR(r5,cpu_state_storage)
117 
118         /* Save HID0,1,4 and 5 */
119         mfspr   r3,SPRN_HID0
120         std     r3,CS_HID0(r5)
121         mfspr   r3,SPRN_HID1
122         std     r3,CS_HID1(r5)
123         mfspr   r4,SPRN_HID4
124         std     r4,CS_HID4(r5)
125         mfspr   r3,SPRN_HID5
126         std     r3,CS_HID5(r5)
127 
128         /* See if we successfully set LPES1 to 1; if not we are in Apple mode */
129         andi.   r4,r4,HID4_LPES1
130         bnelr
131 
132 no_hv_mode:
133         /* Disable CPU_FTR_HVMODE and exit, since we don't have HV mode */
134         ld      r5,CPU_SPEC_FEATURES(r4)
135         LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE)
136         andc    r5,r5,r6
137         std     r5,CPU_SPEC_FEATURES(r4)
138         blr
139 
140 /* Called with no MMU context (typically MSR:IR/DR off) to
141  * restore CPU state as backed up by the previous
142  * function. This does not include cache setting
143  */
144 _GLOBAL(__restore_cpu_ppc970)
145         /* Do nothing if not running in HV mode */
146         mfmsr   r0
147         rldicl. r0,r0,4,63
148         beqlr
149 
150         LOAD_REG_ADDR(r5,cpu_state_storage)
151         /* Before accessing memory, we make sure rm_ci is clear */
152         li      r0,0
153         mfspr   r3,SPRN_HID4
154         rldimi  r3,r0,40,23     /* clear bit 23 (rm_ci) */
155         sync
156         mtspr   SPRN_HID4,r3
157         isync
158         sync
159 
160         /* Clear interrupt prefix */
161         li      r0,0
162         sync
163         mtspr   SPRN_HIOR,0
164         isync
165 
166         /* Restore HID0 */
167         ld      r3,CS_HID0(r5)
168         sync
169         isync
170         mtspr   SPRN_HID0,r3
171         mfspr   r3,SPRN_HID0
172         mfspr   r3,SPRN_HID0
173         mfspr   r3,SPRN_HID0
174         mfspr   r3,SPRN_HID0
175         mfspr   r3,SPRN_HID0
176         mfspr   r3,SPRN_HID0
177         sync
178         isync
179 
180         /* Restore HID1 */
181         ld      r3,CS_HID1(r5)
182         sync
183         isync
184         mtspr   SPRN_HID1,r3
185         mtspr   SPRN_HID1,r3
186         sync
187         isync
188 
189         /* Restore HID4 */
190         ld      r3,CS_HID4(r5)
191         sync
192         isync
193         mtspr   SPRN_HID4,r3
194         sync
195         isync
196 
197         /* Restore HID5 */
198         ld      r3,CS_HID5(r5)
199         sync
200         isync
201         mtspr   SPRN_HID5,r3
202         sync
203         isync
204         blr
205 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php