|
@@ -76,8 +76,8 @@ void get_sys_info (sys_info_t * sysInfo)
|
|
[13] = 2, /* CC4 PPL / 2 */
|
|
[13] = 2, /* CC4 PPL / 2 */
|
|
[14] = 4, /* CC4 PPL / 4 */
|
|
[14] = 4, /* CC4 PPL / 4 */
|
|
};
|
|
};
|
|
- uint lcrr_div, i, freqCC_PLL[4], rcw_tmp;
|
|
|
|
- uint ratio[4];
|
|
|
|
|
|
+ uint i, freqCC_PLL[6], rcw_tmp;
|
|
|
|
+ uint ratio[6];
|
|
unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
|
|
unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
|
|
uint mem_pll_rat;
|
|
uint mem_pll_rat;
|
|
|
|
|
|
@@ -97,21 +97,139 @@ void get_sys_info (sys_info_t * sysInfo)
|
|
ratio[1] = (in_be32(&clk->pllc2gsr) >> 1) & 0x3f;
|
|
ratio[1] = (in_be32(&clk->pllc2gsr) >> 1) & 0x3f;
|
|
ratio[2] = (in_be32(&clk->pllc3gsr) >> 1) & 0x3f;
|
|
ratio[2] = (in_be32(&clk->pllc3gsr) >> 1) & 0x3f;
|
|
ratio[3] = (in_be32(&clk->pllc4gsr) >> 1) & 0x3f;
|
|
ratio[3] = (in_be32(&clk->pllc4gsr) >> 1) & 0x3f;
|
|
- for (i = 0; i < 4; i++) {
|
|
|
|
|
|
+ ratio[4] = (in_be32(&clk->pllc5gsr) >> 1) & 0x3f;
|
|
|
|
+ ratio[5] = (in_be32(&clk->pllc6gsr) >> 1) & 0x3f;
|
|
|
|
+ for (i = 0; i < 6; i++) {
|
|
if (ratio[i] > 4)
|
|
if (ratio[i] > 4)
|
|
freqCC_PLL[i] = sysclk * ratio[i];
|
|
freqCC_PLL[i] = sysclk * ratio[i];
|
|
else
|
|
else
|
|
freqCC_PLL[i] = sysInfo->freqSystemBus * ratio[i];
|
|
freqCC_PLL[i] = sysInfo->freqSystemBus * ratio[i];
|
|
}
|
|
}
|
|
- rcw_tmp = in_be32(&gur->rcwsr[3]);
|
|
|
|
|
|
+#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
|
|
|
|
+ /*
|
|
|
|
+ * Each cluster has up to 4 cores, sharing the same PLL selection.
|
|
|
|
+ * The cluster assignment is fixed per SoC. There is no way identify the
|
|
|
|
+ * assignment so far, presuming the "first configuration" which is to
|
|
|
|
+ * fill the lower cluster group first before moving up to next group.
|
|
|
|
+ * PLL1, PLL2, PLL3 are cluster group A, feeding core 0~3 on cluster 1
|
|
|
|
+ * and core 4~7 on cluster 2
|
|
|
|
+ * PLL4, PLL5, PLL6 are cluster group B, feeding core 8~11 on cluster 3
|
|
|
|
+ * and core 12~15 on cluster 4 if existing
|
|
|
|
+ */
|
|
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
|
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
|
- u32 c_pll_sel = (in_be32(&clk->clkc0csr + cpu*8) >> 27) & 0xf;
|
|
|
|
|
|
+ u32 c_pll_sel = (in_be32(&clk->clkc0csr + (cpu / 4) * 8) >> 27)
|
|
|
|
+ & 0xf;
|
|
u32 cplx_pll = core_cplx_PLL[c_pll_sel];
|
|
u32 cplx_pll = core_cplx_PLL[c_pll_sel];
|
|
|
|
+ if (cplx_pll > 3)
|
|
|
|
+ printf("Unsupported architecture configuration"
|
|
|
|
+ " in function %s\n", __func__);
|
|
|
|
+ cplx_pll += (cpu / 8) * 3;
|
|
|
|
|
|
sysInfo->freqProcessor[cpu] =
|
|
sysInfo->freqProcessor[cpu] =
|
|
freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel];
|
|
freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel];
|
|
}
|
|
}
|
|
|
|
+#define PME_CLK_SEL 0xe0000000
|
|
|
|
+#define PME_CLK_SHIFT 29
|
|
|
|
+#define FM1_CLK_SEL 0x1c000000
|
|
|
|
+#define FM1_CLK_SHIFT 26
|
|
|
|
+ rcw_tmp = in_be32(&gur->rcwsr[7]);
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_SYS_DPAA_PME
|
|
|
|
+ switch ((rcw_tmp & PME_CLK_SEL) >> PME_CLK_SHIFT) {
|
|
|
|
+ case 1:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[0];
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[0] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[0] / 3;
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[0] / 4;
|
|
|
|
+ break;
|
|
|
|
+ case 6:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[1] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 7:
|
|
|
|
+ sysInfo->freqPME = freqCC_PLL[1] / 3;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ printf("Error: Unknown PME clock select!\n");
|
|
|
|
+ case 0:
|
|
|
|
+ sysInfo->freqPME = sysInfo->freqSystemBus / 2;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
+#ifdef CONFIG_SYS_DPAA_FMAN
|
|
|
|
+ switch ((rcw_tmp & FM1_CLK_SEL) >> FM1_CLK_SHIFT) {
|
|
|
|
+ case 1:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[3];
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[3] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[3] / 3;
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[3] / 4;
|
|
|
|
+ break;
|
|
|
|
+ case 6:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[4] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 7:
|
|
|
|
+ sysInfo->freqFMan[0] = freqCC_PLL[4] / 3;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ printf("Error: Unknown FMan1 clock select!\n");
|
|
|
|
+ case 0:
|
|
|
|
+ sysInfo->freqFMan[0] = sysInfo->freqSystemBus / 2;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+#if (CONFIG_SYS_NUM_FMAN) == 2
|
|
|
|
+#define FM2_CLK_SEL 0x00000038
|
|
|
|
+#define FM2_CLK_SHIFT 3
|
|
|
|
+ rcw_tmp = in_be32(&gur->rcwsr[15]);
|
|
|
|
+ switch ((rcw_tmp & FM2_CLK_SEL) >> FM2_CLK_SHIFT) {
|
|
|
|
+ case 1:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[4];
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[4] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[4] / 3;
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[4] / 4;
|
|
|
|
+ break;
|
|
|
|
+ case 6:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[3] / 2;
|
|
|
|
+ break;
|
|
|
|
+ case 7:
|
|
|
|
+ sysInfo->freqFMan[1] = freqCC_PLL[3] / 3;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ printf("Error: Unknown FMan2 clock select!\n");
|
|
|
|
+ case 0:
|
|
|
|
+ sysInfo->freqFMan[1] = sysInfo->freqSystemBus / 2;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+#endif /* CONFIG_SYS_NUM_FMAN == 2 */
|
|
|
|
+#endif /* CONFIG_SYS_DPAA_FMAN */
|
|
|
|
+
|
|
|
|
+#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
|
|
|
+
|
|
|
|
+ for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
|
|
|
+ u32 c_pll_sel = (in_be32(&clk->clkc0csr + cpu*8) >> 27) & 0xf;
|
|
|
|
+ u32 cplx_pll = core_cplx_PLL[c_pll_sel];
|
|
|
|
+
|
|
|
|
+ sysInfo->freqProcessor[cpu] =
|
|
|
|
+ freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel];
|
|
|
|
+ }
|
|
#define PME_CLK_SEL 0x80000000
|
|
#define PME_CLK_SEL 0x80000000
|
|
#define FM1_CLK_SEL 0x40000000
|
|
#define FM1_CLK_SEL 0x40000000
|
|
#define FM2_CLK_SEL 0x20000000
|
|
#define FM2_CLK_SEL 0x20000000
|
|
@@ -159,11 +277,10 @@ void get_sys_info (sys_info_t * sysInfo)
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#else
|
|
|
|
- uint plat_ratio,e500_ratio,half_freqSystemBus;
|
|
|
|
-#if defined(CONFIG_FSL_LBC)
|
|
|
|
- uint lcrr_div;
|
|
|
|
-#endif
|
|
|
|
|
|
+#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
|
|
|
+
|
|
|
|
+#else /* CONFIG_FSL_CORENET */
|
|
|
|
+ uint plat_ratio, e500_ratio, half_freqSystemBus;
|
|
int i;
|
|
int i;
|
|
#ifdef CONFIG_QE
|
|
#ifdef CONFIG_QE
|
|
__maybe_unused u32 qe_ratio;
|
|
__maybe_unused u32 qe_ratio;
|
|
@@ -210,6 +327,7 @@ void get_sys_info (sys_info_t * sysInfo)
|
|
#endif /* CONFIG_FSL_CORENET */
|
|
#endif /* CONFIG_FSL_CORENET */
|
|
|
|
|
|
#if defined(CONFIG_FSL_LBC)
|
|
#if defined(CONFIG_FSL_LBC)
|
|
|
|
+ uint lcrr_div;
|
|
#if defined(CONFIG_SYS_LBC_LCRR)
|
|
#if defined(CONFIG_SYS_LBC_LCRR)
|
|
/* We will program LCRR to this value later */
|
|
/* We will program LCRR to this value later */
|
|
lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV;
|
|
lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV;
|