Есть конфигурационное пространство устройства PCIe, которое в адресах PC даже не представлено, а читается косвенно, кажется через io-порты 0xC8C, 0xC8E. А вот в BAR реальный физ. адрес региона. Откуда диапазоны адресов, размеры берутся в описаниях устройств? Я не понимаю. BAR 1шт., а ресурсов 3шт.
Есть код
mqnic->hw_regs_size = pci_resource_len(pdev, 0);
mqnic->hw_regs_phys = pci_resource_start(pdev, 0);
mqnic->app_hw_regs_size = pci_resource_len(pdev, 2);
mqnic->app_hw_regs_phys = pci_resource_start(pdev, 2);
mqnic->ram_hw_regs_size = pci_resource_len(pdev, 4);
mqnic->ram_hw_regs_phys = pci_resource_start(pdev, 4);
pci_resource_xxx это макросы из <include/linux/pci.h>.
.....
/*
* These helpers provide future and backwards compatibility
* for accessing popular PCI BAR info
*/
#define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start)
#define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end)
.....
Но где оно заполняется, где бы было "->resource[" как lvalue, не нашел. В драйвере нет. В функциях ядра есть, но где и когда их драйвер вызывает не знаю.
Где эта таблица ресурсов может заполняться?