On Wed, Feb 08, 2017 at 01:49:20PM +0100, Alexander Gordeev wrote: > On Sat, Jan 28, 2017 at 12:10:41PM +0100, Andrew Jones wrote: > > How about just this instead (untested) > > > > bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num) > > { > > assert(bar_num >= 0 && bar_num < PCI_BAR_NUM); > > if (bar_num > 0 && pci_bar_is64(dev, bar_num - 1)) > > return pci_bar_is_valid(dev, bar_num - 1); > > return pci_bar_size(dev, bar_num); > > } > > This one can not distinguish between PCI_BASE_ADDRESS_* flags > and address bits of high part of a 64 bit address. > > However, it seems a newly introduced pci_dev::resource[] can > be used for that. Hi Andrew, Although using pci_dev::resource[] is possible I do not like a result for various reasons. I.e. I anticipate these: - pci_bar_get/set_addr() logic will get quite cryptic; - mismatch between pci_dev::resource[] 64 bit size and 32 bit BAR size. While it is okay right now it will be confusing once pci_dev::resource[] are reused as BAR validity flags; - architecture specific pci_probe() reworked to seed pci_dev::resource[] (and being invoked on all archs); Overall, the current compact implementetion is going to turn into a framework with not so obvious logic. I suggest just polish v1 or drop the idea of checking BARs altogether. Thoughts? > > Thanks, > > drew