linux/drivers/gpu/drm/virtio/virtgpu_plane.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2015 Red Hat, Inc.
   3 * All Rights Reserved.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining
   6 * a copy of this software and associated documentation files (the
   7 * "Software"), to deal in the Software without restriction, including
   8 * without limitation the rights to use, copy, modify, merge, publish,
   9 * distribute, sublicense, and/or sell copies of the Software, and to
  10 * permit persons to whom the Software is furnished to do so, subject to
  11 * the following conditions:
  12 *
  13 * The above copyright notice and this permission notice (including the
  14 * next paragraph) shall be included in all copies or substantial
  15 * portions of the Software.
  16 *
  17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
  21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24 */
  25
  26#include "virtgpu_drv.h"
  27#include <drm/drm_plane_helper.h>
  28#include <drm/drm_atomic_helper.h>
  29
  30static const uint32_t virtio_gpu_formats[] = {
  31        DRM_FORMAT_XRGB8888,
  32        DRM_FORMAT_ARGB8888,
  33        DRM_FORMAT_BGRX8888,
  34        DRM_FORMAT_BGRA8888,
  35        DRM_FORMAT_RGBX8888,
  36        DRM_FORMAT_RGBA8888,
  37        DRM_FORMAT_XBGR8888,
  38        DRM_FORMAT_ABGR8888,
  39};
  40
  41static void virtio_gpu_plane_destroy(struct drm_plane *plane)
  42{
  43        kfree(plane);
  44}
  45
  46static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
  47        .update_plane           = drm_atomic_helper_update_plane,
  48        .disable_plane          = drm_atomic_helper_disable_plane,
  49        .destroy                = virtio_gpu_plane_destroy,
  50        .reset                  = drm_atomic_helper_plane_reset,
  51        .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
  52        .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
  53};
  54
  55static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
  56                                         struct drm_plane_state *state)
  57{
  58        return 0;
  59}
  60
  61static void virtio_gpu_plane_atomic_update(struct drm_plane *plane,
  62                                           struct drm_plane_state *old_state)
  63{
  64        struct drm_device *dev = plane->dev;
  65        struct virtio_gpu_device *vgdev = dev->dev_private;
  66        struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(plane->crtc);
  67        struct virtio_gpu_framebuffer *vgfb;
  68        struct virtio_gpu_object *bo;
  69        uint32_t handle;
  70
  71        if (plane->fb) {
  72                vgfb = to_virtio_gpu_framebuffer(plane->fb);
  73                bo = gem_to_virtio_gpu_obj(vgfb->obj);
  74                handle = bo->hw_res_handle;
  75        } else {
  76                handle = 0;
  77        }
  78
  79        DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d\n", handle,
  80                  plane->state->crtc_w, plane->state->crtc_h,
  81                  plane->state->crtc_x, plane->state->crtc_y);
  82        virtio_gpu_cmd_set_scanout(vgdev, output->index, handle,
  83                                   plane->state->crtc_w,
  84                                   plane->state->crtc_h,
  85                                   plane->state->crtc_x,
  86                                   plane->state->crtc_y);
  87}
  88
  89
  90static const struct drm_plane_helper_funcs virtio_gpu_plane_helper_funcs = {
  91        .atomic_check           = virtio_gpu_plane_atomic_check,
  92        .atomic_update          = virtio_gpu_plane_atomic_update,
  93};
  94
  95struct drm_plane *virtio_gpu_plane_init(struct virtio_gpu_device *vgdev,
  96                                        int index)
  97{
  98        struct drm_device *dev = vgdev->ddev;
  99        struct drm_plane *plane;
 100        int ret;
 101
 102        plane = kzalloc(sizeof(*plane), GFP_KERNEL);
 103        if (!plane)
 104                return ERR_PTR(-ENOMEM);
 105
 106        ret = drm_universal_plane_init(dev, plane, 1 << index,
 107                                       &virtio_gpu_plane_funcs,
 108                                       virtio_gpu_formats,
 109                                       ARRAY_SIZE(virtio_gpu_formats),
 110                                       DRM_PLANE_TYPE_PRIMARY);
 111        if (ret)
 112                goto err_plane_init;
 113
 114        drm_plane_helper_add(plane, &virtio_gpu_plane_helper_funcs);
 115        return plane;
 116
 117err_plane_init:
 118        kfree(plane);
 119        return ERR_PTR(ret);
 120}
 121