Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] ppc: L2 cache prefetch fixes on 745x

We run into problems if we blindly enable L2 prefetching without
checking that the L2 cache is actually enabled. Additionaly, if we
disable the L2 cache we need to ensure that we disable L2 prefetching.

Signed-off-by: Kumar Gala <kumar.gala@freescale.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Kumar Gala and committed by
Linus Torvalds
80ac2912 8085ce08

+34 -2
+4 -1
arch/ppc/kernel/cpu_setup_6xx.S
··· 249 249 sync 250 250 isync 251 251 252 - /* Enable L2 HW prefetch 252 + /* Enable L2 HW prefetch, if L2 is enabled 253 253 */ 254 + mfspr r3,SPRN_L2CR 255 + andis. r3,r3,L2CR_L2E@h 256 + beqlr 254 257 mfspr r3,SPRN_MSSCR0 255 258 ori r3,r3,3 256 259 sync
+30 -1
arch/ppc/kernel/l2cr.S
··· 156 156 The bit moved on the 7450..... 157 157 ****/ 158 158 159 + BEGIN_FTR_SECTION 160 + /* Disable L2 prefetch on some 745x and try to ensure 161 + * L2 prefetch engines are idle. As explained by errata 162 + * text, we can't be sure they are, we just hope very hard 163 + * that well be enough (sic !). At least I noticed Apple 164 + * doesn't even bother doing the dcbf's here... 165 + */ 166 + mfspr r4,SPRN_MSSCR0 167 + rlwinm r4,r4,0,0,29 168 + sync 169 + mtspr SPRN_MSSCR0,r4 170 + sync 171 + isync 172 + lis r4,KERNELBASE@h 173 + dcbf 0,r4 174 + dcbf 0,r4 175 + dcbf 0,r4 176 + dcbf 0,r4 177 + END_FTR_SECTION_IFSET(CPU_FTR_SPEC7450) 178 + 159 179 /* TODO: use HW flush assist when available */ 160 180 161 181 lis r4,0x0002 ··· 250 230 oris r3,r3,0x8000 251 231 mtspr SPRN_L2CR,r3 252 232 sync 253 - 233 + 234 + /* Enable L2 HW prefetch on 744x/745x */ 235 + BEGIN_FTR_SECTION 236 + mfspr r3,SPRN_MSSCR0 237 + ori r3,r3,3 238 + sync 239 + mtspr SPRN_MSSCR0,r3 240 + sync 241 + isync 242 + END_FTR_SECTION_IFSET(CPU_FTR_SPEC7450) 254 243 4: 255 244 256 245 /* Restore HID0[DPM] to whatever it was before */