Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Временное отключение прерываний  (Прочитано 415 раз)
0 Пользователей и 1 Гость смотрят эту тему.
WWX
Постоялец

ru
Offline Offline

« : 18-12-2024 09:30 » 

Доброго времени суток.

Есть ли ф-ция для оключения / включения обработки legacy прерываний от PCIe платы? (Аналог линуксовой ф-ции pci_intx)

(Можно конечно отключать генерацию прерываний на самом устройстве (как я сейчас и делаю). Но хотелось бы понять, можно ли корректным способом "замаскировать" вызов обработчика в драйвере, не трогая устройство.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-12-2024 11:16 » 

Доброго!
Давно этим не занимался, но по-моему не встречал такого способа...  Линии ж аппаратные, к тому же могут быть расшарены между слотами/устройствами... Если мне не изменяет память.
Если прерывание кто то выставил, то какой то зарегенный драйвер должен определить, что прерывание от его устройства и сказать целевой плате остановить выставление флага на этой линии, иначе кто ее остановит? там же LevelSensitive  прерывания на PCI  вроде были.
может через регистры PCI config-space что то есть, но это наверное будет то же самое что вы уже делаете.

ЗЫ ну можно обработчик отрегистрировать попробовать но вроде это только при загрузке/выкгрузке делается... и помоему оно упадет или зависнет, если обработчика не будет а прерывание возникнет.
но могу ошибаться.
« Последнее редактирование: 19-12-2024 11:36 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #2 : 19-12-2024 13:31 » new

Спасибо за ответ.

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

Про IoDisconnectInterrupt / IoConnectInterrupt тоже думал, но пришёл к выводу что это ещё более неправильно...

Просто немного смущает: что иногда для того, что в Линуксе делается в 1 – 2 строки, в Винде приходится ужом вертеться...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 23-12-2024 15:00 » 

WWX, ну так "отключение прерываний в линуксе" - не то же самое, как если вы сами в обработчике просто обрабатывать перестанете?
кроме того... ну вот возникнет в линуксе необработанное прерывание от замаскированного устрйосва. Завесит наглухо аппаратную линию. Отвалится другое устройство на этой линии, точнее ему все время валится чужое прерывание, система наглухо останется в обработчике аппаратного прерывания.
И кто прав? ядро линукса которое такое в принципе позволяет для данной аппаратной платформы, или писатель драйвера который эту функцию применил не по делу(а почему нет, ядро же позволяет)?


Я не помню, в PCI через конфиг-спейс можно прерывание маскировать?

ЗЫ посмотрел, pci_intx() ставит отправляет команду в PCI регистр PCI_COMMAND устройства, в регистр конфигспейса.
флаг PCI_COMMAND_INTX_DISABLE   (1 << 10) /* INTx Emulation Disable */

а еще есть команда
Код:
static inline bool pci_intx_mask_supported(struct pci_dev *pdev)
{
/*
* INTx masking is supported if PCI_COMMAND_INTX_DISABLE is
* writable and no quirk has marked the feature broken.
*/
return !pdev->broken_intx_masking;
}

вроде можно самому
https://learn.microsoft.com/en-us/windows-hardware/drivers/pci/accessing-pci-device-configuration-space
« Последнее редактирование: 23-12-2024 15:40 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #4 : 24-12-2024 09:15 » 

Похоже, что да – в Windows'е это делается только напрямую через конфигурационное пространство (просто в Linux'е для этой конкретной операции сделали отдельную ф-цию).

Спасибо за подсказку, будем выкручиваться...

(PS: Я ни разу не линуксоид, и многие вещи мне больше нравятся как они сделаны в Windows'е, нежели в Linux'е. Но справедливости ради тот же доступ к конфигурационному пространству на Linux'е занимает несколько строк, а на Windows'е у меня в своё время занял несколько экранов кода... (Если не путаю, использовал метод "The BUS_INTERFACE_STANDARD bus interface", правда рабочую ссылку на статью, где это (на мой взгляд) более подробно разжёвано чё-то не могу найти, а то бы скинул; могла бы кому-нибудь пригодиться.))
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-12-2024 16:18 » 

WWX, и я не линуксоид) каждый раз когда сталкиваюсь чисто пользовательски, на принтер прошивку поставить - меня в ужас приводит каждое действие, легко неделями разбираться надо каждым необходимым действием... один раз делал простейшие действия по инструкции, а она оказалась от другой версии ядра)
PS и да, иногда простейшее действия вызывают массу сложностей))) но зато документация все таки есть и подходит как правило начиная от  98-го  до 10тки)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #6 : 25-12-2024 14:08 » 

Согласен.
Хотя, на мой взгляд, под Linux драйвера легче пишутся (несколько лет, правда, не писал таких...)
А вот под user space лично мне кодить больше прёт именно под Windows.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines