Какой код ядра Linux создает /sys/devices/system/cpu/cpuX?

Я разрабатываю драйвер cpufreq (как загружаемый модуль ядра) для архитектуры microblaze. У меня есть некоторая логика ПЛИС, которая может масштабировать системные часы, и она работает довольно хорошо. Я следил за информацией в Documentation/cpu-freq/cpu-drivers.txt и посмотрел на модель в драйвере blackfin cpufreq.

Я также внес необходимые изменения в 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; register_cpu(), Для большинства архитектур это в arch/${ARCH}/kernel/setup.c, и я использовал черный код в качестве примера.

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 секунд!

Другие вопросы по тегам