ramfb: Add property to control if load the romfile

Currently the ramfb device loads the vgabios-ramfb.bin unconditionally,
but only the x86 need the vgabios-ramfb.bin, this can cause that when
use the release package on arm64 it can't find the vgabios-ramfb.bin.

Because only seabios will use the vgabios-ramfb.bin, load the rom logic
is x86-specific. For other !x86 platforms, the edk2 ships an EFI driver
for ramfb, so they don't need to load the romfile.

So add a new property use-legacy-x86-rom in both ramfb and vfio_pci
device, because the vfio display also use the ramfb_setup() to load
the vgabios-ramfb.bin file.

After have this property, the machine type can set the compatibility to
not load the vgabios-ramfb.bin if the arch doesn't need it.

For now the default value is true but it will be turned off by default
in subsequent patch when compats get properly handled.

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
Message-ID: <20250717100941.2230408-2-shahuang@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Shaoqin Huang 2025-07-17 06:09:39 -04:00 committed by Gerd Hoffmann
parent c079d3a31e
commit 350785d41d
7 changed files with 15 additions and 7 deletions

View File

@ -17,6 +17,7 @@ struct RAMFBStandaloneState {
QemuConsole *con; QemuConsole *con;
RAMFBState *state; RAMFBState *state;
bool migrate; bool migrate;
bool use_legacy_x86_rom;
}; };
static void display_update_wrapper(void *dev) static void display_update_wrapper(void *dev)
@ -39,7 +40,7 @@ static void ramfb_realizefn(DeviceState *dev, Error **errp)
RAMFBStandaloneState *ramfb = RAMFB(dev); RAMFBStandaloneState *ramfb = RAMFB(dev);
ramfb->con = graphic_console_init(dev, 0, &wrapper_ops, dev); ramfb->con = graphic_console_init(dev, 0, &wrapper_ops, dev);
ramfb->state = ramfb_setup(errp); ramfb->state = ramfb_setup(ramfb->use_legacy_x86_rom, errp);
} }
static bool migrate_needed(void *opaque) static bool migrate_needed(void *opaque)
@ -62,6 +63,8 @@ static const VMStateDescription ramfb_dev_vmstate = {
static const Property ramfb_properties[] = { static const Property ramfb_properties[] = {
DEFINE_PROP_BOOL("x-migrate", RAMFBStandaloneState, migrate, true), DEFINE_PROP_BOOL("x-migrate", RAMFBStandaloneState, migrate, true),
DEFINE_PROP_BOOL("use-legacy-x86-rom", RAMFBStandaloneState,
use_legacy_x86_rom, true),
}; };
static void ramfb_class_initfn(ObjectClass *klass, const void *data) static void ramfb_class_initfn(ObjectClass *klass, const void *data)

View File

@ -8,7 +8,7 @@ void ramfb_display_update(QemuConsole *con, RAMFBState *s)
{ {
} }
RAMFBState *ramfb_setup(Error **errp) RAMFBState *ramfb_setup(bool romfile, Error **errp)
{ {
error_setg(errp, "ramfb support not available"); error_setg(errp, "ramfb support not available");
return NULL; return NULL;

View File

@ -135,7 +135,7 @@ const VMStateDescription ramfb_vmstate = {
} }
}; };
RAMFBState *ramfb_setup(Error **errp) RAMFBState *ramfb_setup(bool romfile, Error **errp)
{ {
FWCfgState *fw_cfg = fw_cfg_find(); FWCfgState *fw_cfg = fw_cfg_find();
RAMFBState *s; RAMFBState *s;
@ -147,7 +147,9 @@ RAMFBState *ramfb_setup(Error **errp)
s = g_new0(RAMFBState, 1); s = g_new0(RAMFBState, 1);
if (romfile) {
rom_add_vga("vgabios-ramfb.bin"); rom_add_vga("vgabios-ramfb.bin");
}
fw_cfg_add_file_callback(fw_cfg, "etc/ramfb", fw_cfg_add_file_callback(fw_cfg, "etc/ramfb",
NULL, ramfb_fw_cfg_write, s, NULL, ramfb_fw_cfg_write, s,
&s->cfg, sizeof(s->cfg), false); &s->cfg, sizeof(s->cfg), false);

View File

@ -365,7 +365,7 @@ static bool vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp)
&vfio_display_dmabuf_ops, &vfio_display_dmabuf_ops,
vdev); vdev);
if (vdev->enable_ramfb) { if (vdev->enable_ramfb) {
vdev->dpy->ramfb = ramfb_setup(errp); vdev->dpy->ramfb = ramfb_setup(vdev->use_legacy_x86_rom, errp);
if (!vdev->dpy->ramfb) { if (!vdev->dpy->ramfb) {
return false; return false;
} }
@ -494,7 +494,7 @@ static bool vfio_display_region_init(VFIOPCIDevice *vdev, Error **errp)
&vfio_display_region_ops, &vfio_display_region_ops,
vdev); vdev);
if (vdev->enable_ramfb) { if (vdev->enable_ramfb) {
vdev->dpy->ramfb = ramfb_setup(errp); vdev->dpy->ramfb = ramfb_setup(vdev->use_legacy_x86_rom, errp);
if (!vdev->dpy->ramfb) { if (!vdev->dpy->ramfb) {
return false; return false;
} }

View File

@ -3809,6 +3809,8 @@ static const TypeInfo vfio_pci_dev_info = {
static const Property vfio_pci_dev_nohotplug_properties[] = { static const Property vfio_pci_dev_nohotplug_properties[] = {
DEFINE_PROP_BOOL("ramfb", VFIOPCIDevice, enable_ramfb, false), DEFINE_PROP_BOOL("ramfb", VFIOPCIDevice, enable_ramfb, false),
DEFINE_PROP_BOOL("use-legacy-x86-rom", VFIOPCIDevice,
use_legacy_x86_rom, true),
DEFINE_PROP_ON_OFF_AUTO("x-ramfb-migrate", VFIOPCIDevice, ramfb_migrate, DEFINE_PROP_ON_OFF_AUTO("x-ramfb-migrate", VFIOPCIDevice, ramfb_migrate,
ON_OFF_AUTO_AUTO), ON_OFF_AUTO_AUTO),
}; };

View File

@ -188,6 +188,7 @@ struct VFIOPCIDevice {
bool no_kvm_ioeventfd; bool no_kvm_ioeventfd;
bool no_vfio_ioeventfd; bool no_vfio_ioeventfd;
bool enable_ramfb; bool enable_ramfb;
bool use_legacy_x86_rom;
OnOffAuto ramfb_migrate; OnOffAuto ramfb_migrate;
bool defer_kvm_irq_routing; bool defer_kvm_irq_routing;
bool clear_parent_atomics_on_exit; bool clear_parent_atomics_on_exit;

View File

@ -6,7 +6,7 @@
/* ramfb.c */ /* ramfb.c */
typedef struct RAMFBState RAMFBState; typedef struct RAMFBState RAMFBState;
void ramfb_display_update(QemuConsole *con, RAMFBState *s); void ramfb_display_update(QemuConsole *con, RAMFBState *s);
RAMFBState *ramfb_setup(Error **errp); RAMFBState *ramfb_setup(bool romfile, Error **errp);
extern const VMStateDescription ramfb_vmstate; extern const VMStateDescription ramfb_vmstate;