2012-10-30 5 views
1

Я разрабатываю драйвер cpufreq (как загружаемый модуль ядра) для архитектуры microblaze. У меня есть FPGA-логика, которая способна масштабировать встроенные часы, и работает очень хорошо. Я следил за информацией в Documentation/cpu-freq/cpu-drivers.txt и смотрел модель в драйвере blackfin cpufreq.Какой код ядра linux создает/sys/devices/system/cpu/cpuX?

Я также внесли необходимые изменения в arch/microblaze/Kconfig, чтобы опции cpufreq были встроены в ядро ​​(а не модули).

Когда я впервые загрузил драйвер, cpufreq_register_driver() возвращал -ENODEV, что подразумевало, что он не смог найти процессор. Я установил флаг драйвера CPUFREQ_STICKY и смог вставить модуль.

Однако в этот момент я понял, что /sys/devices/system/cpu/cpu0 нет (хотя /sys/devices/system/cpu/cpufreq есть). Итак, почему? Какая часть кода ядра отвечает за создание этого каталога?

ответ

1

Я обнаружил, где запись /sys/devices/system/cpu/cpuX sysfs была создана, посмотрев на cpufreq_cpu_callback() в drivers/cpufreq/cpufreq.c. У этого есть звонок get_cpu_sysdev(), который я предположил, был тем элементом, который я искал.

Этот вызов определен в drivers/base/cpu.c, где я также заметил код, который объединяет конкретную запись sysdev cpu; 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 секунду при 1/3 тактовой частоты вместо 3 секунд!