linux/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
<<
>>
Prefs
   1/**************************************************************************
   2 *
   3 * Copyright © 2009-2015 VMware, Inc., Palo Alto, CA., USA
   4 * All Rights Reserved.
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the
   8 * "Software"), to deal in the Software without restriction, including
   9 * without limitation the rights to use, copy, modify, merge, publish,
  10 * distribute, sub license, and/or sell copies of the Software, and to
  11 * permit persons to whom the Software is furnished to do so, subject to
  12 * the following conditions:
  13 *
  14 * The above copyright notice and this permission notice (including the
  15 * next paragraph) shall be included in all copies or substantial portions
  16 * of the Software.
  17 *
  18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
  25 *
  26 **************************************************************************/
  27
  28#ifndef VMWGFX_KMS_H_
  29#define VMWGFX_KMS_H_
  30
  31#include <drm/drmP.h>
  32#include <drm/drm_crtc_helper.h>
  33#include "vmwgfx_drv.h"
  34
  35/**
  36 * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty
  37 * function.
  38 *
  39 * @fifo_commit: Callback that is called once for each display unit after
  40 * all clip rects. This function must commit the fifo space reserved by the
  41 * helper. Set up by the caller.
  42 * @clip: Callback that is called for each cliprect on each display unit.
  43 * Set up by the caller.
  44 * @fifo_reserve_size: Fifo size that the helper should try to allocat for
  45 * each display unit. Set up by the caller.
  46 * @dev_priv: Pointer to the device private. Set up by the helper.
  47 * @unit: The current display unit. Set up by the helper before a call to @clip.
  48 * @cmd: The allocated fifo space. Set up by the helper before the first @clip
  49 * call.
  50 * @num_hits: Number of clip rect commands for this display unit.
  51 * Cleared by the helper before the first @clip call. Updated by the @clip
  52 * callback.
  53 * @fb_x: Clip rect left side in framebuffer coordinates.
  54 * @fb_y: Clip rect right side in framebuffer coordinates.
  55 * @unit_x1: Clip rect left side in crtc coordinates.
  56 * @unit_y1: Clip rect top side in crtc coordinates.
  57 * @unit_x2: Clip rect right side in crtc coordinates.
  58 * @unit_y2: Clip rect bottom side in crtc coordinates.
  59 *
  60 * The clip rect coordinates are updated by the helper for each @clip call.
  61 * Note that this may be derived from if more info needs to be passed between
  62 * helper caller and helper callbacks.
  63 */
  64struct vmw_kms_dirty {
  65        void (*fifo_commit)(struct vmw_kms_dirty *);
  66        void (*clip)(struct vmw_kms_dirty *);
  67        size_t fifo_reserve_size;
  68        struct vmw_private *dev_priv;
  69        struct vmw_display_unit *unit;
  70        void *cmd;
  71        u32 num_hits;
  72        s32 fb_x;
  73        s32 fb_y;
  74        s32 unit_x1;
  75        s32 unit_y1;
  76        s32 unit_x2;
  77        s32 unit_y2;
  78};
  79
  80#define VMWGFX_NUM_DISPLAY_UNITS 8
  81
  82
  83#define vmw_framebuffer_to_vfb(x) \
  84        container_of(x, struct vmw_framebuffer, base)
  85#define vmw_framebuffer_to_vfbs(x) \
  86        container_of(x, struct vmw_framebuffer_surface, base.base)
  87#define vmw_framebuffer_to_vfbd(x) \
  88        container_of(x, struct vmw_framebuffer_dmabuf, base.base)
  89
  90/**
  91 * Base class for framebuffers
  92 *
  93 * @pin is called the when ever a crtc uses this framebuffer
  94 * @unpin is called
  95 */
  96struct vmw_framebuffer {
  97        struct drm_framebuffer base;
  98        int (*pin)(struct vmw_framebuffer *fb);
  99        int (*unpin)(struct vmw_framebuffer *fb);
 100        bool dmabuf;
 101        struct ttm_base_object *user_obj;
 102        uint32_t user_handle;
 103};
 104
 105/*
 106 * Clip rectangle
 107 */
 108struct vmw_clip_rect {
 109        int x1, x2, y1, y2;
 110};
 111
 112struct vmw_framebuffer_surface {
 113        struct vmw_framebuffer base;
 114        struct vmw_surface *surface;
 115        struct vmw_dma_buffer *buffer;
 116        struct list_head head;
 117        bool is_dmabuf_proxy;  /* true if this is proxy surface for DMA buf */
 118};
 119
 120
 121struct vmw_framebuffer_dmabuf {
 122        struct vmw_framebuffer base;
 123        struct vmw_dma_buffer *buffer;
 124};
 125
 126
 127/*
 128 * Basic cursor manipulation
 129 */
 130int vmw_cursor_update_image(struct vmw_private *dev_priv,
 131                            u32 *image, u32 width, u32 height,
 132                            u32 hotspotX, u32 hotspotY);
 133int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
 134                             struct vmw_dma_buffer *dmabuf,
 135                             u32 width, u32 height,
 136                             u32 hotspotX, u32 hotspotY);
 137void vmw_cursor_update_position(struct vmw_private *dev_priv,
 138                                bool show, int x, int y);
 139
 140
 141/**
 142 * Base class display unit.
 143 *
 144 * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector
 145 * so the display unit is all of them at the same time. This is true for both
 146 * legacy multimon and screen objects.
 147 */
 148struct vmw_display_unit {
 149        struct drm_crtc crtc;
 150        struct drm_encoder encoder;
 151        struct drm_connector connector;
 152
 153        struct vmw_surface *cursor_surface;
 154        struct vmw_dma_buffer *cursor_dmabuf;
 155        size_t cursor_age;
 156
 157        int cursor_x;
 158        int cursor_y;
 159
 160        int hotspot_x;
 161        int hotspot_y;
 162        s32 core_hotspot_x;
 163        s32 core_hotspot_y;
 164
 165        unsigned unit;
 166
 167        /*
 168         * Prefered mode tracking.
 169         */
 170        unsigned pref_width;
 171        unsigned pref_height;
 172        bool pref_active;
 173        struct drm_display_mode *pref_mode;
 174
 175        /*
 176         * Gui positioning
 177         */
 178        int gui_x;
 179        int gui_y;
 180        bool is_implicit;
 181        bool active_implicit;
 182        int set_gui_x;
 183        int set_gui_y;
 184};
 185
 186#define vmw_crtc_to_du(x) \
 187        container_of(x, struct vmw_display_unit, crtc)
 188#define vmw_connector_to_du(x) \
 189        container_of(x, struct vmw_display_unit, connector)
 190
 191
 192/*
 193 * Shared display unit functions - vmwgfx_kms.c
 194 */
 195void vmw_du_cleanup(struct vmw_display_unit *du);
 196void vmw_du_crtc_save(struct drm_crtc *crtc);
 197void vmw_du_crtc_restore(struct drm_crtc *crtc);
 198void vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
 199                           u16 *r, u16 *g, u16 *b,
 200                           uint32_t start, uint32_t size);
 201int vmw_du_crtc_cursor_set2(struct drm_crtc *crtc, struct drm_file *file_priv,
 202                            uint32_t handle, uint32_t width, uint32_t height,
 203                            int32_t hot_x, int32_t hot_y);
 204int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y);
 205int vmw_du_connector_dpms(struct drm_connector *connector, int mode);
 206void vmw_du_connector_save(struct drm_connector *connector);
 207void vmw_du_connector_restore(struct drm_connector *connector);
 208enum drm_connector_status
 209vmw_du_connector_detect(struct drm_connector *connector, bool force);
 210int vmw_du_connector_fill_modes(struct drm_connector *connector,
 211                                uint32_t max_width, uint32_t max_height);
 212int vmw_du_connector_set_property(struct drm_connector *connector,
 213                                  struct drm_property *property,
 214                                  uint64_t val);
 215int vmw_kms_helper_dirty(struct vmw_private *dev_priv,
 216                         struct vmw_framebuffer *framebuffer,
 217                         const struct drm_clip_rect *clips,
 218                         const struct drm_vmw_rect *vclips,
 219                         s32 dest_x, s32 dest_y,
 220                         int num_clips,
 221                         int increment,
 222                         struct vmw_kms_dirty *dirty);
 223
 224int vmw_kms_helper_buffer_prepare(struct vmw_private *dev_priv,
 225                                  struct vmw_dma_buffer *buf,
 226                                  bool interruptible,
 227                                  bool validate_as_mob);
 228void vmw_kms_helper_buffer_revert(struct vmw_dma_buffer *buf);
 229void vmw_kms_helper_buffer_finish(struct vmw_private *dev_priv,
 230                                  struct drm_file *file_priv,
 231                                  struct vmw_dma_buffer *buf,
 232                                  struct vmw_fence_obj **out_fence,
 233                                  struct drm_vmw_fence_rep __user *
 234                                  user_fence_rep);
 235int vmw_kms_helper_resource_prepare(struct vmw_resource *res,
 236                                    bool interruptible);
 237void vmw_kms_helper_resource_revert(struct vmw_resource *res);
 238void vmw_kms_helper_resource_finish(struct vmw_resource *res,
 239                                    struct vmw_fence_obj **out_fence);
 240int vmw_kms_readback(struct vmw_private *dev_priv,
 241                     struct drm_file *file_priv,
 242                     struct vmw_framebuffer *vfb,
 243                     struct drm_vmw_fence_rep __user *user_fence_rep,
 244                     struct drm_vmw_rect *vclips,
 245                     uint32_t num_clips);
 246struct vmw_framebuffer *
 247vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
 248                        struct vmw_dma_buffer *dmabuf,
 249                        struct vmw_surface *surface,
 250                        bool only_2d,
 251                        const struct drm_mode_fb_cmd *mode_cmd);
 252int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
 253                            unsigned unit,
 254                            u32 max_width,
 255                            u32 max_height,
 256                            struct drm_connector **p_con,
 257                            struct drm_crtc **p_crtc,
 258                            struct drm_display_mode **p_mode);
 259void vmw_guess_mode_timing(struct drm_display_mode *mode);
 260void vmw_kms_del_active(struct vmw_private *dev_priv,
 261                        struct vmw_display_unit *du);
 262void vmw_kms_add_active(struct vmw_private *dev_priv,
 263                        struct vmw_display_unit *du,
 264                        struct vmw_framebuffer *vfb);
 265bool vmw_kms_crtc_flippable(struct vmw_private *dev_priv,
 266                            struct drm_crtc *crtc);
 267void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv,
 268                                struct drm_crtc *crtc);
 269void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv,
 270                                                bool immutable);
 271
 272
 273/*
 274 * Legacy display unit functions - vmwgfx_ldu.c
 275 */
 276int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
 277int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
 278int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
 279                                struct vmw_framebuffer *framebuffer,
 280                                unsigned flags, unsigned color,
 281                                struct drm_clip_rect *clips,
 282                                unsigned num_clips, int increment);
 283int vmw_kms_update_proxy(struct vmw_resource *res,
 284                         const struct drm_clip_rect *clips,
 285                         unsigned num_clips,
 286                         int increment);
 287
 288/*
 289 * Screen Objects display functions - vmwgfx_scrn.c
 290 */
 291int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
 292int vmw_kms_sou_close_display(struct vmw_private *dev_priv);
 293int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
 294                                 struct vmw_framebuffer *framebuffer,
 295                                 struct drm_clip_rect *clips,
 296                                 struct drm_vmw_rect *vclips,
 297                                 struct vmw_resource *srf,
 298                                 s32 dest_x,
 299                                 s32 dest_y,
 300                                 unsigned num_clips, int inc,
 301                                 struct vmw_fence_obj **out_fence);
 302int vmw_kms_sou_do_dmabuf_dirty(struct vmw_private *dev_priv,
 303                                struct vmw_framebuffer *framebuffer,
 304                                struct drm_clip_rect *clips,
 305                                struct drm_vmw_rect *vclips,
 306                                unsigned num_clips, int increment,
 307                                bool interruptible,
 308                                struct vmw_fence_obj **out_fence);
 309int vmw_kms_sou_readback(struct vmw_private *dev_priv,
 310                         struct drm_file *file_priv,
 311                         struct vmw_framebuffer *vfb,
 312                         struct drm_vmw_fence_rep __user *user_fence_rep,
 313                         struct drm_vmw_rect *vclips,
 314                         uint32_t num_clips);
 315
 316/*
 317 * Screen Target Display Unit functions - vmwgfx_stdu.c
 318 */
 319int vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
 320int vmw_kms_stdu_close_display(struct vmw_private *dev_priv);
 321int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv,
 322                               struct vmw_framebuffer *framebuffer,
 323                               struct drm_clip_rect *clips,
 324                               struct drm_vmw_rect *vclips,
 325                               struct vmw_resource *srf,
 326                               s32 dest_x,
 327                               s32 dest_y,
 328                               unsigned num_clips, int inc,
 329                               struct vmw_fence_obj **out_fence);
 330int vmw_kms_stdu_dma(struct vmw_private *dev_priv,
 331                     struct drm_file *file_priv,
 332                     struct vmw_framebuffer *vfb,
 333                     struct drm_vmw_fence_rep __user *user_fence_rep,
 334                     struct drm_clip_rect *clips,
 335                     struct drm_vmw_rect *vclips,
 336                     uint32_t num_clips,
 337                     int increment,
 338                     bool to_surface,
 339                     bool interruptible);
 340
 341
 342#endif
 343