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

MIPS: SMP-CPS: Fix address for GCR_ACCESS register for CM3 and later

When the CM block migrated from CM2.5 to CM3.0, the address offset for
the Global CSR Access Privilege register was modified. We saw this in
the "MIPS64 I6500 Multiprocessing System Programmer's Guide," it is
stated that "the Global CSR Access Privilege register is located at
offset 0x0120" in section 5.4. It is at least the same for I6400.

This fix allows to use the VP cores in SMP mode if the reset values
were modified by the bootloader.

Based on the work of Vladimir Kondratiev
<vladimir.kondratiev@mobileye.com> and the feedback from Jiaxun Yang
<jiaxun.yang@flygoat.com>.

Fixes: 197e89e0984a ("MIPS: mips-cm: Implement mips_cm_revision")
Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>

authored by

Gregory CLEMENT and committed by
Thomas Bogendoerfer
a263e5f3 fa165f91

+8 -1
+4
arch/mips/include/asm/mips-cm.h
··· 240 240 GCR_ACCESSOR_RO(32, 0x0f0, cpc_status) 241 241 #define CM_GCR_CPC_STATUS_EX BIT(0) 242 242 243 + /* GCR_ACCESS - Controls core/IOCU access to GCRs */ 244 + GCR_ACCESSOR_RW(32, 0x120, access_cm3) 245 + #define CM_GCR_ACCESS_ACCESSEN GENMASK(7, 0) 246 + 243 247 /* GCR_L2_CONFIG - Indicates L2 cache configuration when Config5.L2C=1 */ 244 248 GCR_ACCESSOR_RW(32, 0x130, l2_config) 245 249 #define CM_GCR_L2_CONFIG_BYPASS BIT(20)
+4 -1
arch/mips/kernel/smp-cps.c
··· 317 317 write_gcr_co_reset_ext_base(CM_GCR_Cx_RESET_EXT_BASE_UEB); 318 318 319 319 /* Ensure the core can access the GCRs */ 320 - set_gcr_access(1 << core); 320 + if (mips_cm_revision() < CM_REV_CM3) 321 + set_gcr_access(1 << core); 322 + else 323 + set_gcr_access_cm3(1 << core); 321 324 322 325 if (mips_cpc_present()) { 323 326 /* Reset the core */