Что означает ошибка ядра gpio gpiochip0 и как ее решить?

Как сказал @AndréBorie в своем комментарии, вам нужно скомпилировать QEMU с поддержкой GTK. Используйте ./configure --helpдля просмотра опций.

0
20.08.2021, 18:09
2 ответа

Эти сообщения генерируются кодом ввода-вывода общего назначения ядра, по-видимому, при попытке загрузить модуль, представленный этим патчем или его более развитым эквивалентом .

Короткая версия:

Модуль находит интерфейс программирования WMI, который ищет, но упускает из виду тот факт, что интерфейс сообщает об отсутствии управляемых линий GPIO в вашем оборудовании. Он должен был остановить попытку регистрации и отклонить установку модуля с кодом ошибки -ENODEV. Вы можете избавиться от сообщений, занеся модуль gpio-aaeonв черный список, т.е. создав файл с именем, например. /etc/modprobe.d/no-aaeon-gpio-here.confсо следующим содержанием:

blacklist gpio-aaeon

Вы обнаружили ошибку в этом модуле ядра и можете сообщить о ней разработчикам Linux GPIO . Ваше оборудование, кажется, представляет собой интересный «угловой случай» для тестирования модуля gpio_aaeon, который разработчики, по-видимому, не учли. Это понятно, так как модуль кажется довольно новым :, патч, на который я ссылался выше, был опубликован в конце мая этого года.


Длинная версия:

Подсистема GPIO жалуется на то, что модуль gpio_aaeonпопытался зарегистрировать микросхему, которая на самом деле не имеет линий ввода-вывода общего назначения для управления, поэтому нет смысла регистрировать такую ​​микросхему в подсистеме GPIO.

Регистрация происходит в функции датчика модуля:

+static int __init aaeon_gpio_probe(struct platform_device *pdev)
+{
+   int err, i;
+   int dio_number = 0;
+   struct aaeon_gpio_data *data;
+   struct aaeon_gpio_bank *bank;
+
+   /* Prevent other drivers adding this platfom device */
+   if (!wmi_has_guid(AAEON_WMI_MGMT_GUID)) {
+       pr_debug("AAEON Management GUID not found\n");
+       return -ENODEV;
+   }
+
+   dio_number = aaeon_gpio_get_number();
+   if (dio_number < 0)
+       return -ENODEV;
+
+   data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+   if (!data)
+       return -ENOMEM;
+
+   data->nr_bank = ARRAY_SIZE(aaeon_gpio_bank);
+   data->bank = aaeon_gpio_bank;
+   platform_set_drvdata(pdev, data);
+   bank = &data->bank[0];
+   bank->chip.parent = &pdev->dev;
+   bank->chip.ngpio = dio_number;
+   bank->data = data;
+   err = devm_gpiochip_add_data(&pdev->dev, &bank->chip, bank);
+   if (err)
+       pr_debug("Failed to register gpiochip %d: %d\n", i, err);
+
+   return err;
+}

Поскольку попытка загрузить модуль не просто закончилась ошибкой -ENODEV, ваша система, по-видимому, имеет API управления WMI, который ищет этот драйвер... но при запросе API фактически говорит, что ему нечего контролировать.

Другими словами, модуль может перейти к вызову dio_number = aaeon_gpio_get_number();, который заканчивается просто вызовом метода WMI для получения одного целого числа, которое, по-видимому, представляет собой количество линий GPIO, доступных для управления через этот API. Метод WMI не возвращает ошибок... но количество строк, которые он сообщает, очевидно, равно 0.

Функция переходит к выделению некоторой памяти и начинает создавать структуры, необходимые подсистеме GPIO Linux для регистрации линий GPIO для управления. Как только это сделано, он вызывает функцию devm_gpiochip_add_data()подсистемы GPIO для регистрации нового чипа GPIO... но подсистема GPIO выполняет некоторую проверку работоспособности и замечает, что эти структуры фактически указывают, что в чипе есть 0 линий GPIO для управления.

Согласно Elixir.bootlin.com перекрестному справочнику ядра Linux -, devm_gpiochip_add_data()— это макрос, который просто вызывает функцию devm_gpiochip_add_data_with_key()с двумя последними параметрами, равными NULL. Это, в свою очередь, вызывает функциюgpiochip_add_data_with_key(), которая выдает первое сообщение об ошибке, которое вы видите в строке #628 .

Другие сообщения после этого создаются по мере того, как цепочка вызовов функций раскручивается, поскольку каждая функция возвращает код ошибки вызывающей стороне.

Если значение, возвращаемое aaeon_gpio_get_number(), действительно является количеством линий GPIO, которыми может управлять WMI API, то тест:

+   if (dio_number < 0)
+       return -ENODEV;

на самом деле должно быть:

+   if (dio_number < 1)
+       return -ENODEV;

Но если число, возвращаемое WMI API, на самом деле означает что-то несколько иное, например, «0 -номер последней контролируемой линии GPIO» (, то есть значение 0 будет означать «есть только одна линия GPIO #0 и никаких других" ), тогда использование dio_numberв качестве значения bank->chip.ngpioприводит к выключению -на -одну ошибку, и модуль пропустит последнюю управляемую линию GPIO во всех системах которые имеют этот WMI API для GPIO.

Так или иначе, кое-что нужно исправить.

4
20.08.2021, 19:45

У меня были такие же сообщения об ошибках при попытке установить Xubuntu 20.04 с USB-накопителя. Я использовал Ryzen 5600X на материнской плате ASUS ROG STRIX R550 -F. Проблема была в видеокарте nVidia. Как только я выбрал вариант с «безопасной графикой», он смог запуститься.

0
09.10.2021, 18:32

Теги

Похожие вопросы