|
@@ -200,7 +200,7 @@ void config_8560_ioports (volatile ccsr_cpm_t * cpm)
|
|
|
|
|
|
#ifdef CONFIG_SYS_FSL_CPC
|
|
|
#if defined(CONFIG_RAMBOOT_PBL) || defined(CONFIG_SYS_CPC_REINIT_F)
|
|
|
-static void disable_cpc_sram(void)
|
|
|
+void disable_cpc_sram(void)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -251,7 +251,7 @@ static void enable_tdm_law(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-static void enable_cpc(void)
|
|
|
+void enable_cpc(void)
|
|
|
{
|
|
|
int i;
|
|
|
u32 size = 0;
|
|
@@ -306,6 +306,7 @@ static void invalidate_cpc(void)
|
|
|
#else
|
|
|
#define enable_cpc()
|
|
|
#define invalidate_cpc()
|
|
|
+#define disable_cpc_sram()
|
|
|
#endif /* CONFIG_SYS_FSL_CPC */
|
|
|
|
|
|
/*
|
|
@@ -546,88 +547,15 @@ int enable_cluster_l2(void)
|
|
|
|
|
|
/*
|
|
|
* Initialize L2 as cache.
|
|
|
- *
|
|
|
- * The newer 8548, etc, parts have twice as much cache, but
|
|
|
- * use the same bit-encoding as the older 8555, etc, parts.
|
|
|
- *
|
|
|
*/
|
|
|
-int cpu_init_r(void)
|
|
|
+int l2cache_init(void)
|
|
|
{
|
|
|
__maybe_unused u32 svr = get_svr();
|
|
|
-#ifdef CONFIG_SYS_LBC_LCRR
|
|
|
- fsl_lbc_t *lbc = (void __iomem *)LBC_BASE_ADDR;
|
|
|
-#endif
|
|
|
#ifdef CONFIG_L2_CACHE
|
|
|
ccsr_l2cache_t *l2cache = (void __iomem *)CONFIG_SYS_MPC85xx_L2_ADDR;
|
|
|
#elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) && defined(CONFIG_E6500)
|
|
|
struct ccsr_cluster_l2 * l2cache = (void __iomem *)CONFIG_SYS_FSL_CLUSTER_1_L2;
|
|
|
#endif
|
|
|
-#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP)
|
|
|
- extern int spin_table_compat;
|
|
|
- const char *spin;
|
|
|
-#endif
|
|
|
-#ifdef CONFIG_SYS_FSL_ERRATUM_SEC_A003571
|
|
|
- ccsr_sec_t __iomem *sec = (void *)CONFIG_SYS_FSL_SEC_ADDR;
|
|
|
-#endif
|
|
|
-#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \
|
|
|
- defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011)
|
|
|
- /*
|
|
|
- * CPU22 and NMG_CPU_A011 share the same workaround.
|
|
|
- * CPU22 applies to P4080 rev 1.0, 2.0, fixed in 3.0
|
|
|
- * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0
|
|
|
- * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1, both
|
|
|
- * fixed in 2.0. NMG_CPU_A011 is activated by default and can
|
|
|
- * be disabled by hwconfig with syntax:
|
|
|
- *
|
|
|
- * fsl_cpu_a011:disable
|
|
|
- */
|
|
|
- extern int enable_cpu_a011_workaround;
|
|
|
-#ifdef CONFIG_SYS_P4080_ERRATUM_CPU22
|
|
|
- enable_cpu_a011_workaround = (SVR_MAJ(svr) < 3);
|
|
|
-#else
|
|
|
- char buffer[HWCONFIG_BUFFER_SIZE];
|
|
|
- char *buf = NULL;
|
|
|
- int n, res;
|
|
|
-
|
|
|
- n = getenv_f("hwconfig", buffer, sizeof(buffer));
|
|
|
- if (n > 0)
|
|
|
- buf = buffer;
|
|
|
-
|
|
|
- res = hwconfig_arg_cmp_f("fsl_cpu_a011", "disable", buf);
|
|
|
- if (res > 0)
|
|
|
- enable_cpu_a011_workaround = 0;
|
|
|
- else {
|
|
|
- if (n >= HWCONFIG_BUFFER_SIZE) {
|
|
|
- printf("fsl_cpu_a011 was not found. hwconfig variable "
|
|
|
- "may be too long\n");
|
|
|
- }
|
|
|
- enable_cpu_a011_workaround =
|
|
|
- (SVR_SOC_VER(svr) == SVR_P4080 && SVR_MAJ(svr) < 3) ||
|
|
|
- (SVR_SOC_VER(svr) != SVR_P4080 && SVR_MAJ(svr) < 2);
|
|
|
- }
|
|
|
-#endif
|
|
|
- if (enable_cpu_a011_workaround) {
|
|
|
- flush_dcache();
|
|
|
- mtspr(L1CSR2, (mfspr(L1CSR2) | L1CSR2_DCWS));
|
|
|
- sync();
|
|
|
- }
|
|
|
-#endif
|
|
|
-#ifdef CONFIG_SYS_FSL_ERRATUM_A005812
|
|
|
- /*
|
|
|
- * A-005812 workaround sets bit 32 of SPR 976 for SoCs running
|
|
|
- * in write shadow mode. Checking DCWS before setting SPR 976.
|
|
|
- */
|
|
|
- if (mfspr(L1CSR2) & L1CSR2_DCWS)
|
|
|
- mtspr(SPRN_HDBCR0, (mfspr(SPRN_HDBCR0) | 0x80000000));
|
|
|
-#endif
|
|
|
-
|
|
|
-#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP)
|
|
|
- spin = getenv("spin_table_compat");
|
|
|
- if (spin && (*spin == 'n'))
|
|
|
- spin_table_compat = 0;
|
|
|
- else
|
|
|
- spin_table_compat = 1;
|
|
|
-#endif
|
|
|
|
|
|
puts ("L2: ");
|
|
|
|
|
@@ -752,6 +680,89 @@ skip_l2:
|
|
|
puts("disabled\n");
|
|
|
#endif
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ *
|
|
|
+ * The newer 8548, etc, parts have twice as much cache, but
|
|
|
+ * use the same bit-encoding as the older 8555, etc, parts.
|
|
|
+ *
|
|
|
+ */
|
|
|
+int cpu_init_r(void)
|
|
|
+{
|
|
|
+ __maybe_unused u32 svr = get_svr();
|
|
|
+#ifdef CONFIG_SYS_LBC_LCRR
|
|
|
+ fsl_lbc_t *lbc = (void __iomem *)LBC_BASE_ADDR;
|
|
|
+#endif
|
|
|
+#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP)
|
|
|
+ extern int spin_table_compat;
|
|
|
+ const char *spin;
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_SYS_FSL_ERRATUM_SEC_A003571
|
|
|
+ ccsr_sec_t __iomem *sec = (void *)CONFIG_SYS_FSL_SEC_ADDR;
|
|
|
+#endif
|
|
|
+#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \
|
|
|
+ defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011)
|
|
|
+ /*
|
|
|
+ * CPU22 and NMG_CPU_A011 share the same workaround.
|
|
|
+ * CPU22 applies to P4080 rev 1.0, 2.0, fixed in 3.0
|
|
|
+ * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0
|
|
|
+ * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1, both
|
|
|
+ * fixed in 2.0. NMG_CPU_A011 is activated by default and can
|
|
|
+ * be disabled by hwconfig with syntax:
|
|
|
+ *
|
|
|
+ * fsl_cpu_a011:disable
|
|
|
+ */
|
|
|
+ extern int enable_cpu_a011_workaround;
|
|
|
+#ifdef CONFIG_SYS_P4080_ERRATUM_CPU22
|
|
|
+ enable_cpu_a011_workaround = (SVR_MAJ(svr) < 3);
|
|
|
+#else
|
|
|
+ char buffer[HWCONFIG_BUFFER_SIZE];
|
|
|
+ char *buf = NULL;
|
|
|
+ int n, res;
|
|
|
+
|
|
|
+ n = getenv_f("hwconfig", buffer, sizeof(buffer));
|
|
|
+ if (n > 0)
|
|
|
+ buf = buffer;
|
|
|
+
|
|
|
+ res = hwconfig_arg_cmp_f("fsl_cpu_a011", "disable", buf);
|
|
|
+ if (res > 0) {
|
|
|
+ enable_cpu_a011_workaround = 0;
|
|
|
+ } else {
|
|
|
+ if (n >= HWCONFIG_BUFFER_SIZE) {
|
|
|
+ printf("fsl_cpu_a011 was not found. hwconfig variable "
|
|
|
+ "may be too long\n");
|
|
|
+ }
|
|
|
+ enable_cpu_a011_workaround =
|
|
|
+ (SVR_SOC_VER(svr) == SVR_P4080 && SVR_MAJ(svr) < 3) ||
|
|
|
+ (SVR_SOC_VER(svr) != SVR_P4080 && SVR_MAJ(svr) < 2);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ if (enable_cpu_a011_workaround) {
|
|
|
+ flush_dcache();
|
|
|
+ mtspr(L1CSR2, (mfspr(L1CSR2) | L1CSR2_DCWS));
|
|
|
+ sync();
|
|
|
+ }
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_SYS_FSL_ERRATUM_A005812
|
|
|
+ /*
|
|
|
+ * A-005812 workaround sets bit 32 of SPR 976 for SoCs running
|
|
|
+ * in write shadow mode. Checking DCWS before setting SPR 976.
|
|
|
+ */
|
|
|
+ if (mfspr(L1CSR2) & L1CSR2_DCWS)
|
|
|
+ mtspr(SPRN_HDBCR0, (mfspr(SPRN_HDBCR0) | 0x80000000));
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(CONFIG_PPC_SPINTABLE_COMPATIBLE) && defined(CONFIG_MP)
|
|
|
+ spin = getenv("spin_table_compat");
|
|
|
+ if (spin && (*spin == 'n'))
|
|
|
+ spin_table_compat = 0;
|
|
|
+ else
|
|
|
+ spin_table_compat = 1;
|
|
|
+#endif
|
|
|
+
|
|
|
+ l2cache_init();
|
|
|
#if defined(CONFIG_RAMBOOT_PBL)
|
|
|
disable_cpc_sram();
|
|
|
#endif
|