Subversion Repositories Kolibri OS

Rev

Rev 4111 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.  */
  64. struct 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 1
  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.  */
  96. struct 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.  */
  108. struct vmw_clip_rect {
  109.         int x1, x2, y1, y2;
  110. };
  111.  
  112. struct 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.  
  121. struct vmw_framebuffer_dmabuf {
  122.         struct vmw_framebuffer base;
  123.         struct vmw_dma_buffer *buffer;
  124. };
  125.  
  126.  
  127. /*
  128.  * Basic cursor manipulation
  129.  */
  130. int vmw_cursor_update_image(struct vmw_private *dev_priv,
  131.                             u32 *image, u32 width, u32 height,
  132.                             u32 hotspotX, u32 hotspotY);
  133. int 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);
  137. void 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.  */
  148. struct 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. };
  182.  
  183. #define vmw_crtc_to_du(x) \
  184.         container_of(x, struct vmw_display_unit, crtc)
  185. #define vmw_connector_to_du(x) \
  186.         container_of(x, struct vmw_display_unit, connector)
  187.  
  188.  
  189. /*
  190.  * Shared display unit functions - vmwgfx_kms.c
  191.  */
  192. void vmw_du_cleanup(struct vmw_display_unit *du);
  193. void vmw_du_crtc_save(struct drm_crtc *crtc);
  194. void vmw_du_crtc_restore(struct drm_crtc *crtc);
  195. void vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
  196.                            u16 *r, u16 *g, u16 *b,
  197.                            uint32_t start, uint32_t size);
  198. int vmw_du_crtc_cursor_set2(struct drm_crtc *crtc, struct drm_file *file_priv,
  199.                             uint32_t handle, uint32_t width, uint32_t height,
  200.                             int32_t hot_x, int32_t hot_y);
  201. int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y);
  202. int vmw_du_connector_dpms(struct drm_connector *connector, int mode);
  203. void vmw_du_connector_save(struct drm_connector *connector);
  204. void vmw_du_connector_restore(struct drm_connector *connector);
  205. enum drm_connector_status
  206. vmw_du_connector_detect(struct drm_connector *connector, bool force);
  207. int vmw_du_connector_fill_modes(struct drm_connector *connector,
  208.                                 uint32_t max_width, uint32_t max_height);
  209. int vmw_du_connector_set_property(struct drm_connector *connector,
  210.                                   struct drm_property *property,
  211.                                   uint64_t val);
  212. int vmw_kms_helper_dirty(struct vmw_private *dev_priv,
  213.                          struct vmw_framebuffer *framebuffer,
  214.                          const struct drm_clip_rect *clips,
  215.                          const struct drm_vmw_rect *vclips,
  216.                          s32 dest_x, s32 dest_y,
  217.                          int num_clips,
  218.                          int increment,
  219.                          struct vmw_kms_dirty *dirty);
  220.  
  221. int vmw_kms_helper_buffer_prepare(struct vmw_private *dev_priv,
  222.                                   struct vmw_dma_buffer *buf,
  223.                                   bool interruptible,
  224.                                   bool validate_as_mob);
  225. void vmw_kms_helper_buffer_revert(struct vmw_dma_buffer *buf);
  226. void vmw_kms_helper_buffer_finish(struct vmw_private *dev_priv,
  227.                                   struct drm_file *file_priv,
  228.                                   struct vmw_dma_buffer *buf,
  229.                                   struct vmw_fence_obj **out_fence,
  230.                                   struct drm_vmw_fence_rep __user *
  231.                                   user_fence_rep);
  232. int vmw_kms_helper_resource_prepare(struct vmw_resource *res,
  233.                                     bool interruptible);
  234. void vmw_kms_helper_resource_revert(struct vmw_resource *res);
  235. void vmw_kms_helper_resource_finish(struct vmw_resource *res,
  236.                                     struct vmw_fence_obj **out_fence);
  237. int vmw_kms_readback(struct vmw_private *dev_priv,
  238.                      struct drm_file *file_priv,
  239.                      struct vmw_framebuffer *vfb,
  240.                      struct drm_vmw_fence_rep __user *user_fence_rep,
  241.                      struct drm_vmw_rect *vclips,
  242.                      uint32_t num_clips);
  243. struct vmw_framebuffer *
  244. vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
  245.                         struct vmw_dma_buffer *dmabuf,
  246.                         struct vmw_surface *surface,
  247.                         bool only_2d,
  248.                         const struct drm_mode_fb_cmd *mode_cmd);
  249. int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
  250.                             unsigned unit,
  251.                             u32 max_width,
  252.                             u32 max_height,
  253.                             struct drm_connector **p_con,
  254.                             struct drm_crtc **p_crtc,
  255.                             struct drm_display_mode **p_mode);
  256. void vmw_guess_mode_timing(struct drm_display_mode *mode);
  257.  
  258. /*
  259.  * Legacy display unit functions - vmwgfx_ldu.c
  260.  */
  261. int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
  262. int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
  263. int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
  264.                                 struct vmw_framebuffer *framebuffer,
  265.                                 unsigned flags, unsigned color,
  266.                                 struct drm_clip_rect *clips,
  267.                                 unsigned num_clips, int increment);
  268. int vmw_kms_update_proxy(struct vmw_resource *res,
  269.                          const struct drm_clip_rect *clips,
  270.                          unsigned num_clips,
  271.                          int increment);
  272.  
  273. /*
  274.  * Screen Objects display functions - vmwgfx_scrn.c
  275.  */
  276. int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
  277. int vmw_kms_sou_close_display(struct vmw_private *dev_priv);
  278. int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
  279.                                  struct vmw_framebuffer *framebuffer,
  280.                                  struct drm_clip_rect *clips,
  281.                                  struct drm_vmw_rect *vclips,
  282.                                  struct vmw_resource *srf,
  283.                                  s32 dest_x,
  284.                                  s32 dest_y,
  285.                                  unsigned num_clips, int inc,
  286.                                  struct vmw_fence_obj **out_fence);
  287. int vmw_kms_sou_do_dmabuf_dirty(struct vmw_private *dev_priv,
  288.                                 struct vmw_framebuffer *framebuffer,
  289.                                 struct drm_clip_rect *clips,
  290.                                 unsigned num_clips, int increment,
  291.                                 bool interruptible,
  292.                                 struct vmw_fence_obj **out_fence);
  293. int vmw_kms_sou_readback(struct vmw_private *dev_priv,
  294.                          struct drm_file *file_priv,
  295.                          struct vmw_framebuffer *vfb,
  296.                          struct drm_vmw_fence_rep __user *user_fence_rep,
  297.                          struct drm_vmw_rect *vclips,
  298.                          uint32_t num_clips);
  299.  
  300. /*
  301.  * Screen Target Display Unit functions - vmwgfx_stdu.c
  302.  */
  303. int vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
  304. int vmw_kms_stdu_close_display(struct vmw_private *dev_priv);
  305. int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv,
  306.                                struct vmw_framebuffer *framebuffer,
  307.                                struct drm_clip_rect *clips,
  308.                                struct drm_vmw_rect *vclips,
  309.                                struct vmw_resource *srf,
  310.                                s32 dest_x,
  311.                                s32 dest_y,
  312.                                unsigned num_clips, int inc,
  313.                                struct vmw_fence_obj **out_fence);
  314. int vmw_kms_stdu_dma(struct vmw_private *dev_priv,
  315.                      struct drm_file *file_priv,
  316.                      struct vmw_framebuffer *vfb,
  317.                      struct drm_vmw_fence_rep __user *user_fence_rep,
  318.                      struct drm_clip_rect *clips,
  319.                      struct drm_vmw_rect *vclips,
  320.                      uint32_t num_clips,
  321.                      int increment,
  322.                      bool to_surface,
  323.                      bool interruptible);
  324.  
  325.  
  326. #endif
  327.