]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
MIPS: SMP-CPS: Fix address for GCR_ACCESS register for CM3 and later
authorGregory CLEMENT <gregory.clement@bootlin.com>
Mon, 22 Jul 2024 13:15:39 +0000 (15:15 +0200)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Tue, 23 Jul 2024 07:30:13 +0000 (09:30 +0200)
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>
arch/mips/include/asm/mips-cm.h
arch/mips/kernel/smp-cps.c

index c2930a75b7e44b956b3ef63731d71b25be57628c..1e782275850a36beb2425bd58272b248e5ee750f 100644 (file)
@@ -240,6 +240,10 @@ GCR_ACCESSOR_RO(32, 0x0d0, gic_status)
 GCR_ACCESSOR_RO(32, 0x0f0, cpc_status)
 #define CM_GCR_CPC_STATUS_EX                   BIT(0)
 
+/* GCR_ACCESS - Controls core/IOCU access to GCRs */
+GCR_ACCESSOR_RW(32, 0x120, access_cm3)
+#define CM_GCR_ACCESS_ACCESSEN                 GENMASK(7, 0)
+
 /* GCR_L2_CONFIG - Indicates L2 cache configuration when Config5.L2C=1 */
 GCR_ACCESSOR_RW(32, 0x130, l2_config)
 #define CM_GCR_L2_CONFIG_BYPASS                        BIT(20)
index 9cc087dd1c1940d3dc5d43eebf1846c73e7fb6cd..395622c373258ffac15760fb54b8ad02d4e933f2 100644 (file)
@@ -317,7 +317,10 @@ static void boot_core(unsigned int core, unsigned int vpe_id)
        write_gcr_co_reset_ext_base(CM_GCR_Cx_RESET_EXT_BASE_UEB);
 
        /* Ensure the core can access the GCRs */
-       set_gcr_access(1 << core);
+       if (mips_cm_revision() < CM_REV_CM3)
+               set_gcr_access(1 << core);
+       else
+               set_gcr_access_cm3(1 << core);
 
        if (mips_cpc_present()) {
                /* Reset the core */