root/drivers/gpu/drm/vkms/vkms_output.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vkms_connector_destroy
  2. vkms_conn_get_modes
  3. vkms_output_init

   1 // SPDX-License-Identifier: GPL-2.0+
   2 
   3 #include "vkms_drv.h"
   4 #include <drm/drm_atomic_helper.h>
   5 #include <drm/drm_probe_helper.h>
   6 
   7 static void vkms_connector_destroy(struct drm_connector *connector)
   8 {
   9         drm_connector_cleanup(connector);
  10 }
  11 
  12 static const struct drm_connector_funcs vkms_connector_funcs = {
  13         .fill_modes = drm_helper_probe_single_connector_modes,
  14         .destroy = vkms_connector_destroy,
  15         .reset = drm_atomic_helper_connector_reset,
  16         .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  17         .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  18 };
  19 
  20 static const struct drm_encoder_funcs vkms_encoder_funcs = {
  21         .destroy = drm_encoder_cleanup,
  22 };
  23 
  24 static int vkms_conn_get_modes(struct drm_connector *connector)
  25 {
  26         int count;
  27 
  28         count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX);
  29         drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF);
  30 
  31         return count;
  32 }
  33 
  34 static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = {
  35         .get_modes    = vkms_conn_get_modes,
  36 };
  37 
  38 int vkms_output_init(struct vkms_device *vkmsdev, int index)
  39 {
  40         struct vkms_output *output = &vkmsdev->output;
  41         struct drm_device *dev = &vkmsdev->drm;
  42         struct drm_connector *connector = &output->connector;
  43         struct drm_encoder *encoder = &output->encoder;
  44         struct drm_crtc *crtc = &output->crtc;
  45         struct drm_plane *primary, *cursor = NULL;
  46         int ret;
  47 
  48         primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, index);
  49         if (IS_ERR(primary))
  50                 return PTR_ERR(primary);
  51 
  52         if (enable_cursor) {
  53                 cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index);
  54                 if (IS_ERR(cursor)) {
  55                         ret = PTR_ERR(cursor);
  56                         goto err_cursor;
  57                 }
  58         }
  59 
  60         ret = vkms_crtc_init(dev, crtc, primary, cursor);
  61         if (ret)
  62                 goto err_crtc;
  63 
  64         ret = drm_connector_init(dev, connector, &vkms_connector_funcs,
  65                                  DRM_MODE_CONNECTOR_VIRTUAL);
  66         if (ret) {
  67                 DRM_ERROR("Failed to init connector\n");
  68                 goto err_connector;
  69         }
  70 
  71         drm_connector_helper_add(connector, &vkms_conn_helper_funcs);
  72 
  73         ret = drm_encoder_init(dev, encoder, &vkms_encoder_funcs,
  74                                DRM_MODE_ENCODER_VIRTUAL, NULL);
  75         if (ret) {
  76                 DRM_ERROR("Failed to init encoder\n");
  77                 goto err_encoder;
  78         }
  79         encoder->possible_crtcs = 1;
  80 
  81         ret = drm_connector_attach_encoder(connector, encoder);
  82         if (ret) {
  83                 DRM_ERROR("Failed to attach connector to encoder\n");
  84                 goto err_attach;
  85         }
  86 
  87         drm_mode_config_reset(dev);
  88 
  89         return 0;
  90 
  91 err_attach:
  92         drm_encoder_cleanup(encoder);
  93 
  94 err_encoder:
  95         drm_connector_cleanup(connector);
  96 
  97 err_connector:
  98         drm_crtc_cleanup(crtc);
  99 
 100 err_crtc:
 101         if (enable_cursor)
 102                 drm_plane_cleanup(cursor);
 103 
 104 err_cursor:
 105         drm_plane_cleanup(primary);
 106 
 107         return ret;
 108 }

/* [<][>][^][v][top][bottom][index][help] */