Skip to content
  • Daniel Henrique Barboza's avatar
    hw/riscv/virt.c: do create_fdt() earlier, add finalize_fdt() · 7a87ba89
    Daniel Henrique Barboza authored
    Commit 49554856 fixed a problem, where TPM devices were not appearing
    in the FDT, by delaying the FDT creation up until virt_machine_done().
    This create a side effect (see gitlab #1925) - devices that need access
    to the '/chosen' FDT node during realize() stopped working because, at
    that point, we don't have a FDT.
    
    This happens because our FDT creation is monolithic, but it doesn't need
    to be. We can add the needed FDT components for realize() time and, at
    the same time, do another FDT round where we account for dynamic sysbus
    devices.  In other words, the problem fixed by 49554856 could also be
    fixed by postponing only create_fdt_sockets() and its dependencies,
    leaving everything else from create_fdt() to be done during init().
    
    Split the FDT creation in two parts:
    
    - create_fdt(), now moved back to virt_machine_init(), will create FDT
      nodes that doesn't depend on additional (dynamic) devices from the
      sysbus;
    
    - a new finalize_fdt() step is added, where create_fdt_sockets() and
      friends is executed, accounting for the dynamic sysbus devices that
      were added during realize().
    
    This will make both use cases happy: TPM devices are still working as
    intended, and devices such as 'guest-loader' have a FDT to work on
    during realize().
    
    Fixes: 49554856
    
     ("riscv: Generate devicetree only after machine initialization is complete")
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1925
    Signed-off-by: Daniel Henrique Barboza's avatarDaniel Henrique Barboza <dbarboza@ventanamicro.com>
    Reviewed-by: default avatarAlistair Francis <alistair.francis@wdc.com>
    Message-ID: <20231110172559.73209-1-dbarboza@ventanamicro.com>
    Signed-off-by: default avatarAlistair Francis <alistair.francis@wdc.com>
    7a87ba89