2

microblazeアーキテクチャ用のcpufreqドライバー(ロード可能なカーネルモジュールとして)を開発しています。オンシステムクロックをスケーリングできるFPGAロジックがいくつかあり、非常にうまく機能します。の情報に従い、Documentation/cpu-freq/cpu-drivers.txtblackfincpufreqドライバーのモデルを確認しました。

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を見て、sysfsエントリが作成された場所を見つけcpufreq_cpu_callback()ましたdrivers/cpufreq/cpufreq.cget_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は3秒ではなく1/3のクロックレートで1秒かかるようにする必要があります!

于 2012-11-02T01:53:03.997 に答える