summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/svga/drm/vmw_msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/svga/drm/vmw_msg.c')
-rw-r--r--src/gallium/winsys/svga/drm/vmw_msg.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_msg.c b/src/gallium/winsys/svga/drm/vmw_msg.c
index 2a2d6a61297..e664769c279 100644
--- a/src/gallium/winsys/svga/drm/vmw_msg.c
+++ b/src/gallium/winsys/svga/drm/vmw_msg.c
@@ -31,6 +31,9 @@
#include "pipe/p_defines.h"
#include "svga_winsys.h"
#include "vmw_msg.h"
+#include "vmwgfx_drm.h"
+#include "vmw_screen.h"
+#include "xf86drm.h"
#define MESSAGE_STATUS_SUCCESS 0x0001
@@ -424,6 +427,7 @@ void
vmw_svga_winsys_host_log(struct svga_winsys_screen *sws, const char *log)
{
struct rpc_channel channel;
+ struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
char *msg;
int msg_len;
int ret;
@@ -444,9 +448,21 @@ vmw_svga_winsys_host_log(struct svga_winsys_screen *sws, const char *log)
sprintf(msg, "log %s", log);
- if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
- ret = vmw_send_msg(&channel, msg);
- vmw_close_channel(&channel);
+ if (vws->ioctl.have_drm_2_17) {
+ struct drm_vmw_msg_arg msg_arg;
+
+ memset(&msg_arg, 0, sizeof(msg_arg));
+ msg_arg.send = (uint64_t) (unsigned long) (msg);
+ msg_arg.send_only = 1;
+
+ ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_MSG,
+ &msg_arg, sizeof(msg_arg));
+
+ } else {
+ if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
+ ret = vmw_send_msg(&channel, msg);
+ vmw_close_channel(&channel);
+ }
}
if (ret)