|
@@ -82,7 +82,39 @@ struct cpu_type cpu_type_list [] = {
|
|
#endif
|
|
#endif
|
|
};
|
|
};
|
|
|
|
|
|
-struct cpu_type cpu_type_unknown = CPU_TYPE_ENTRY(Unknown, Unknown, 1);
|
|
|
|
|
|
+#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
|
|
|
|
+u32 compute_ppc_cpumask(void)
|
|
|
|
+{
|
|
|
|
+ ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
|
|
|
+ int i = 0, count = 0;
|
|
|
|
+ u32 cluster, mask = 0;
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ int j;
|
|
|
|
+ cluster = in_be32(&gur->tp_cluster[i++].lower);
|
|
|
|
+ for (j = 0; j < 4; j++) {
|
|
|
|
+ u32 idx = (cluster >> (j*8)) & TP_CLUSTER_INIT_MASK;
|
|
|
|
+ u32 type = in_be32(&gur->tp_ityp[idx]);
|
|
|
|
+
|
|
|
|
+ if (type & TP_ITYP_AV) {
|
|
|
|
+ if (TP_ITYP_TYPE(type) == TP_ITYP_TYPE_PPC)
|
|
|
|
+ mask |= 1 << count;
|
|
|
|
+ }
|
|
|
|
+ count++;
|
|
|
|
+ }
|
|
|
|
+ } while ((cluster & TP_CLUSTER_EOC) != TP_CLUSTER_EOC);
|
|
|
|
+
|
|
|
|
+ return mask;
|
|
|
|
+}
|
|
|
|
+#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
|
|
|
+/*
|
|
|
|
+ * Before chassis genenration 2, the cpumask should be hard-coded.
|
|
|
|
+ * In case of cpu type unknown or cpumask unset, use 1 as fail save.
|
|
|
|
+ */
|
|
|
|
+#define compute_ppc_cpumask() 1
|
|
|
|
+#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
|
|
|
+
|
|
|
|
+struct cpu_type cpu_type_unknown = CPU_TYPE_ENTRY(Unknown, Unknown, 0);
|
|
|
|
|
|
struct cpu_type *identify_cpu(u32 ver)
|
|
struct cpu_type *identify_cpu(u32 ver)
|
|
{
|
|
{
|
|
@@ -110,6 +142,9 @@ u32 cpu_mask()
|
|
return ((in_be32(&pic->frr) & MPC8xxx_PICFRR_NCPU_MASK) >>
|
|
return ((in_be32(&pic->frr) & MPC8xxx_PICFRR_NCPU_MASK) >>
|
|
MPC8xxx_PICFRR_NCPU_SHIFT) + 1;
|
|
MPC8xxx_PICFRR_NCPU_SHIFT) + 1;
|
|
|
|
|
|
|
|
+ if (cpu->num_cores == 0)
|
|
|
|
+ return compute_ppc_cpumask();
|
|
|
|
+
|
|
return cpu->mask;
|
|
return cpu->mask;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -117,13 +152,14 @@ u32 cpu_mask()
|
|
* Return the number of cores on this SOC.
|
|
* Return the number of cores on this SOC.
|
|
*/
|
|
*/
|
|
int cpu_numcores() {
|
|
int cpu_numcores() {
|
|
- ccsr_pic_t __iomem *pic = (void *)CONFIG_SYS_MPC8xxx_PIC_ADDR;
|
|
|
|
struct cpu_type *cpu = gd->cpu;
|
|
struct cpu_type *cpu = gd->cpu;
|
|
|
|
|
|
- /* better to query feature reporting register than just assume 1 */
|
|
|
|
- if (cpu == &cpu_type_unknown)
|
|
|
|
- return ((in_be32(&pic->frr) & MPC8xxx_PICFRR_NCPU_MASK) >>
|
|
|
|
- MPC8xxx_PICFRR_NCPU_SHIFT) + 1;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Report # of cores in terms of the cpu_mask if we haven't
|
|
|
|
+ * figured out how many there are yet
|
|
|
|
+ */
|
|
|
|
+ if (cpu->num_cores == 0)
|
|
|
|
+ return hweight32(cpu_mask());
|
|
|
|
|
|
return cpu->num_cores;
|
|
return cpu->num_cores;
|
|
}
|
|
}
|
|
@@ -135,9 +171,7 @@ int cpu_numcores() {
|
|
*/
|
|
*/
|
|
int is_core_valid(unsigned int core)
|
|
int is_core_valid(unsigned int core)
|
|
{
|
|
{
|
|
- struct cpu_type *cpu = gd->cpu;
|
|
|
|
-
|
|
|
|
- return !!((1 << core) & cpu->mask);
|
|
|
|
|
|
+ return !!((1 << core) & cpu_mask());
|
|
}
|
|
}
|
|
|
|
|
|
int probecpu (void)
|
|
int probecpu (void)
|
|
@@ -153,6 +187,19 @@ int probecpu (void)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Once in memory, compute mask & # cores once and save them off */
|
|
|
|
+int fixup_cpu(void)
|
|
|
|
+{
|
|
|
|
+ struct cpu_type *cpu = gd->cpu;
|
|
|
|
+
|
|
|
|
+ if (cpu->num_cores == 0) {
|
|
|
|
+ cpu->mask = cpu_mask();
|
|
|
|
+ cpu->num_cores = cpu_numcores();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Initializes on-chip ethernet controllers.
|
|
* Initializes on-chip ethernet controllers.
|
|
* to override, implement board_eth_init()
|
|
* to override, implement board_eth_init()
|