Pci express card linux

Pci express card linux

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux

Цилюрик О.И. Модули ядра Linux
Назад Обслуживание периферийных устройств Вперед

Устройства на шине PCI

Архитектура PCI была разработана в качестве замены стандарту ISA с тремя основными целями: получить лучшую производительность при передаче данных между компьютером и его периферией, быть независимой от платформы, насколько это возможно, и упростить добавление и удаление периферийных устройств в системе. В настоящее время PCI широко используется в разных архитектурах: IA-32 / IA-64, Alpha, PowerPC, SPARC64 . Самой актуальной для автора драйвера является поддержка PCI автоопределения интерфейса плат: PCI устройства настраивается автоматически во время загрузки. Затем драйвер устройства получает доступ к информации о конфигурации устройства, и производит инициализацию. Это происходит без необходимости совершать какое-либо тестирование.

Каждое периферийное устройство PCI идентифицируется по подключению такими физическими параметрами, как: номер шины, номер устройства и номер функции. Linux дополнительно вводит и поддерживает такое логическое понятие как домен PCI. Каждый домен PCI может содержать до 256 шин. Каждая шина содержит до 32 устройств, каждое устройство может быть многофункциональным и поддерживать до 8 функций. В конечном итоге, каждая функция может быть однозначно идентифицирована на аппаратном уровне 16-ти разрядным ключом. Однако, драйверам устройств в Linux, не требуется иметь дело с этими двоичными ключами, потому что они используют для работы с устройствами специальную структуру данных pci_dev .

Примечание: Часто то, что мы житейски и физически (плата PCI) понимаем как устройство, в этой системе терминологически правильно называется: функция, устройство же может содержать до 8-ми эквивалентных (по своим возможностям) функций.

Адресацию PCI устройств в своей Linux системе смотрим:

Другое представление той же информации (тот же хост) можем получить так:

Здесь отчётливо видно (слева) поля, например для контроллера VGA: 0000:00:02.0 — выделены домен (16 бит), шина (8 бит), устройство (5 бит) и функция (3 бита). Поэтому, когда мы говорим об устройстве (далее), мы имеем в виду набор: номера домена + номер шины + номер устройства + номер функции.

С другой стороны, каждое устройство по типу идентифицируется двумя индексами: индекс производителя (Vendor ID) и индекс типа устройства (Device ID). Эта пара однозначно идентифицирует тип устройства. Использование 2-х основных идентификаторов устройств PCI (Vendor ID + Device ID) глобально регламентировано, и их актуальный перечень поддерживается в файле pci.ids , последнюю по времени копию которого можно найти в нескольких местах интернет, например по URL: http://pciids.sourceforge.net/ . Эти два параметра являются уникальным (среди всех устройств в мире) ключом поиска устройств, установленных на шине PCI. Для поиска (перебора устройств, установленных на шине PCI) в программном коде модуля в цикле используется итератор:

— где from — это NULL при начале поиска (или возобновлении поиска с начала), или указатель устройства, найденного на предыдущем шаге поиска. Если в качестве Vendor ID и/или Device ID указана константа PCI_ANY_ID=-1 , то предполагается выбор всех доступных устройств с таким идентификатором. Если искомое устройство не найдено (или больше таких устройств не находится в цикле), то очередной вызов возвратит NULL . Если возвращаемое значение не NULL , то возвращается указатель структуры описывающей устройство, и счётчик использования для устройства инкрементируется. Когда устройство удаляется (модуль выгружается) для декремента этого счётчика использования необходимо вызвать:

После нахождения устройства, но прежде начала его использования необходимо разрешить использование устройства вызовом: pci_enable_device( struct pci_dev *dev) , часто это выполняется в функции инициализации устройства: поле probe структуры struct pci_driver (см. далее), но может выполняться и автономно в коде драйвера.

Читайте также:  Linux повысить чувствительность микрофона

Каждое найденное устройство имеет своё пространство конфигурации, значения которого заполнены программами BIOS (или PnP OS, или BSP) — важно, что на момент загрузки модуля эта конфигурационное пространство всегда заполнено, и может только читаться (не записываться). Пространство конфигурации PCI устройства состоит из 256 байт для каждой функции устройства (для устройств PCI Express расширено до 4 Кб конфигурационного пространства для каждой функции) и стандартизированную схему регистров конфигурации. Четыре начальных байта конфигурационного пространства должны содержать уникальный ID функции (байты 0-1 — Vendor ID, байты 2-3 — Device ID), по которому драйвер идентифицирует своё устройство. Вот для сравнения начальные строки вывода команды для того же хоста (видно, через двоеточие, пары: Vendor ID — Device ID):

Первые 64 байт конфигурационной области стандартизованы, остальные зависят от устройства. Самыми актуальными для нас являются (кроме ID описанного выше) поля по смещению:

Вся регистрация устройства PCI и связывание его параметров с кодом модуля происходит исключительно через значения, считанные из конфигурационного пространства устройства. Обработку конфигурационной информации (уже сформированной при установке PCI устройства) показывает модуль (архив pci.tgz ) lab2_pci.ko (заимствовано из [6]):

Небольшой фрагмент результата выполнения этого модуля:

$ sudo insmod lab2_pci.ko

$ lsmod | grep lab

$ dmesg | tail -n221 | head -n30

$ sudo rmmod lab2_pci

$ lsmod | grep lab2

Для использования некоторой группы устройства PCI, код модуля определяет массив описания устройств, обслуживаемых этим модулем. Каждому новому устройству в этом списке соответствует новый элемент. Последний элемент массива всегда нулевой, это и есть признак завершения списка устройств. Строки такого массива заполняются макросом PCI_DEVICE :

Созданная структура pci_device_id должна быть экспортирована в пользовательское пространство, чтобы позволить системам горячего подключения и загрузки модулей знать, с какими устройствами работает данный модуль. Эту задачу решает макрос MODULE_DEVICE_TABLE :

Кроме доступа к области конфигурационных параметров, программный код может получить доступ к областям ввода-вывода и регионов памяти, ассоциированных с PCI устройством. Таких областей ввода-вывода может быть до 6-ти (см. формат области конфигурационных параметров выше), они индексируются значением от 0 до 5. Параметры этих регионов получаются функциями:

— где bar во всех вызовах — это индекс региона: 0 . 5. Первые 2 вызова возвращают начальный и конечный адрес региона ввода-вывода ( pci_resource_end() возвращает последний используемый регионом адрес, а не первый адрес, следующий после этого региона.), следующий вызов — его размер, и последний — флаги. Полученные таким образом адреса областей ввода/вывода от устройства — это адреса на шине обмена (адреса шины, для некоторых архитектур — x86 из числа таких — они совпадают с физическими адресами памяти). Для использования в коде модуля они должны быть отображены в виртуальные адреса (логические), в которые отображаются страницы RAM посредством устройства управления памятью (MMU). Кроме того, в отличие от обычной памяти, часто эти области ввода/вывода не должны кэшироваться процессором и доступ не может быть оптимизирован. Доступ к памяти таких областей должен быть отмечен как «без упреждающей выборки». Всё, что относится к отображению памяти будет рассмотрено отдельно далее, в следующем разделе. Флаги PCI региона ( pci_resource_flags() ) определены в
; некоторые из них:

IORESOURCE_IO, IORESOURCE_MEM — только один из этих флагов может быть установлен.

IORESOURCE_PREFETCH — определяет, допустима ли для региона упреждающая выборка.

IORESOURCE_READONLY — определяет, является ли регион памяти защищённым от записи.

Основной структурой, которую должны создать все драйверы PCI для того, чтобы быть правильно зарегистрированными в ядре, является структура (
):

  • name — имя драйвера, оно должно быть уникальным среди всех PCI драйверов в ядре, обычно устанавливается таким же, как и имя модуля драйвера, когда драйвер загружен в ядре, это имя появляется в /sys/bus/pci/drivers/ ;
  • id_table — только что описанный массив записей pci_device_id ;
  • probe — функция обратного вызова инициализации устройства; в функции probe драйвера PCI, прежде чем драйвер сможет получить доступ к любому ресурсу устройства (область ввода/вывода или прерывание) данного PCI устройства, драйвер должен, как минимум, вызвать функцию :
  • remove — функция обратного вызова удаления устройства;
  • . и другие функции обратного вызова.
Читайте также:  После обновления windows не работает office

Обычно для создания правильную структуру struct pci_driver достаточно бывает определить, как минимум, поля :

Теперь устройство может быть зарегистрировано в ядре:

— вызов возвращает 0 если регистрация устройства прошла успешно.

При завершении (выгрузке) модуля выполняется обратная операция:

Источник

О команде lspci в Linux

Главное меню » Linux » О команде lspci в Linux

В этой статье мы объясним основы PCI, PCIe и команды lspci для отображения информации в вашей системе.

Что такое PCI?

PCI или Peripheral Component Interconnect – это интерфейс для добавления дополнительных аппаратных компонентов в компьютерную систему. PCIe или PCI Express – это обновленный стандарт, который используется сегодня. Например, предположим, что вы хотите добавить карту Ethernet к своему компьютеру, чтобы он мог получать доступ к Интернету и обмениваться данными. Карта нуждается в протоколе для связи с остальной частью внутренней системы, PCI может быть стандартным интерфейсом, используемым для добавления этой карты в вашу систему. Вам по-прежнему нужен драйвер для этой карты, чтобы ядро ​​могло его использовать, однако PCI – это слот, а также шина и интерфейс, которые будут использоваться для добавления оборудования в систему со стандартным интерфейсом. Создание драйвера PCI linux будет следовать некоторым стандартным интерфейсам. Вы можете увидеть из структуры ниже стандартные методы, которые необходимо реализовать. Такие методы, как зондирование, удаление, приостановка, возобновление и т. д.

Скорость и использование PCI

PCI 3.0 может передавать данные со скоростью до 1 ГБ/сек на полосу. Различные устройства могут иметь более одной полосы, поэтому возможно, что отдельные устройства могут иметь скорость передачи данных в несколько гигабайт. Эти цифры всегда улучшаются по мере выхода новых версий спецификации и нового оборудования, поэтому всегда проверяйте наличие новейших и наиболее быстрых из возможных. Типы компонентов и гаджетов, которые вы можете купить с подключением к интерфейсу PCI, включают: адаптеры WIFI, Bluetooth, карты твердотельного хранилища NVME, видеокарты и многое другое.

Изучение команды lspci

Мы создали экземпляр Ubuntu 19.04 в облаке Google и теперь запущу команду lspci и посмотрю, что произойдет.

Вы видите по одной строке на устройство с числовым кодом и словесным описанием устройства. Фактически в этом выводе отображается 5 полей в каждой строке: слот, класс, поставщик, устройство и версия.

Итак, разбив первую строку, что у нас есть:

SLOT: 00: 00.0
Класс: Хост-мост
Производитель: Intel Corporation
Устройство: 440FX – 82441FX PMC
Revision: 02

И если посмотреть на слот 00: 04.0, это наш контроллер Ethernet, который выглядит как виртуальное устройство как часть виртуальной магии облачного развертывания Google.

Чтобы получить более подробную и подробную информацию о каждом слоте PCI, выполните следующую команду:

Эта команда разбивает каждую строку на поля компонентов и позволяет анализировать каждое устройство с помощью более описательных меток.

Вы также можете попробовать опцию -v для более подробного вывода

И используйте double v или tripple v для подробного вывода:

Или попробуйте параметр -mm для формата вывода, читаемого сценарием.

Чтобы узнать, какой драйвер ядра используется для каждого устройства, запустите параметр -k.

Многие из моих устройств используют драйвер virtio-pci.

Наконец, вы даже можете увидеть шестнадцатеричный дамп «стандартной части конфигурационного пространства» для каждого устройства PCI. Вы должны быть настоящим хакером ядра, чтобы понять, как использовать эту информацию. -x – это то, что дает вам вывод дампа.

Вывод

Команда lspci – это стандартная команда Linux, которую можно использовать для вывода информации об устройствах, подключенных к PCI в вашей системе. Это может быть полезно, чтобы узнать, какое у вас периферийное оборудование. Он также очень полезен для разработчиков, создателей драйверов устройств и системных специалистов низкого уровня для запроса информации об устройствах, драйверах и системе. Наслаждайтесь использованием lspci.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Как проверить слоты PCI в Linux

Слоты PCI и слоты PCI Express есть везде. Поскольку автобус используется даже в нетбуках и ультрабуках, вам, вероятно, потребуется время от времени проверять немного информации о них в самых неожиданных местах. GNU/Linux включает в себя несколько команд, которые позволят вам узнать о слотах PCI больше, чем вы могли когда-либо интересоваться. Эти команды идеально подходят для решения сетевых проблем, а также подходят для всех, кто собирает собственное оборудование. Технические специалисты также используют их для устранения проблем.

Читайте также:  Triple buffer nvidia linux

Чтобы измерить слоты PCI таким образом, вам нужно будет работать из командной строки Linux. Удерживайте Ctrl, Alt и T в графической среде рабочего стола, чтобы запустить оболочку. Вы также можете щелкнуть меню «Приложения» или «Whisker», перейти в «Системные инструменты» и щелкнуть или коснуться «Терминал». Пользователи Ubuntu Unity захотят найти слово терминал в Dash. Операторы безголового сервера всегда могут использовать один из виртуальных терминалов, но некоторые из этих команд немного длинны, если вы не загружаете их из сценария оболочки.

Метод 1. Просмотр информации о слоте PCI

В самом простом случае вы можете просто ввести lspci и нажмите Enter, чтобы получить подробную информацию обо всех устройствах, подключенных к вашей системе. Вероятно, это приведет к прокрутке окна вашего терминала, поэтому вы можете использовать полосу прокрутки, чтобы прочитать об этом. Вы можете использовать колесо прокрутки или тачпад, если вам нужно просмотреть всю информацию. Эта команда, заданная без других аргументов, перечислит все устройства, подключенные к вашей системе через шину PCI. Хотя это может дать вам стену текста, это очень простая команда.

Метод 2: проверьте информацию о слоте Ethernet PCI

Хотя это ужасно большой объем данных, вы всегда можете использовать grep, чтобы твой день намного проще. Один из наиболее часто используемых приемов проверки индекса слотов PCI — это мгновенный сбор информации о вашем контроллере Ethernet. Это рука, когда с ней возникают проблемы. Введите lspci -vmm | grep -B1 -A2 ‘^ Class. * Ethernet’ в командной строке и нажмите Enter. Скорее всего, это огромный кусок текста, который нужно проанализировать, поэтому вы можете скопировать его, а затем вставить в командную строку. Либо щелкните меню «Правка» и выберите «Вставить», либо одновременно удерживайте нажатыми клавиши «Shift», «Ctrl» и «V», чтобы вставить его. Стандартное сочетание клавиш Ctrl + V, которое вы могли использовать, здесь не работает, потому что терминал интерпретирует это по-другому. Как только вы нажмете клавишу ввода, вы получите информацию об адаптере Ethernet.

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

Метод 3: отображение открытых слотов PCI

Вернуться на терминал, вы можете запустить sudo dmidecode -t 9 | grep -A3 «Информация о системном слоте» | grep -c -B1 «Доступен» , чтобы узнать, сколько у вас пустых слотов PCI. Опять же, это очень длинная команда, которую было бы непрактично вводить снова и снова. Поэтому вы можете скопировать его и снова либо щелкнуть меню «Правка», затем выбрать «Вставить», либо удерживать клавиши Ctrl, Shift и V, чтобы вставить его в окно терминала.

Обратите внимание, что команда sudo находится перед этим конкретным стеком командной строки. Это потому, что для перечисления точного списка слотов PCI требуется root-доступ. Вам будет предложено ввести пароль, как только вы попытаетесь запустить его, тогда он вернет одно число. Это может быть от 0 или 1 в системе с небольшим количеством реальных физических слотов PCI до 8-10 на некоторых типах серверов.

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

Источник

Оцените статью