| /* | |
| * Copyright (C) 2006-2017 Oracle Corporation | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a | |
| * copy of this software and associated documentation files (the "Software"), | |
| * to deal in the Software without restriction, including without limitation | |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| * and/or sell copies of the Software, and to permit persons to whom the | |
| * Software is furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be included in | |
| * all copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
| * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
| * OTHER DEALINGS IN THE SOFTWARE. | |
| */ | |
| #include "vbox_drv.h" | |
| #include "vbox_err.h" | |
| #include "vboxvideo_guest.h" | |
| #include "vboxvideo_vbe.h" | |
| #include "hgsmi_channels.h" | |
| /** | |
| * Set a video mode via an HGSMI request. The views must have been | |
| * initialised first using @a VBoxHGSMISendViewInfo and if the mode is being | |
| * set on the first display then it must be set first using registers. | |
| * @param ctx The context containing the heap to use | |
| * @param display The screen number | |
| * @param origin_x The horizontal displacement relative to the first scrn | |
| * @param origin_y The vertical displacement relative to the first screen | |
| * @param start_offset The offset of the visible area of the framebuffer | |
| * relative to the framebuffer start | |
| * @param pitch The offset in bytes between the starts of two adjecent | |
| * scan lines in video RAM | |
| * @param width The mode width | |
| * @param height The mode height | |
| * @param bpp The colour depth of the mode | |
| * @param flags Flags | |
| */ | |
| void hgsmi_process_display_info(struct gen_pool *ctx, u32 display, | |
| s32 origin_x, s32 origin_y, u32 start_offset, | |
| u32 pitch, u32 width, u32 height, | |
| u16 bpp, u16 flags) | |
| { | |
| struct vbva_infoscreen *p; | |
| p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA, | |
| VBVA_INFO_SCREEN); | |
| if (!p) | |
| return; | |
| p->view_index = display; | |
| p->origin_x = origin_x; | |
| p->origin_y = origin_y; | |
| p->start_offset = start_offset; | |
| p->line_size = pitch; | |
| p->width = width; | |
| p->height = height; | |
| p->bits_per_pixel = bpp; | |
| p->flags = flags; | |
| hgsmi_buffer_submit(ctx, p); | |
| hgsmi_buffer_free(ctx, p); | |
| } | |
| /** | |
| * Report the rectangle relative to which absolute pointer events should be | |
| * expressed. This information remains valid until the next VBVA resize event | |
| * for any screen, at which time it is reset to the bounding rectangle of all | |
| * virtual screens. | |
| * @param ctx The context containing the heap to use. | |
| * @param origin_x Upper left X co-ordinate relative to the first screen. | |
| * @param origin_y Upper left Y co-ordinate relative to the first screen. | |
| * @param width Rectangle width. | |
| * @param height Rectangle height. | |
| * @returns 0 on success, -errno on failure | |
| */ | |
| int hgsmi_update_input_mapping(struct gen_pool *ctx, s32 origin_x, s32 origin_y, | |
| u32 width, u32 height) | |
| { | |
| struct vbva_report_input_mapping *p; | |
| p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA, | |
| VBVA_REPORT_INPUT_MAPPING); | |
| if (!p) | |
| return -ENOMEM; | |
| p->x = origin_x; | |
| p->y = origin_y; | |
| p->cx = width; | |
| p->cy = height; | |
| hgsmi_buffer_submit(ctx, p); | |
| hgsmi_buffer_free(ctx, p); | |
| return 0; | |
| } | |
| /** | |
| * Get most recent video mode hints. | |
| * @param ctx The context containing the heap to use. | |
| * @param screens The number of screens to query hints for, starting at 0. | |
| * @param hints Array of vbva_modehint structures for receiving the hints. | |
| * @returns 0 on success, -errno on failure | |
| */ | |
| int hgsmi_get_mode_hints(struct gen_pool *ctx, unsigned int screens, | |
| struct vbva_modehint *hints) | |
| { | |
| struct vbva_query_mode_hints *p; | |
| size_t size; | |
| if (WARN_ON(!hints)) | |
| return -EINVAL; | |
| size = screens * sizeof(struct vbva_modehint); | |
| p = hgsmi_buffer_alloc(ctx, sizeof(*p) + size, HGSMI_CH_VBVA, | |
| VBVA_QUERY_MODE_HINTS); | |
| if (!p) | |
| return -ENOMEM; | |
| p->hints_queried_count = screens; | |
| p->hint_structure_guest_size = sizeof(struct vbva_modehint); | |
| p->rc = VERR_NOT_SUPPORTED; | |
| hgsmi_buffer_submit(ctx, p); | |
| if (RT_FAILURE(p->rc)) { | |
| hgsmi_buffer_free(ctx, p); | |
| return -EIO; | |
| } | |
| memcpy(hints, ((u8 *)p) + sizeof(struct vbva_query_mode_hints), size); | |
| hgsmi_buffer_free(ctx, p); | |
| return 0; | |
| } |