On Thu, Jul 09, 2015 at 10:45:23AM +0200, Gerd Hoffmann wrote:
Hi,
The conclusion is that the main bottleneck to boot QEMU is fw_cfg.
https://www.kraxel.org/cgit/qemu/log/?h=rebase/fw-cfg-dma-wip
Some experimental (and untested) bits implementing a dma interface for fw_cfg (also some unrelated fw_cfg stuff).
You might want try wire that up for x86 and see how it speeds up things ...
Interesting. This probably isn't the right place to discuss the implementation, but I have a couple of comments on the dma interface.
The interface doesn't have a "skip" field and that's quite helpful in the firmware to avoid having to memmove stuff around. (So, instead of select/addr/len it would be preferable to have select/addr/offset/len.)
Have you considered using a transfer descriptor struct and dma'ing that? That is, use just two 32bit IO registers (descriptor addr high / descriptor addr low, active on write to low register) and then define a descriptor struct with the select, target addr, offset, len, and status fields - fw_cfg could then read the descriptor struct, perform the requested action, and then update the descriptor struct upon completion.
Cheers, -Kevin