Add secondary CPUs processor frequency for e500 core
authorHaiying Wang <Haiying.Wang@freescale.com>
Thu, 15 Jan 2009 16:58:35 +0000 (11:58 -0500)
committerAndrew Fleming-AFLEMING <afleming@freescale.com>
Fri, 23 Jan 2009 23:03:14 +0000 (17:03 -0600)
This patch updates e500 freqProcessor to array based on CONFIG_NUM_CPUS,
and prints each CPU's frequency separately. It also fixes up each CPU's
frequency in "clock-frequency" of fdt blob.

Signed-off-by: James Yang <James.Yang@freescale.com>
Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
cpu/mpc85xx/cpu.c
cpu/mpc85xx/fdt.c
cpu/mpc85xx/speed.c
include/e500.h

index 15ba7f1c5ed25992ae82588bed3ffa282f8449bb..a34e2515e8002416f887a6a764ef0717f0173fbb 100644 (file)
@@ -90,6 +90,7 @@ int checkcpu (void)
 #else
        u32 ddr_ratio = 0;
 #endif
+       int i;
 
        svr = get_svr();
        ver = SVR_SOC_VER(svr);
@@ -141,8 +142,10 @@ int checkcpu (void)
 
        get_sys_info(&sysinfo);
 
-       puts("Clock Configuration:\n");
-       printf("       CPU:%-4s MHz, ", strmhz(buf1, sysinfo.freqProcessor));
+       puts("Clock Configuration:\n       ");
+       for (i = 0; i < CONFIG_NUM_CPUS; i++)
+               printf("CPU%d:%-4s MHz, ",
+                               i,strmhz(buf1, sysinfo.freqProcessor[i]));
        printf("CCB:%-4s MHz,\n", strmhz(buf1, sysinfo.freqSystemBus));
 
        switch (ddr_ratio) {
index 69fab995270f32d252df12cd4ab5d193bc1d2a17..1fae47c2dcd320079f2f5a1989d2ce5c13ff1b01 100644 (file)
@@ -213,6 +213,10 @@ void fdt_add_enet_stashing(void *fdt)
 
 void ft_cpu_setup(void *blob, bd_t *bd)
 {
+       int off;
+       int val;
+       sys_info_t sysinfo;
+
        /* delete crypto node if not on an E-processor */
        if (!IS_E_PROCESSOR(get_svr()))
                fdt_fixup_crypto_node(blob, 0);
@@ -228,8 +232,15 @@ void ft_cpu_setup(void *blob, bd_t *bd)
                "timebase-frequency", bd->bi_busfreq / 8, 1);
        do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
                "bus-frequency", bd->bi_busfreq, 1);
-       do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
-               "clock-frequency", bd->bi_intfreq, 1);
+       get_sys_info(&sysinfo);
+       off = fdt_node_offset_by_prop_value(blob, -1, "device_type", "cpu", 4);
+       while (off != -FDT_ERR_NOTFOUND) {
+               u32 *reg = (u32 *)fdt_getprop(blob, off, "reg", 0);
+               val = cpu_to_fdt32(sysinfo.freqProcessor[*reg]);
+               fdt_setprop(blob, off, "clock-frequency", &val, 4);
+               off = fdt_node_offset_by_prop_value(blob, off, "device_type",
+                                                       "cpu", 4);
+       }
        do_fixup_by_prop_u32(blob, "device_type", "soc", 4,
                "bus-frequency", bd->bi_busfreq, 1);
 
index 0d55228b641f7ba9cc8b298cc6f8fcd3cac1ec15..b0f47e042e96455120d38e397f8f20c6d0397648 100644 (file)
@@ -39,17 +39,19 @@ void get_sys_info (sys_info_t * sysInfo)
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        uint plat_ratio,e500_ratio,half_freqSystemBus;
        uint lcrr_div;
+       int i;
 
        plat_ratio = (gur->porpllsr) & 0x0000003e;
        plat_ratio >>= 1;
        sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ;
-       e500_ratio = (gur->porpllsr) & 0x003f0000;
-       e500_ratio >>= 16;
 
        /* Divide before multiply to avoid integer
         * overflow for processor speeds above 2GHz */
        half_freqSystemBus = sysInfo->freqSystemBus/2;
-       sysInfo->freqProcessor = e500_ratio*half_freqSystemBus;
+       for (i = 0; i < CONFIG_NUM_CPUS; i++) {
+               e500_ratio = ((gur->porpllsr) >> (i * 8 + 16)) & 0x3f;
+               sysInfo->freqProcessor[i] = e500_ratio * half_freqSystemBus;
+       }
 
        /* Note: freqDDRBus is the MCLK frequency, not the data rate. */
        sysInfo->freqDDRBus = sysInfo->freqSystemBus;
@@ -105,7 +107,7 @@ int get_clocks (void)
        dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT;
 #endif
        get_sys_info (&sys_info);
-       gd->cpu_clk = sys_info.freqProcessor;
+       gd->cpu_clk = sys_info.freqProcessor[0];
        gd->bus_clk = sys_info.freqSystemBus;
        gd->mem_clk = sys_info.freqDDRBus;
        gd->lbc_clk = sys_info.freqLocalBus;
index 9d3c8417c01ae31df7b7479226b44741f9f9e535..4c5eeb74e1485119bf4c99d7d5da4fbc04e724fc 100644 (file)
@@ -8,9 +8,13 @@
 
 #ifndef __ASSEMBLY__
 
+#ifndef CONFIG_NUM_CPUS
+#define CONFIG_NUM_CPUS 1
+#endif
+
 typedef struct
 {
-  unsigned long freqProcessor;
+  unsigned long freqProcessor[CONFIG_NUM_CPUS];
   unsigned long freqSystemBus;
   unsigned long freqDDRBus;
   unsigned long freqLocalBus;