iPXE discussion forum
pciscan not working in ipxe.efi - Printable Version

+- iPXE discussion forum (https://forum.ipxe.org)
+-- Forum: iPXE user forums (/forumdisplay.php?fid=1)
+--- Forum: General (/forumdisplay.php?fid=2)
+--- Thread: pciscan not working in ipxe.efi (/showthread.php?tid=8237)



pciscan not working in ipxe.efi - renato - 2016-11-29 20:31

Hi,

I am trying to add a sleep or ifclose command in case I find a pci or network card, all this in my boot menu just before booting.

I am trying something like this:
Code:
:scan pciscan addr || goto scan_done
    #echo Found PCI device ${addr:busdevfn}
    iseq ${pci/${addr}.0.2}:${pci/${addr}.2.2} 8086:ffff && ifclose ||
    goto scan
:scan_done
However, when pciscan attr command is run attr is never set

I am doing something like below instead:
Code:
set addr:uint16 0
:loop
set pci ${pci/${addr}.0.2}:${pci/${addr}.2.2}
iseq ${pci} ffff:ffff || echo ${addr:busdevfn}: ${pci}
inc addr
iseq ${addr} 0xffff || goto loop
works, but it is nasty and takes a while

please advice


RE: pciscan not working in ipxe.efi - robinsmidsrod - 2016-12-12 10:31

It is quite possible that the pciscan command is not properly implemented in EFI mode yet.

If you do the workaround, do you actually receive proper information that matches the hardware setup of that machine?


RE: pciscan not working in ipxe.efi - renato - 2016-12-12 22:29

yes, it takes a couple of seconds but works


RE: pciscan not working in ipxe.efi - NiKiZe - 2016-12-12 22:46

Can confirm ... in EFI mode running
Code:
set addr:uint16 0
pciscan addr
show errno
gives me 0x2c044087 and going to http://ipxe.org/err/2c044087 gives us a bit more info.

Building with hacky patch and DEBUG=pci_cmd,pci determined that ipxe can't enumerate any buses at all.
This happens in pci_find_next
The answer to why can be found at: efi code compared to pcbios code

So pci scaning is not supported in EFI my guess is simply because it will cause issues on initialization, and that there is other (better) methods for doing the device enumeration in EFI mode.

Replacing
Code:
end = PCI_BUSDEVFN ( 0, pci_num_bus(), 0, 0 );
with
Code:
end = PCI_BUSDEVFN ( 0, 0x100, 0, 0 );
in the above linked pci_find_next function and we can start enumerate the pci bus - however i can't tell which other effects this will have in efi mode, so strongly recommend against it.

What we need here is probably a extra code path for in what manner we want enumeration, and for efi mode it can give zero buses on initialization but on pciscan it can actually give the buses - do note that in my test I did not check if the addresses returned was actually valid bus ids.