Сведения об устройстве на шине PCI
#include <hw/pci.h>
#include <hw/pci_devices.h>
struct pci_dev_info {
uint16_t DeviceId;
uint16_t VendorId;
uint16_t SubsystemId;
uint16_t SubsystemVendorId;
uint8_t BusNumber;
uint8_t DevFunc;
uint8_t Revision;
uint8_t Rsvd[5];
uint32_t Class;
uint32_t Irq;
uint64_t CpuIoTranslation;
uint64_t CpuMemTranslation;
uint64_t CpuIsaTranslation;
uint64_t CpuBmstrTranslation;
uint64_t PciBaseAddress[6];
uint64_t CpuBaseAddress[6];
uint32_t BaseAddressSize[6];
uint64_t PciRom;
uint64_t CpuRom;
uint32_t RomSize;
uint32_t Rsvd1;
uint64_t BusIoStart;
uint64_t BusIoEnd;
uint64_t BusMemStart;
uint64_t BusMemEnd;
uint8_t msi;
uint8_t Rsvd2[3];
uint32_t Rsvd3;
};
Тип позволяет обрабатывать сведения об устройстве на шине PCI, которые являются представлением конфигурационной области дескриптора устройства на шине.
 | Функция pci_attach_device() не отображает какие-либо области ввода-вывода или памяти в адресное пространство процесса. Адреса, возвращаемые в структуре pci_dev_info , являются физическими адресами. |
Структура включает следующие поля:
- DeviceId
- Идентификатор устройства (ввод/вывод). Список поддерживаемых идентификаторов устройств см. в
<hw/pci_devices.h>
. - VendorId
- Идентификатор производителя (ввод / вывод). Список поддерживаемых идентификаторов производителей см. в
<hw/pci_devices.h>
. - SubsystemId
- Идентификатор подсистемы (вывод).
- SubsystemVendorId
- Идентификатор производителя подсистемы (вывод).
- BusNumber
- Номер шины (ввод/вывод).
- DevFunc
- Номер устройства/функции (ввод/вывод).
- Revision
- ерсия устройства (вывод).
- Class
- Код класса (ввод/вывод). Список кодов классов см. в
<hw/pci.h>
. Это поле является комбинацией кода класса и кода подкласса (PCI_CLASS_DISPLAY
| PCI_SUBCLASS_DISPLAY_XGA
). - Irq
- Номер прерывания (вывод).
- CpuIoTranslation
- Значение трансляции CPU в PCI (pci_addr = cpu_addr - translation).
- CpuMemTranslation
- Трансляция памяти CPU в PCI (pci_addr = cpu_addr - translation).
- CpuIsaTranslation
- Трансляция памяти CPU в ISA (pci_addr = cpu_addr - translation).
- CpuBmstrTranslation
- Трансляция адреса мастера шины ЦП в адрес мастера шины PCI (pci_addr = cpu_addr + translation).
- PciBaseAddress[6]
- Базовый адрес PCI (массив из
6
uint64_t
элементов).
 | Эта функция декодирует биты 1 и 2 , чтобы узнать, имеет ли регистр размер в 32 или в 64 бит, 64-битные значения соответствуют базовым регистрам. |
- CpuBaseAddress[6]
- Базовый адрес ЦП (массив из
6
uint64_t
элементов).
Некоторые платформы транслируют адреса через мосты PCI, так что один адрес находится на стороне PCI моста, а другой - на стороне ЦП. В x86 PciBaseAddress и CpuBaseAddress одинаковы, но на других платформах они будут разными. В пользовательских приложениях рекомендуется всегда использовать CpuBaseAddress. - BaseAddressSize[6]
- Размер базового ROM адреса на плате (массив из
6
uint32_t
элементов). - PciRom
- Адрес PCI ROM.
- CpuRom
- Адрес CPU ROM.
- RomSize
- Размер ROM на плате.
- msi
- При использовании устройством MSI-X, в поле msi можно задать ограничение для количества выделяемых устройству прерываний, если им запрашивается более одного. Это может потребоваться при запросе устройством большого количества MSI-X прерываний (64, 32), что при наличии нескольких подобных устройств на шине может привести к нехватке свободных векторов прерываний. Задать значение полю msi необходимо до подключения к PCI-устройству с помощью функции pci_attach_device(). При возврате из функции pci_attach_device() в поле msi заносится тип обрабатываемых прерываний:
- 0
- legacy-прерывание.
- PCI_MSI
- MSI
- PCI_MSIX
- MSI-X
- Параметр msi поддерживается, начиная с
ЗОСРВ
«Нейтрино»
редакции 2024
Тестирование и преобразования адресов
Чтобы облегчить тестирование адресов, возвращаемых сервером PCI, были определены следующие макросы в заголовочном файле <hw/pci.h>
:
- PCI_IS_IO( address )
- Проверить, является ли адрес адресом ввода-вывода.
- PCI_IS_MEM( address )
- Проверить, является ли адрес адресом памяти.
- PCI_IO_ADDR( address )
- Преобразует адрес, возвращаемый сервером PCI, в адрес ввода-вывода.
- PCI_MEM_ADDR( address )
- Преобразует адрес, возвращаемый сервером PCI, в адрес памяти.
- PCI_ROM_ADDR( address )
- Преобразует адрес, возвращаемый сервером PCI, в адрес ROM.
Пример:
uint64_t port;
if ( PCI_IS_IO( addr ) )
port = (PCI_IO_ADDR( addr ));
ЗОСРВ «Нейтрино»
pci_attach_device()
Предыдущий раздел: Описание API системной библиотеки