我正在为microblaze架构开发一个cpufreq驱动程序(作为可加载的内核模块)。我有一些FPGA逻辑能够扩展系统上的时钟,它运行良好。我已经按照Documentation/cpu-freq/cpu-drivers.txt
中的信息查看了blackfin cpufreq驱动程序中的模型。
我还对arch/microblaze/Kconfig
进行了必要的更改,以便将cpufreq选项内置到内核中(而非模块)。
当我第一次加载驱动程序时,cpufreq_register_driver()
正在返回-ENODEV,这意味着它无法找到CPU。我将驱动程序标志设置为CPUFREQ_STICKY并能够插入模块。
然而,此时我意识到/sys/devices/system/cpu/cpu0
不存在(尽管/sys/devices/system/cpu/cpufreq
存在)。那么,为什么呢?内核代码的哪一部分负责创建该目录?
答案 0 :(得分:1)
通过查看/sys/devices/system/cpu/cpuX
中的cpufreq_cpu_callback()
,我发现drivers/cpufreq/cpufreq.c
sysfs条目的创建位置。这可以调用get_cpu_sysdev()
,我认为这是我正在寻找的元素。
此调用在drivers/base/cpu.c
中定义,其中我还注意到将cpu特定的sysdev条目放在一起的代码; register_cpu()
。对于大多数体系结构,这是arch/${ARCH}/kernel/setup.c
,我使用blackfin代码作为示例。
DEFINE_PER_CPU(struct cpu, cpu_data);
static int __init topology_init(void)
{
unsigned int cpu;
for_each_possible_cpu(cpu) {
register_cpu(&per_cpu(cpu_data, cpu), cpu);
}
return 0;
}
将此代码添加到arch/microblaze/kernel/setup.c
后,我现在拥有了我需要的目录,并且我可以使用可用的不同调控器与我的cpufreq驱动程序通信。现在我只需要sleep 1
以1/3的时钟频率而不是3秒来获得1秒!