From: "Lukáš Hrázký" <lhrazky@redhat.com>
To: spice-devel@lists.freedesktop.org, qemu-devel@nongnu.org
Cc: kraxel@redhat.com
Subject: [Qemu-devel] [RFC PATCH spice v3 1/3] QXL interface: add a function to identify monitors in the guest
Date: Wed, 7 Nov 2018 11:49:19 +0100 [thread overview]
Message-ID: <20181107104921.20536-2-lhrazky@redhat.com> (raw)
In-Reply-To: <20181107104921.20536-1-lhrazky@redhat.com>
Adds a function to let QEMU provide information to identify graphics
devices and their monitors in the guest. The function
(spice_qxl_set_device_info) sets the device address (e.g. a PCI path)
and monitor ID -> device display ID mapping of displays exposed by given
QXL interface.
Signed-off-by: Lukáš Hrázký <lhrazky@redhat.com>
---
server/red-qxl.c | 44 ++++++++++++++++++++++++++++++++++++++
server/spice-qxl.h | 46 ++++++++++++++++++++++++++++++++++++++++
server/spice-server.syms | 5 +++++
3 files changed, 95 insertions(+)
diff --git a/server/red-qxl.c b/server/red-qxl.c
index 97940611..0ea424cd 100644
--- a/server/red-qxl.c
+++ b/server/red-qxl.c
@@ -41,6 +41,9 @@
#include "red-qxl.h"
+#define MAX_DEVICE_ADDRESS_LEN 256
+#define MAX_MONITORS_COUNT 16
+
struct QXLState {
QXLWorker qxl_worker;
QXLInstance *qxl;
@@ -53,6 +56,9 @@ struct QXLState {
unsigned int max_monitors;
RedsState *reds;
RedWorker *worker;
+ char device_address[MAX_DEVICE_ADDRESS_LEN];
+ uint32_t device_display_ids[MAX_MONITORS_COUNT];
+ size_t monitors_count; // length of ^^^
pthread_mutex_t scanout_mutex;
SpiceMsgDisplayGlScanoutUnix scanout;
@@ -846,6 +852,44 @@ void red_qxl_gl_draw_async_complete(QXLInstance *qxl)
red_qxl_async_complete(qxl, cookie);
}
+SPICE_GNUC_VISIBLE
+void spice_qxl_set_device_info(QXLInstance *instance,
+ const char *device_address,
+ uint32_t device_display_id_start,
+ uint32_t device_display_id_count)
+{
+ g_return_if_fail(device_address != NULL);
+
+ size_t da_len = strnlen(device_address, MAX_DEVICE_ADDRESS_LEN);
+ if (da_len >= MAX_DEVICE_ADDRESS_LEN) {
+ spice_error("Device address too long: %lu > %u", da_len, MAX_DEVICE_ADDRESS_LEN);
+ return;
+ }
+
+ if (device_display_id_count > MAX_MONITORS_COUNT) {
+ spice_error("Device display ID count (%u) is greater than limit %u",
+ device_display_id_count,
+ MAX_MONITORS_COUNT);
+ return;
+ }
+
+ strncpy(instance->st->device_address, device_address, MAX_DEVICE_ADDRESS_LEN);
+
+ g_debug("QXL Instance %d setting device address \"%s\" and monitor -> device display mapping:",
+ instance->id,
+ device_address);
+
+ // store the mapping monitor_id -> device_display_id
+ for (uint32_t monitor_id = 0; monitor_id < device_display_id_count; ++monitor_id) {
+ uint32_t device_display_id = device_display_id_start + monitor_id;
+ instance->st->device_display_ids[monitor_id] = device_display_id;
+ g_debug(" monitor ID %u -> device display ID %u",
+ monitor_id, device_display_id);
+ }
+
+ instance->st->monitors_count = device_display_id_count;
+}
+
void red_qxl_init(RedsState *reds, QXLInstance *qxl)
{
QXLState *qxl_state;
diff --git a/server/spice-qxl.h b/server/spice-qxl.h
index 0c4e75fc..547d3d93 100644
--- a/server/spice-qxl.h
+++ b/server/spice-qxl.h
@@ -115,6 +115,52 @@ void spice_qxl_gl_draw_async(QXLInstance *instance,
uint32_t w, uint32_t h,
uint64_t cookie);
+/* since spice 0.14.2 */
+
+/**
+ * spice_qxl_set_device_info:
+ * @instance the QXL instance to set the path to
+ * @device_address the path of the device this QXL instance belongs to
+ * @device_display_id_start the starting device display ID of this interface,
+ * i.e. the one monitor ID 0 maps to
+ * @device_display_id_count the total number of device display IDs on this
+ * interface
+ *
+ * Sets the device information for this QXL interface, i.e. the hardware
+ * address (e.g. PCI) of the graphics device and the IDs of the displays of the
+ * graphics device that are exposed by this interface (device display IDs).
+ *
+ * The supported device address format is:
+ * "pci/<DOMAIN>/<SLOT>.<FUNCTION>/.../<SLOT>.<FUNCTION>"
+ *
+ * The "pci" identifies the rest of the string as a PCI address. It is the only
+ * supported address at the moment, other identifiers can be introduced later.
+ * <DOMAIN> is the PCI domain, followed by <SLOT>.<FUNCTION> of any PCI bridges
+ * in the chain leading to the device. The last <SLOT>.<FUNCTION> is the
+ * graphics device. All of <DOMAIN>, <SLOT>, <FUNCTION> are hexadecimal numbers
+ * with the following number of digits:
+ * <DOMAIN>: 4
+ * <SLOT>: 2
+ * <FUNCTION>: 1
+ *
+ * The device_display_id_{start,count} denotes the sequence of device display
+ * IDs that map to the zero-based sequence of monitor IDs provided by monitors
+ * config on this interface. For example with device_display_id_start = 2 and
+ * device_display_id_count = 3 you get the following mapping:
+ * monitor_id -> device_display_id
+ * 0 -> 2
+ * 1 -> 3
+ * 2 -> 4
+ *
+ * Note this example is unsupported in practice. The only supported cases are
+ * either a single device display ID (count = 1) or multiple device display IDs
+ * in a sequence starting from 0.
+ */
+void spice_qxl_set_device_info(QXLInstance *instance,
+ const char *device_address,
+ uint32_t device_display_id_start,
+ uint32_t device_display_id_count);
+
typedef struct QXLDevInitInfo {
uint32_t num_memslots_groups;
uint32_t num_memslots;
diff --git a/server/spice-server.syms b/server/spice-server.syms
index edf04a42..ac4d9b14 100644
--- a/server/spice-server.syms
+++ b/server/spice-server.syms
@@ -173,3 +173,8 @@ SPICE_SERVER_0.13.2 {
global:
spice_server_set_video_codecs;
} SPICE_SERVER_0.13.1;
+
+SPICE_SERVER_0.14.2 {
+global:
+ spice_qxl_set_device_info;
+} SPICE_SERVER_0.13.2;
--
2.19.1
next prev parent reply other threads:[~2018-11-07 10:49 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-07 10:49 [Qemu-devel] [RFC PATCH spice/qemu v3 0/3] QXL interface to set monitor ID Lukáš Hrázký
2018-11-07 10:49 ` Lukáš Hrázký [this message]
2018-11-08 6:49 ` [Qemu-devel] [RFC PATCH spice v3 1/3] QXL interface: add a function to identify monitors in the guest Gerd Hoffmann
2018-11-08 10:05 ` Lukáš Hrázký
2018-11-08 16:34 ` [Qemu-devel] [Spice-devel] " Jonathon Jongsma
2018-11-09 10:10 ` [Qemu-devel] " Gerd Hoffmann
2018-11-09 10:20 ` Frediano Ziglio
2018-11-09 10:52 ` Gerd Hoffmann
2018-11-07 10:49 ` [Qemu-devel] [RFC PATCH spice v3 2/3] QXL interface: deprecate spice_qxl_set_max_monitors Lukáš Hrázký
2018-11-07 10:49 ` [Qemu-devel] [RFC PATCH qemu v3 3/3] spice: set device address and device display ID in QXL interface Lukáš Hrázký
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181107104921.20536-2-lhrazky@redhat.com \
--to=lhrazky@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=spice-devel@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).