Linux PCI Установка драйвера и разрушение - PullRequest
0 голосов
/ 04 июля 2018

После просмотра документации по ядру здесь: https://www.kernel.org/doc/Documentation/PCI/pci.txt Я заблудился относительно порядка вызовов функций для установки и отключения драйвера PCI.

У меня два вопроса:

  1. Для настройки pci_enable_device() всегда предшествует pci_request_regions()? Документация, кажется, указывает на это факт, но действительно заявляет:

    ОС БАГ: мы не проверяем распределение ресурсов перед включением тех Ресурсы. Последовательность имела бы больше смысла, если бы мы назвали pci_request_resources() перед звонком pci_enable_device(). В настоящее время драйверы устройств не могут обнаружить ошибку, когда два Устройства были выделены в том же диапазоне. Это не распространенное проблема и вряд ли будет решена в ближайшее время. Это обсуждалось ранее, но не изменилось с 2.6.19: http://lkml.org/lkml/2006/3/2/194

    Однако, сделав быстрый просмотр исходного кода нескольких водители, согласие заключается в том, что pci_enable_device() всегда приходит первый. Какой из этих вызовов должен быть первым и почему?

  2. Из-за срыва водителя я запутался еще больше. Предполагая, что pci_enable_device() на первом месте, я бы ожидал, что вы сначала позвоните pci_release_regions() до вызова pci_disable_device() (т.е., следуя некоторой симметрии). Однако в документации по ядру сказано, что pci_release_regions() должно стоять последним. Что усложняет ситуацию, так это то, что я посмотрел на многие драйверы, и почти у всех было pci_release_regions() до pci_disable_device(), как я и ожидал. Однако затем я наткнулся на этот драйвер: https://elixir.bootlin.com/linux/v4.12/source/drivers/infiniband/hw/hfi1/pcie.c (код воспроизводится ниже).

    void hfi1_pcie_cleanup(struct pci_dev *pdev)
    {
        pci_disable_device(pdev);
        /*
         * Release regions should be called after the disable. OK to
         * call if request regions has not been called or failed.
         */
        pci_release_regions(pdev);
    }
    

    Какая функция должна быть на первом месте при сносе драйвера? Кажется, что драйверы в самом ядре не могут договориться.

1 Ответ

0 голосов
/ 04 июля 2018

Утверждение, которое дает последнее слово, выглядит следующим образом:

o разбудить устройство, если оно находилось в подвешенном состоянии,

o выделить области ввода-вывода и памяти устройства (если BIOS этого не сделал),

o выделить IRQ (если BIOS этого не сделал).

Так что нет смысла просить ядро ​​зарезервировать ресурс, если его нет. В большинстве случаев, когда нам не нужно выделять ресурс, потому что это было сделано BIOS, в этих случаях мы можем сначала сохранить любую функцию, но только если вы абсолютно уверены.

...