2012-10-30 77 views
1

我正在開發用於microblaze體系結構的cpufreq驅動程序(作爲可加載的內核模塊)。我有一些能夠擴展系統時鐘的FPGA邏輯,並且工作得很好。我遵循Documentation/cpu-freq/cpu-drivers.txt中的信息並查看了blackfin cpufreq驅動程序中的模型。什麼linux內核代碼創建/ sys/devices/system/cpu/cpuX?

我還對arch/microblaze/Kconfig進行了必要的更改,以便將cpufreq選項內置到內核中(而不是模塊)。

當我第一次加載驅動程序,cpufreq_register_driver()返回-ENODEV,這意味着它找不到CPU。我將驅動程序標誌設置爲CPUFREQ_STICKY並能夠插入模塊。

但是,此時我意識到/sys/devices/system/cpu/cpu0不存在(儘管/sys/devices/system/cpu/cpufreq在那裏)。那麼,爲什麼呢?內核代碼的哪部分負責創建該目錄?

回答

1

我發現其中/sys/devices/system/cpu/cpuX的sysfs入口被在drivers/cpufreq/cpufreq.ccpufreq_cpu_callback()創建。這有一個電話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驅動不同的州長。現在我只需要以1/3的時鐘速率,而不是3秒,讓sleep 1需要1秒!

相關問題