1 // SPDX-License-Identifier: MIT
2 /* Copyright (C) 2006-2017 Oracle Corporation */
4 #include <linux/vbox_err.h>
6 #include "vboxvideo_guest.h"
7 #include "vboxvideo_vbe.h"
8 #include "hgsmi_channels.h"
9 #include "hgsmi_ch_setup.h"
12 * hgsmi_report_flags_location - Inform the host of the location of
13 * the host flags in VRAM via an HGSMI cmd.
14 * Return: 0 or negative errno value.
15 * @ctx: The context of the guest heap to use.
16 * @location: The offset chosen for the flags within guest VRAM.
18 int hgsmi_report_flags_location(struct gen_pool *ctx, u32 location)
20 struct hgsmi_buffer_location *p;
22 p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_HGSMI,
23 HGSMI_CC_HOST_FLAGS_LOCATION);
27 p->buf_location = location;
28 p->buf_len = sizeof(struct hgsmi_host_flags);
30 hgsmi_buffer_submit(ctx, p);
31 hgsmi_buffer_free(ctx, p);
37 * hgsmi_send_caps_info - Notify the host of HGSMI-related guest capabilities
38 * via an HGSMI command.
39 * Return: 0 or negative errno value.
40 * @ctx: The context of the guest heap to use.
41 * @caps: The capabilities to report, see vbva_caps.
43 int hgsmi_send_caps_info(struct gen_pool *ctx, u32 caps)
47 p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA, VBVA_INFO_CAPS);
51 p->rc = VERR_NOT_IMPLEMENTED;
54 hgsmi_buffer_submit(ctx, p);
56 WARN_ON_ONCE(p->rc < 0);
58 hgsmi_buffer_free(ctx, p);
63 int hgsmi_test_query_conf(struct gen_pool *ctx)
68 ret = hgsmi_query_conf(ctx, U32_MAX, &value);
72 return value == U32_MAX ? 0 : -EIO;
76 * hgsmi_query_conf - Query the host for an HGSMI configuration
77 * parameter via an HGSMI command.
78 * Return: 0 or negative errno value.
79 * @ctx: The context containing the heap used.
80 * @index: The index of the parameter to query.
81 * @value_ret: Where to store the value of the parameter on success.
83 int hgsmi_query_conf(struct gen_pool *ctx, u32 index, u32 *value_ret)
85 struct vbva_conf32 *p;
87 p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA,
95 hgsmi_buffer_submit(ctx, p);
97 *value_ret = p->value;
99 hgsmi_buffer_free(ctx, p);
105 * hgsmi_update_pointer_shape - Pass the host a new mouse pointer shape
106 * via an HGSMI command.
107 * Return: 0 or negative errno value.
108 * @ctx: The context containing the heap to be used.
109 * @flags: Cursor flags.
110 * @hot_x: Horizontal position of the hot spot.
111 * @hot_y: Vertical position of the hot spot.
112 * @width: Width in pixels of the cursor.
113 * @height: Height in pixels of the cursor.
114 * @pixels: Pixel data, @see VMMDevReqMousePointer for the format.
115 * @len: Size in bytes of the pixel data.
117 int hgsmi_update_pointer_shape(struct gen_pool *ctx, u32 flags,
118 u32 hot_x, u32 hot_y, u32 width, u32 height,
121 struct vbva_mouse_pointer_shape *p;
125 if (flags & VBOX_MOUSE_POINTER_SHAPE) {
127 * Size of the pointer data:
128 * sizeof (AND mask) + sizeof (XOR_MASK)
130 pixel_len = ((((width + 7) / 8) * height + 3) & ~3) +
136 * If shape is supplied, then always create the pointer visible.
137 * See comments in 'vboxUpdatePointerShape'
139 flags |= VBOX_MOUSE_POINTER_VISIBLE;
142 p = hgsmi_buffer_alloc(ctx, sizeof(*p) + pixel_len, HGSMI_CH_VBVA,
143 VBVA_MOUSE_POINTER_SHAPE);
147 p->result = VINF_SUCCESS;
154 memcpy(p->data, pixels, pixel_len);
156 hgsmi_buffer_submit(ctx, p);
165 case VERR_NOT_SUPPORTED:
172 hgsmi_buffer_free(ctx, p);
178 * hgsmi_cursor_position - Report the guest cursor position. The host may
179 * wish to use this information to re-position its
180 * own cursor (though this is currently unlikely).
181 * The current host cursor position is returned.
182 * Return: 0 or negative errno value.
183 * @ctx: The context containing the heap used.
184 * @report_position: Are we reporting a position?
185 * @x: Guest cursor X position.
186 * @y: Guest cursor Y position.
187 * @x_host: Host cursor X position is stored here. Optional.
188 * @y_host: Host cursor Y position is stored here. Optional.
190 int hgsmi_cursor_position(struct gen_pool *ctx, bool report_position,
191 u32 x, u32 y, u32 *x_host, u32 *y_host)
193 struct vbva_cursor_position *p;
195 p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA,
196 VBVA_CURSOR_POSITION);
200 p->report_position = report_position;
204 hgsmi_buffer_submit(ctx, p);
209 hgsmi_buffer_free(ctx, p);