2

我正在为 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存在)。那么,这是为什么呢?内核代码的哪一部分负责创建该目录?

4

1 回答 1

2

/sys/devices/system/cpu/cpuX我通过查看cpufreq_cpu_callback()in发现了sysfs 条目的创建位置drivers/cpufreq/cpufreq.c。这有一个调用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 11/3 的时钟速率花费 1 秒而不是 3 秒!

于 2012-11-02T01:53:03.997 回答