Обработка несогласованных состояний домена питания с помощью отложенного отключения питания в драйверах устройств GenPD Linux

Ответить Пред. темаСлед. тема
Anonymous
 Обработка несогласованных состояний домена питания с помощью отложенного отключения питания в драйверах устройств GenPD

Сообщение Anonymous »

Сценарий:
Проблема возникает с устройством UART, в котором задействованы два драйвера:
Драйвер 1: драйвер шины AMBA (

Код: Выделить всё

drivers/amba/bus.c
) Драйвер 2: драйвер UART PL011 (

Код: Выделить всё

drivers/tty/serial/amba-pl011.c
)
Вот последовательность событий:
  • Драйвер 1 (драйвер шины AMBA) подключает UART устройство для чтения идентификатора периферийного устройства. Это запускает GenPD для включения устройства (

    Код: Выделить всё

    genpd->status = GENPD_STATE_ON). Подключение происходит в строке 141 драйвера шины AMBA.
    [*]Затем драйвер 1 отключает устройство, планируя операцию выключения с помощью genpd_queue_power_off_work(pd);
    . Выключение устройства откладывается, и статус GENPD_STATE_OFF не устанавливается сразу. Отсоединение происходит в строке 203.
  • Прежде чем произойдет отложенное отключение питания, Драйвер 2 (драйвер UART PL011) подключается к устройству UART. GenPD обнаруживает, что для genpd->status установлено значение GENPD_STATE_ON, предполагая, что устройство включено, и поэтому не включает его снова.
  • В конце концов, отложенное питание -off выполняется, устанавливается genpd->status = GENPD_STATE_OFF, и устройство выключается.
Это создает несогласованность: UART- Драйвер предполагает, что устройство включено, но на самом деле после отложенной операции оно отключается, что может привести к неисправности.
Вопрос:
Что такое лучший способ решить эту проблему: либо путем внесения изменений в драйвер genPD, либо путем внесения изменений в драйвер шины AMBA и драйвер UART PL011? Я ищу решения, которые гарантируют, что состояние домена питания точно отражает текущее и предполагаемое состояние устройства, даже когда задействованы операции отложенного отключения питания.
У меня есть следующие соображения:
  • Введение переходного состояния (например, GENPD_STATE_POWERING_OFF) в драйвере genPD и возврат ошибки UART-драйверу, когда UART-драйвер пытается подключиться и позвольте UART-драйверу вернуть -EPROBE_DEFER ядру, чтобы у ядра была возможность вернуться и проверить еще раз.
Я был бы признателен за любые рекомендации или лучшие практики сообщества по управлению такими сценариями, особенно любые существующие механизмы в ядре Linux, которые могут помочь.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/788 ... enpd-linux
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»