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"
11 * Set a video mode via an HGSMI request. The views must have been
12 * initialised first using @a VBoxHGSMISendViewInfo and if the mode is being
13 * set on the first display then it must be set first using registers.
14 * @ctx: The context containing the heap to use.
15 * @display: The screen number.
16 * @origin_x: The horizontal displacement relative to the first scrn.
17 * @origin_y: The vertical displacement relative to the first screen.
18 * @start_offset: The offset of the visible area of the framebuffer
19 * relative to the framebuffer start.
20 * @pitch: The offset in bytes between the starts of two adjecent
21 * scan lines in video RAM.
22 * @width: The mode width.
23 * @height: The mode height.
24 * @bpp: The colour depth of the mode.
27 void hgsmi_process_display_info(struct gen_pool
*ctx
, u32 display
,
28 s32 origin_x
, s32 origin_y
, u32 start_offset
,
29 u32 pitch
, u32 width
, u32 height
,
32 struct vbva_infoscreen
*p
;
34 p
= hgsmi_buffer_alloc(ctx
, sizeof(*p
), HGSMI_CH_VBVA
,
39 p
->view_index
= display
;
40 p
->origin_x
= origin_x
;
41 p
->origin_y
= origin_y
;
42 p
->start_offset
= start_offset
;
46 p
->bits_per_pixel
= bpp
;
49 hgsmi_buffer_submit(ctx
, p
);
50 hgsmi_buffer_free(ctx
, p
);
54 * Report the rectangle relative to which absolute pointer events should be
55 * expressed. This information remains valid until the next VBVA resize event
56 * for any screen, at which time it is reset to the bounding rectangle of all
58 * Return: 0 or negative errno value.
59 * @ctx: The context containing the heap to use.
60 * @origin_x: Upper left X co-ordinate relative to the first screen.
61 * @origin_y: Upper left Y co-ordinate relative to the first screen.
62 * @width: Rectangle width.
63 * @height: Rectangle height.
65 int hgsmi_update_input_mapping(struct gen_pool
*ctx
, s32 origin_x
, s32 origin_y
,
66 u32 width
, u32 height
)
68 struct vbva_report_input_mapping
*p
;
70 p
= hgsmi_buffer_alloc(ctx
, sizeof(*p
), HGSMI_CH_VBVA
,
71 VBVA_REPORT_INPUT_MAPPING
);
80 hgsmi_buffer_submit(ctx
, p
);
81 hgsmi_buffer_free(ctx
, p
);
87 * Get most recent video mode hints.
88 * Return: 0 or negative errno value.
89 * @ctx: The context containing the heap to use.
90 * @screens: The number of screens to query hints for, starting at 0.
91 * @hints: Array of vbva_modehint structures for receiving the hints.
93 int hgsmi_get_mode_hints(struct gen_pool
*ctx
, unsigned int screens
,
94 struct vbva_modehint
*hints
)
96 struct vbva_query_mode_hints
*p
;
102 size
= screens
* sizeof(struct vbva_modehint
);
103 p
= hgsmi_buffer_alloc(ctx
, sizeof(*p
) + size
, HGSMI_CH_VBVA
,
104 VBVA_QUERY_MODE_HINTS
);
108 p
->hints_queried_count
= screens
;
109 p
->hint_structure_guest_size
= sizeof(struct vbva_modehint
);
110 p
->rc
= VERR_NOT_SUPPORTED
;
112 hgsmi_buffer_submit(ctx
, p
);
115 hgsmi_buffer_free(ctx
, p
);
119 memcpy(hints
, ((u8
*)p
) + sizeof(struct vbva_query_mode_hints
), size
);
120 hgsmi_buffer_free(ctx
, p
);