linux/drivers/staging/vboxvideo/modesetting.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2006-2017 Oracle Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 */
  22
  23#include "vbox_drv.h"
  24#include "vbox_err.h"
  25#include "vboxvideo_guest.h"
  26#include "vboxvideo_vbe.h"
  27#include "hgsmi_channels.h"
  28
  29/**
  30 * Set a video mode via an HGSMI request.  The views must have been
  31 * initialised first using @a VBoxHGSMISendViewInfo and if the mode is being
  32 * set on the first display then it must be set first using registers.
  33 * @param  ctx           The context containing the heap to use
  34 * @param  display       The screen number
  35 * @param  origin_x      The horizontal displacement relative to the first scrn
  36 * @param  origin_y      The vertical displacement relative to the first screen
  37 * @param  start_offset  The offset of the visible area of the framebuffer
  38 *                       relative to the framebuffer start
  39 * @param  pitch         The offset in bytes between the starts of two adjecent
  40 *                       scan lines in video RAM
  41 * @param  width         The mode width
  42 * @param  height        The mode height
  43 * @param  bpp           The colour depth of the mode
  44 * @param  flags         Flags
  45 */
  46void hgsmi_process_display_info(struct gen_pool *ctx, u32 display,
  47                                s32 origin_x, s32 origin_y, u32 start_offset,
  48                                u32 pitch, u32 width, u32 height,
  49                                u16 bpp, u16 flags)
  50{
  51        struct vbva_infoscreen *p;
  52
  53        p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA,
  54                               VBVA_INFO_SCREEN);
  55        if (!p)
  56                return;
  57
  58        p->view_index = display;
  59        p->origin_x = origin_x;
  60        p->origin_y = origin_y;
  61        p->start_offset = start_offset;
  62        p->line_size = pitch;
  63        p->width = width;
  64        p->height = height;
  65        p->bits_per_pixel = bpp;
  66        p->flags = flags;
  67
  68        hgsmi_buffer_submit(ctx, p);
  69        hgsmi_buffer_free(ctx, p);
  70}
  71
  72/**
  73 * Report the rectangle relative to which absolute pointer events should be
  74 * expressed.  This information remains valid until the next VBVA resize event
  75 * for any screen, at which time it is reset to the bounding rectangle of all
  76 * virtual screens.
  77 * @param  ctx       The context containing the heap to use.
  78 * @param  origin_x  Upper left X co-ordinate relative to the first screen.
  79 * @param  origin_y  Upper left Y co-ordinate relative to the first screen.
  80 * @param  width     Rectangle width.
  81 * @param  height    Rectangle height.
  82 * @returns 0 on success, -errno on failure
  83 */
  84int hgsmi_update_input_mapping(struct gen_pool *ctx, s32 origin_x, s32 origin_y,
  85                               u32 width, u32 height)
  86{
  87        struct vbva_report_input_mapping *p;
  88
  89        p = hgsmi_buffer_alloc(ctx, sizeof(*p), HGSMI_CH_VBVA,
  90                               VBVA_REPORT_INPUT_MAPPING);
  91        if (!p)
  92                return -ENOMEM;
  93
  94        p->x = origin_x;
  95        p->y = origin_y;
  96        p->cx = width;
  97        p->cy = height;
  98
  99        hgsmi_buffer_submit(ctx, p);
 100        hgsmi_buffer_free(ctx, p);
 101
 102        return 0;
 103}
 104
 105/**
 106 * Get most recent video mode hints.
 107 * @param  ctx      The context containing the heap to use.
 108 * @param  screens  The number of screens to query hints for, starting at 0.
 109 * @param  hints    Array of vbva_modehint structures for receiving the hints.
 110 * @returns 0 on success, -errno on failure
 111 */
 112int hgsmi_get_mode_hints(struct gen_pool *ctx, unsigned int screens,
 113                         struct vbva_modehint *hints)
 114{
 115        struct vbva_query_mode_hints *p;
 116        size_t size;
 117
 118        if (WARN_ON(!hints))
 119                return -EINVAL;
 120
 121        size = screens * sizeof(struct vbva_modehint);
 122        p = hgsmi_buffer_alloc(ctx, sizeof(*p) + size, HGSMI_CH_VBVA,
 123                               VBVA_QUERY_MODE_HINTS);
 124        if (!p)
 125                return -ENOMEM;
 126
 127        p->hints_queried_count = screens;
 128        p->hint_structure_guest_size = sizeof(struct vbva_modehint);
 129        p->rc = VERR_NOT_SUPPORTED;
 130
 131        hgsmi_buffer_submit(ctx, p);
 132
 133        if (RT_FAILURE(p->rc)) {
 134                hgsmi_buffer_free(ctx, p);
 135                return -EIO;
 136        }
 137
 138        memcpy(hints, ((u8 *)p) + sizeof(struct vbva_query_mode_hints), size);
 139        hgsmi_buffer_free(ctx, p);
 140
 141        return 0;
 142}
 143