mirror of
https://github.com/mborgerson/xemu.git
synced 2026-03-11 10:28:04 +00:00
Thanks to72d277a7,1ed2cb32, and others, EDID (Extended Display Identification Data) is propagated by QEMU such that a virtual display presents legitimate metadata (e.g., name, serial number, preferred resolutions, etc.) to its connected guest. This change adds the ability to specify the EDID name for a particular virtio-vga display. Previously, every virtual display would have the same name: "QEMU Monitor". Now, we can inject names of displays in order to test guest behavior that is specific to display names. We provide the ability to inject the display name from the frontend since this is guest visible data. Furthermore, this makes it clear where N potential display outputs would get their name from (which will be added in a future change). Note that we have elected to use a struct here for output data for extensibility - we intend to add per-output fields like resolution in a future change. It should be noted that EDID names longer than 12 bytes will be truncated per spec (I think?). Testing: verified that when I specified 2 outputs for a virtio-gpu with edid_name set, the names matched those that I configured with my vnc display. -display vnc=localhost:0,id=aaa,display=vga,head=0 \ -display vnc=localhost:1,id=bbb,display=vga,head=1 \ -device '{"driver":"virtio-vga", "max_outputs":2, "id":"vga", "outputs":[ { "name":"AAA" }, { "name":"BBB" } ]}' Signed-off-by: Andrew Keesler <ankeesler@google.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20250709121126.2946088-2-ankeesler@google.com>
35 lines
1.2 KiB
C
35 lines
1.2 KiB
C
#ifndef EDID_H
|
|
#define EDID_H
|
|
|
|
#define EDID_NAME_MAX_LENGTH 12
|
|
|
|
typedef struct qemu_edid_info {
|
|
const char *vendor; /* http://www.uefi.org/pnp_id_list */
|
|
const char *name;
|
|
const char *serial;
|
|
uint16_t width_mm;
|
|
uint16_t height_mm;
|
|
uint32_t prefx;
|
|
uint32_t prefy;
|
|
uint32_t maxx;
|
|
uint32_t maxy;
|
|
uint32_t refresh_rate;
|
|
} qemu_edid_info;
|
|
|
|
void qemu_edid_generate(uint8_t *edid, size_t size,
|
|
qemu_edid_info *info);
|
|
size_t qemu_edid_size(uint8_t *edid);
|
|
void qemu_edid_region_io(MemoryRegion *region, Object *owner,
|
|
uint8_t *edid, size_t size);
|
|
|
|
uint32_t qemu_edid_dpi_to_mm(uint32_t dpi, uint32_t res);
|
|
|
|
#define DEFINE_EDID_PROPERTIES(_state, _edid_info) \
|
|
DEFINE_PROP_UINT32("xres", _state, _edid_info.prefx, 0), \
|
|
DEFINE_PROP_UINT32("yres", _state, _edid_info.prefy, 0), \
|
|
DEFINE_PROP_UINT32("xmax", _state, _edid_info.maxx, 0), \
|
|
DEFINE_PROP_UINT32("ymax", _state, _edid_info.maxy, 0), \
|
|
DEFINE_PROP_UINT32("refresh_rate", _state, _edid_info.refresh_rate, 0)
|
|
|
|
#endif /* EDID_H */
|