Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [PATCH 03/12] arch_topology: Make it avilable for MIPS | Date | Wed, 08 Apr 2020 19:23:04 +0100 |
| |
(+ Dietmar)
On 08/04/20 12:34, Jiaxun Yang wrote: > @@ -275,7 +224,64 @@ static void parsing_done_workfn(struct work_struct *work) > core_initcall(free_raw_capacity); > #endif > > -#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) > +#if defined(CONFIG_OF) && !defined(CONFIG_ARM) > +#if defined(CONFIG_COMMON_CLK) > +bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
We actually use this for arm:
arch/arm/kernel/topology.o: In function `init_cpu_topology': topology.c:(.init.text+0xc8): undefined reference to `topology_parse_cpu_capacity'
So that doesn't work. TBH I'd be quite happy to see the ifdef(ARCH) go away entirely; it's shame that arm is using some of those names already. I think some of that is due to the CPU efficiency faff, if we can't get rid of it / align those then perhaps the next best thing is to make some of those definitions __weak.
> +{ > + struct clk *cpu_clk; > + static bool cap_parsing_failed; > + int ret; > + u32 cpu_capacity; > + > + if (cap_parsing_failed) > + return false; > + > + ret = of_property_read_u32(cpu_node, "capacity-dmips-mhz", > + &cpu_capacity); > + if (!ret) { > + if (!raw_capacity) { > + raw_capacity = kcalloc(num_possible_cpus(), > + sizeof(*raw_capacity), > + GFP_KERNEL); > + if (!raw_capacity) { > + cap_parsing_failed = true; > + return false; > + } > + } > + raw_capacity[cpu] = cpu_capacity; > + pr_debug("cpu_capacity: %pOF cpu_capacity=%u (raw)\n", > + cpu_node, raw_capacity[cpu]); > + > + /* > + * Update freq_factor for calculating early boot cpu capacities. > + * For non-clk CPU DVFS mechanism, there's no way to get the > + * frequency value now, assuming they are running at the same > + * frequency (by keeping the initial freq_factor value). > + */ > + cpu_clk = of_clk_get(cpu_node, 0); > + if (!PTR_ERR_OR_ZERO(cpu_clk)) { > + per_cpu(freq_factor, cpu) = > + clk_get_rate(cpu_clk) / 1000; > + clk_put(cpu_clk); > + } > + } else { > + if (raw_capacity) { > + pr_err("cpu_capacity: missing %pOF raw capacity\n", > + cpu_node); > + pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n"); > + } > + cap_parsing_failed = true; > + free_raw_capacity(); > + } > + > + return !ret; > +} > +#else > +bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu) > +{ > + return false; > +} > +#endif /* CONFIG_COMMON_CLK */ > /* > * This function returns the logic cpu number of the node. > * There are basically three kinds of return values:
| |