ARC: HSDK-4xD: add CSM configuration support
authorEugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Mon, 23 Mar 2020 18:50:03 +0000 (21:50 +0300)
committerAlexey Brodkin <abrodkin@synopsys.com>
Mon, 27 Apr 2020 08:20:27 +0000 (11:20 +0300)
Add support for CSM enable/disable and CSM relocation via
hsdk_init command. We allow to relocate CSM to the beginning of
any aperture even if HW support finer granularity.

Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
arch/arc/include/asm/arcregs.h
board/synopsys/hsdk/hsdk.c

index f3cd4a889ac8b063f59561adc482e7bf1bec7989..516c14e105b1d90c3702a9382e8185b7a2258316 100644 (file)
@@ -51,6 +51,9 @@
 #define ARC_AUX_DCCM_BASE      0x18    /* DCCM Base Addr ARCv2 */
 #define ARC_AUX_ICCM_BASE      0x208   /* ICCM Base Addr ARCv2 */
 
+/* CSM auxiliary registers */
+#define ARC_AUX_CSM_ENABLE     0x9A0
+
 /* Timer related auxiliary registers */
 #define ARC_AUX_TIMER0_CNT     0x21    /* Timer 0 count */
 #define ARC_AUX_TIMER0_CTRL    0x22    /* Timer 0 control */
index b25b1331874cf560a3c0879e6c2400fadcb1ff75..2cbb59d8092760d6ace30fc6b4365e9c6898b379 100644 (file)
@@ -80,6 +80,7 @@ struct hsdk_env_common_ctl {
        u32_env nvlim;
        u32_env icache;
        u32_env dcache;
+       u32_env csm_location;
        u32_env l2_cache;
 };
 
@@ -132,6 +133,7 @@ static const struct env_map_common env_map_common[] = {
        { "dcache_ena", ENV_HEX, true,  0, 1,           &env_common.dcache },
 #if defined(CONFIG_BOARD_HSDK_4XD)
        { "l2_cache_ena",       ENV_HEX, true,  0, 1,           &env_common.l2_cache },
+       { "csm_location",       ENV_HEX, true,  0, NO_CCM,      &env_common.csm_location },
 #endif /* CONFIG_BOARD_HSDK_4XD */
        {}
 };
@@ -299,6 +301,30 @@ static void init_cluster_slc(void)
                slc_disable();
 }
 
+#define CREG_CSM_BASE          (CREG_BASE + 0x210)
+
+static void init_cluster_csm(void)
+{
+       /* ARC HS38 in HSDK SoC doesn't include CSM */
+       if (!is_board_match_config(T_BOARD_HSDK_4XD))
+               return;
+
+       if (env_common.csm_location.val == NO_CCM) {
+               write_aux_reg(ARC_AUX_CSM_ENABLE, 0);
+       } else {
+               /*
+                * CSM base address is 256kByte aligned but we allow to map
+                * CSM only to aperture start (256MByte aligned)
+                * The field in CREG_CSM_BASE is in 17:2 bits itself so we need
+                * to shift it.
+                */
+               u32 csm_base = (env_common.csm_location.val * SZ_1K) << 2;
+
+               write_aux_reg(ARC_AUX_CSM_ENABLE, 1);
+               writel(csm_base, (void __iomem *)CREG_CSM_BASE);
+       }
+}
+
 static void init_master_icache(void)
 {
        if (icache_status()) {
@@ -678,6 +704,7 @@ static void do_init_cluster(void)
         * cores.
         */
        init_cluster_nvlim();
+       init_cluster_csm();
        init_cluster_slc();
 }