]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'virtio-gpu-for-airlied' of git://git.kraxel.org/linux into drm-next
authorDave Airlie <airlied@redhat.com>
Thu, 9 Jun 2016 02:14:24 +0000 (12:14 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 9 Jun 2016 02:14:24 +0000 (12:14 +1000)
Virtio-gpu updates

* 'virtio-gpu-for-airlied' of git://git.kraxel.org/linux:
  virtio-gpu: use src not crtc
  virtio-gpu: pick up hotspot from framebuffer
  add cursor hotspot to drm_framebuffer
  virtio-gpu: switch to atomic cursor interfaces
  virtio-gpu: add atomic_commit function
  virtio-gpu: fix output lookup

1  2 
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/virtio/virtgpu_display.c
include/drm/drm_crtc.h

index da2f28ea5fad6f2bb8a722d47a1c35786cda4bfa,d7618bf18b4591afb4fb3619b1fb5202ee2ba823..a4e259524e11b248382c9a5b359f116e7e67ad37
@@@ -535,7 -535,7 +535,7 @@@ EXPORT_SYMBOL(drm_framebuffer_unregiste
   *
   * Cleanup framebuffer. This function is intended to be used from the drivers
   * ->destroy callback. It can also be used to clean up driver private
 - *  framebuffers embedded into a larger structure.
 + * framebuffers embedded into a larger structure.
   *
   * Note that this function does not remove the fb from active usuage - if it is
   * still used anywhere, hilarity can ensue since userspace could call getfb on
@@@ -692,7 -692,7 +692,7 @@@ int drm_crtc_init_with_planes(struct dr
        crtc->base.properties = &crtc->properties;
  
        list_add_tail(&crtc->head, &config->crtc_list);
 -      config->num_crtc++;
 +      crtc->index = config->num_crtc++;
  
        crtc->primary = primary;
        crtc->cursor = cursor;
@@@ -722,11 -722,6 +722,11 @@@ void drm_crtc_cleanup(struct drm_crtc *
  {
        struct drm_device *dev = crtc->dev;
  
 +      /* Note that the crtc_list is considered to be static; should we
 +       * remove the drm_crtc at runtime we would have to decrement all
 +       * the indices on the drm_crtc after us in the crtc_list.
 +       */
 +
        kfree(crtc->gamma_store);
        crtc->gamma_store = NULL;
  
  }
  EXPORT_SYMBOL(drm_crtc_cleanup);
  
 -/**
 - * drm_crtc_index - find the index of a registered CRTC
 - * @crtc: CRTC to find index for
 - *
 - * Given a registered CRTC, return the index of that CRTC within a DRM
 - * device's list of CRTCs.
 - */
 -unsigned int drm_crtc_index(struct drm_crtc *crtc)
 -{
 -      unsigned int index = 0;
 -      struct drm_crtc *tmp;
 -
 -      drm_for_each_crtc(tmp, crtc->dev) {
 -              if (tmp == crtc)
 -                      return index;
 -
 -              index++;
 -      }
 -
 -      BUG();
 -}
 -EXPORT_SYMBOL(drm_crtc_index);
 -
  /*
   * drm_mode_remove - remove and free a mode
   * @connector: connector list to modify
@@@ -1148,7 -1166,7 +1148,7 @@@ int drm_encoder_init(struct drm_device 
        }
  
        list_add_tail(&encoder->head, &dev->mode_config.encoder_list);
 -      dev->mode_config.num_encoder++;
 +      encoder->index = dev->mode_config.num_encoder++;
  
  out_put:
        if (ret)
@@@ -1161,6 -1179,29 +1161,6 @@@ out_unlock
  }
  EXPORT_SYMBOL(drm_encoder_init);
  
 -/**
 - * drm_encoder_index - find the index of a registered encoder
 - * @encoder: encoder to find index for
 - *
 - * Given a registered encoder, return the index of that encoder within a DRM
 - * device's list of encoders.
 - */
 -unsigned int drm_encoder_index(struct drm_encoder *encoder)
 -{
 -      unsigned int index = 0;
 -      struct drm_encoder *tmp;
 -
 -      drm_for_each_encoder(tmp, encoder->dev) {
 -              if (tmp == encoder)
 -                      return index;
 -
 -              index++;
 -      }
 -
 -      BUG();
 -}
 -EXPORT_SYMBOL(drm_encoder_index);
 -
  /**
   * drm_encoder_cleanup - cleans up an initialised encoder
   * @encoder: encoder to cleanup
@@@ -1171,11 -1212,6 +1171,11 @@@ void drm_encoder_cleanup(struct drm_enc
  {
        struct drm_device *dev = encoder->dev;
  
 +      /* Note that the encoder_list is considered to be static; should we
 +       * remove the drm_encoder at runtime we would have to decrement all
 +       * the indices on the drm_encoder after us in the encoder_list.
 +       */
 +
        drm_modeset_lock_all(dev);
        drm_mode_object_unregister(dev, &encoder->base);
        kfree(encoder->name);
@@@ -1264,7 -1300,7 +1264,7 @@@ int drm_universal_plane_init(struct drm
        plane->type = type;
  
        list_add_tail(&plane->head, &config->plane_list);
 -      config->num_total_plane++;
 +      plane->index = config->num_total_plane++;
        if (plane->type == DRM_PLANE_TYPE_OVERLAY)
                config->num_overlay_plane++;
  
@@@ -1338,11 -1374,6 +1338,11 @@@ void drm_plane_cleanup(struct drm_plan
  
        BUG_ON(list_empty(&plane->head));
  
 +      /* Note that the plane_list is considered to be static; should we
 +       * remove the drm_plane at runtime we would have to decrement all
 +       * the indices on the drm_plane after us in the plane_list.
 +       */
 +
        list_del(&plane->head);
        dev->mode_config.num_total_plane--;
        if (plane->type == DRM_PLANE_TYPE_OVERLAY)
  }
  EXPORT_SYMBOL(drm_plane_cleanup);
  
 -/**
 - * drm_plane_index - find the index of a registered plane
 - * @plane: plane to find index for
 - *
 - * Given a registered plane, return the index of that CRTC within a DRM
 - * device's list of planes.
 - */
 -unsigned int drm_plane_index(struct drm_plane *plane)
 -{
 -      unsigned int index = 0;
 -      struct drm_plane *tmp;
 -
 -      drm_for_each_plane(tmp, plane->dev) {
 -              if (tmp == plane)
 -                      return index;
 -
 -              index++;
 -      }
 -
 -      BUG();
 -}
 -EXPORT_SYMBOL(drm_plane_index);
 -
  /**
   * drm_plane_from_index - find the registered plane at an index
   * @dev: DRM device
@@@ -1371,11 -1425,13 +1371,11 @@@ struct drm_plane 
  drm_plane_from_index(struct drm_device *dev, int idx)
  {
        struct drm_plane *plane;
 -      unsigned int i = 0;
  
 -      drm_for_each_plane(plane, dev) {
 -              if (i == idx)
 +      drm_for_each_plane(plane, dev)
 +              if (idx == plane->index)
                        return plane;
 -              i++;
 -      }
 +
        return NULL;
  }
  EXPORT_SYMBOL(drm_plane_from_index);
@@@ -2919,6 -2975,8 +2919,8 @@@ static int drm_mode_cursor_universal(st
                                DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n");
                                return PTR_ERR(fb);
                        }
+                       fb->hot_x = req->hot_x;
+                       fb->hot_y = req->hot_y;
                } else {
                        fb = NULL;
                }
@@@ -5082,9 -5140,6 +5084,9 @@@ EXPORT_SYMBOL(drm_mode_connector_attach
  int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
                                 int gamma_size)
  {
 +      uint16_t *r_base, *g_base, *b_base;
 +      int i;
 +
        crtc->gamma_size = gamma_size;
  
        crtc->gamma_store = kcalloc(gamma_size, sizeof(uint16_t) * 3,
                return -ENOMEM;
        }
  
 +      r_base = crtc->gamma_store;
 +      g_base = r_base + gamma_size;
 +      b_base = g_base + gamma_size;
 +      for (i = 0; i < gamma_size; i++) {
 +              r_base[i] = i << 8;
 +              g_base[i] = i << 8;
 +              b_base[i] = i << 8;
 +      }
 +
 +
        return 0;
  }
  EXPORT_SYMBOL(drm_mode_crtc_set_gamma_size);
@@@ -5171,7 -5216,7 +5173,7 @@@ int drm_mode_gamma_set_ioctl(struct drm
                goto out;
        }
  
 -      crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size);
 +      ret = crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, crtc->gamma_size);
  
  out:
        drm_modeset_unlock_all(dev);
index ba5e11ba9f3aa381bee54352bb6e65a77334f0ec,d6f5d1e2d1f30505844a961bf178f59dabdf7680..d82ae1cddfcf7a0251e29ed96fa9e9931612c83e
@@@ -29,8 -29,8 +29,8 @@@
  #include <drm/drm_crtc_helper.h>
  #include <drm/drm_atomic_helper.h>
  
- #define XRES_MIN   320
- #define YRES_MIN   200
+ #define XRES_MIN    32
+ #define YRES_MIN    32
  
  #define XRES_DEF  1024
  #define YRES_DEF   768
  #define XRES_MAX  8192
  #define YRES_MAX  8192
  
- static void
- virtio_gpu_hide_cursor(struct virtio_gpu_device *vgdev,
-                      struct virtio_gpu_output *output)
- {
-       output->cursor.hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_UPDATE_CURSOR);
-       output->cursor.resource_id = 0;
-       virtio_gpu_cursor_ping(vgdev, output);
- }
- static int virtio_gpu_crtc_cursor_set(struct drm_crtc *crtc,
-                                     struct drm_file *file_priv,
-                                     uint32_t handle,
-                                     uint32_t width,
-                                     uint32_t height,
-                                     int32_t hot_x, int32_t hot_y)
- {
-       struct virtio_gpu_device *vgdev = crtc->dev->dev_private;
-       struct virtio_gpu_output *output =
-               container_of(crtc, struct virtio_gpu_output, crtc);
-       struct drm_gem_object *gobj = NULL;
-       struct virtio_gpu_object *qobj = NULL;
-       struct virtio_gpu_fence *fence = NULL;
-       int ret = 0;
-       if (handle == 0) {
-               virtio_gpu_hide_cursor(vgdev, output);
-               return 0;
-       }
-       /* lookup the cursor */
-       gobj = drm_gem_object_lookup(file_priv, handle);
-       if (gobj == NULL)
-               return -ENOENT;
-       qobj = gem_to_virtio_gpu_obj(gobj);
-       if (!qobj->hw_res_handle) {
-               ret = -EINVAL;
-               goto out;
-       }
-       virtio_gpu_cmd_transfer_to_host_2d(vgdev, qobj->hw_res_handle, 0,
-                                          cpu_to_le32(64),
-                                          cpu_to_le32(64),
-                                          0, 0, &fence);
-       ret = virtio_gpu_object_reserve(qobj, false);
-       if (!ret) {
-               reservation_object_add_excl_fence(qobj->tbo.resv,
-                                                 &fence->f);
-               fence_put(&fence->f);
-               virtio_gpu_object_unreserve(qobj);
-               virtio_gpu_object_wait(qobj, false);
-       }
-       output->cursor.hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_UPDATE_CURSOR);
-       output->cursor.resource_id = cpu_to_le32(qobj->hw_res_handle);
-       output->cursor.hot_x = cpu_to_le32(hot_x);
-       output->cursor.hot_y = cpu_to_le32(hot_y);
-       virtio_gpu_cursor_ping(vgdev, output);
-       ret = 0;
- out:
-       drm_gem_object_unreference_unlocked(gobj);
-       return ret;
- }
- static int virtio_gpu_crtc_cursor_move(struct drm_crtc *crtc,
-                                   int x, int y)
- {
-       struct virtio_gpu_device *vgdev = crtc->dev->dev_private;
-       struct virtio_gpu_output *output =
-               container_of(crtc, struct virtio_gpu_output, crtc);
-       output->cursor.hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_MOVE_CURSOR);
-       output->cursor.pos.x = cpu_to_le32(x);
-       output->cursor.pos.y = cpu_to_le32(y);
-       virtio_gpu_cursor_ping(vgdev, output);
-       return 0;
- }
  static int virtio_gpu_page_flip(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
                                struct drm_pending_vblank_event *event,
  
        if (event) {
                spin_lock_irqsave(&crtc->dev->event_lock, irqflags);
 -              drm_send_vblank_event(crtc->dev, -1, event);
 +              drm_crtc_send_vblank_event(crtc, event);
                spin_unlock_irqrestore(&crtc->dev->event_lock, irqflags);
        }
  
  }
  
  static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = {
-       .cursor_set2            = virtio_gpu_crtc_cursor_set,
-       .cursor_move            = virtio_gpu_crtc_cursor_move,
        .set_config             = drm_atomic_helper_set_config,
        .destroy                = drm_crtc_cleanup,
  
@@@ -406,7 -324,7 +324,7 @@@ static int vgdev_output_init(struct vir
        struct drm_connector *connector = &output->conn;
        struct drm_encoder *encoder = &output->enc;
        struct drm_crtc *crtc = &output->crtc;
-       struct drm_plane *plane;
+       struct drm_plane *primary, *cursor;
  
        output->index = index;
        if (index == 0) {
                output->info.r.height = cpu_to_le32(YRES_DEF);
        }
  
-       plane = virtio_gpu_plane_init(vgdev, index);
-       if (IS_ERR(plane))
-               return PTR_ERR(plane);
-       drm_crtc_init_with_planes(dev, crtc, plane, NULL,
+       primary = virtio_gpu_plane_init(vgdev, DRM_PLANE_TYPE_PRIMARY, index);
+       if (IS_ERR(primary))
+               return PTR_ERR(primary);
+       cursor = virtio_gpu_plane_init(vgdev, DRM_PLANE_TYPE_CURSOR, index);
+       if (IS_ERR(cursor))
+               return PTR_ERR(cursor);
+       drm_crtc_init_with_planes(dev, crtc, primary, cursor,
                                  &virtio_gpu_crtc_funcs, NULL);
        drm_crtc_helper_add(crtc, &virtio_gpu_crtc_helper_funcs);
-       plane->crtc = crtc;
+       primary->crtc = crtc;
+       cursor->crtc = crtc;
  
        drm_connector_init(dev, connector, &virtio_gpu_connector_funcs,
                           DRM_MODE_CONNECTOR_VIRTUAL);
@@@ -466,10 -388,30 +388,30 @@@ virtio_gpu_user_framebuffer_create(stru
        return &virtio_gpu_fb->base;
  }
  
+ static int vgdev_atomic_commit(struct drm_device *dev,
+                              struct drm_atomic_state *state,
+                              bool nonblock)
+ {
+       if (nonblock)
+               return -EBUSY;
+       drm_atomic_helper_swap_state(dev, state);
+       drm_atomic_helper_wait_for_fences(dev, state);
+       drm_atomic_helper_commit_modeset_disables(dev, state);
+       drm_atomic_helper_commit_modeset_enables(dev, state);
+       drm_atomic_helper_commit_planes(dev, state, true);
+       drm_atomic_helper_wait_for_vblanks(dev, state);
+       drm_atomic_helper_cleanup_planes(dev, state);
+       drm_atomic_state_free(state);
+       return 0;
+ }
  static const struct drm_mode_config_funcs virtio_gpu_mode_funcs = {
        .fb_create = virtio_gpu_user_framebuffer_create,
        .atomic_check = drm_atomic_helper_check,
-       .atomic_commit = drm_atomic_helper_commit,
+       .atomic_commit = vgdev_atomic_commit,
  };
  
  int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev)
diff --combined include/drm/drm_crtc.h
index 411be4f45506802ddede8c3a4a4a4de269032520,1460f660bf96be31ecd425501bc411d5a7cd51d8..451acbe89c2b44509af821283a985634dbf9505e
@@@ -253,6 -253,8 +253,8 @@@ struct drm_framebuffer 
        int bits_per_pixel;
        int flags;
        uint32_t pixel_format; /* fourcc format */
+       int hot_x;
+       int hot_y;
        struct list_head filp_head;
  };
  
@@@ -314,7 -316,6 +316,7 @@@ struct drm_plane_helper_funcs
   *    update to ensure framebuffer cleanup isn't done too early
   * @adjusted_mode: for use by helpers and drivers to compute adjusted mode timings
   * @mode: current mode timings
 + * @mode_blob: &drm_property_blob for @mode
   * @degamma_lut: Lookup table for converting framebuffer pixel data
   *    before apply the conversion matrix
   * @ctm: Transformation matrix
@@@ -479,8 -480,8 +481,8 @@@ struct drm_crtc_funcs 
         * going on, which should eventually be unified to just one set of
         * hooks.
         */
 -      void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
 -                        uint32_t start, uint32_t size);
 +      int (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
 +                       uint32_t size);
  
        /**
         * @destroy:
   * @dev: parent DRM device
   * @port: OF node used by drm_of_find_possible_crtcs()
   * @head: list management
 + * @name: human readable name, can be overwritten by the driver
   * @mutex: per-CRTC locking
   * @base: base KMS object for ID tracking etc.
   * @primary: primary plane for this CRTC
@@@ -740,13 -740,12 +742,13 @@@ struct drm_crtc 
  
        char *name;
  
 -      /*
 -       * crtc mutex
 +      /**
 +       * @mutex:
         *
         * This provides a read lock for the overall crtc state (mode, dpms
         * state, ...) and a write lock for everything which can be update
 -       * without a full modeset (fb, cursor data, ...)
 +       * without a full modeset (fb, cursor data, crtc properties ...). Full
 +       * modeset also need to grab dev->mode_config.connection_mutex.
         */
        struct drm_modeset_lock mutex;
  
        struct drm_plane *primary;
        struct drm_plane *cursor;
  
 +      /* position inside the mode_config.list, can be used as a [] idx */
 +      unsigned index;
 +
        /* position of cursor plane on crtc */
        int cursor_x;
        int cursor_y;
@@@ -1084,7 -1080,7 +1086,7 @@@ struct drm_encoder_funcs 
   * @dev: parent DRM device
   * @head: list management
   * @base: base KMS object
 - * @name: encoder name
 + * @name: human readable name, can be overwritten by the driver
   * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h
   * @possible_crtcs: bitmask of potential CRTC bindings
   * @possible_clones: bitmask of potential sibling encoders for cloning
@@@ -1103,10 -1099,6 +1105,10 @@@ struct drm_encoder 
        struct drm_mode_object base;
        char *name;
        int encoder_type;
 +
 +      /* position inside the mode_config.list, can be used as a [] idx */
 +      unsigned index;
 +
        uint32_t possible_crtcs;
        uint32_t possible_clones;
  
   * @attr: sysfs attributes
   * @head: list management
   * @base: base KMS object
 - * @name: connector name
 + * @name: human readable name, can be overwritten by the driver
 + * @connector_id: compacted connector id useful indexing arrays
   * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
   * @connector_type_id: index into connector type enum
   * @interlace_allowed: can this connector handle interlaced modes?
   * @funcs: connector control functions
   * @edid_blob_ptr: DRM property containing EDID if present
   * @properties: property tracking for this connector
 - * @path_blob_ptr: DRM blob property data for the DP MST path property
   * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling
   * @dpms: current dpms state
   * @helper_private: mid-layer private data
@@@ -1210,23 -1202,8 +1212,23 @@@ struct drm_connector 
        struct drm_property_blob *edid_blob_ptr;
        struct drm_object_properties properties;
  
 +      /**
 +       * @path_blob_ptr:
 +       *
 +       * DRM blob property data for the DP MST path property.
 +       */
        struct drm_property_blob *path_blob_ptr;
  
 +      /**
 +       * @tile_blob_ptr:
 +       *
 +       * DRM blob property data for the tile property (used mostly by DP MST).
 +       * This is meant for screens which are driven through separate display
 +       * pipelines represented by &drm_crtc, which might not be running with
 +       * genlocked clocks. For tiled panels which are genlocked, like
 +       * dual-link LVDS or dual-link DSI, the driver should try to not expose
 +       * the tiling and virtualize both &drm_crtc and &drm_plane if needed.
 +       */
        struct drm_property_blob *tile_blob_ptr;
  
        uint8_t polled; /* DRM_CONNECTOR_POLL_* */
   *    plane (in 16.16)
   * @src_w: width of visible portion of plane (in 16.16)
   * @src_h: height of visible portion of plane (in 16.16)
 + * @rotation: rotation of the plane
   * @state: backpointer to global drm_atomic_state
   */
  struct drm_plane_state {
@@@ -1529,7 -1505,6 +1531,7 @@@ enum drm_plane_type 
   * struct drm_plane - central DRM plane control structure
   * @dev: DRM device this plane belongs to
   * @head: for list management
 + * @name: human readable name, can be overwritten by the driver
   * @base: base mode object
   * @possible_crtcs: pipes this plane can be bound to
   * @format_types: array of formats supported by this plane
   * @properties: property tracking for this plane
   * @type: type of plane (overlay, primary, cursor)
   * @state: current atomic state for this plane
 + * @helper_private: mid-layer private data
   */
  struct drm_plane {
        struct drm_device *dev;
  
        char *name;
  
 +      /**
 +       * @mutex:
 +       *
 +       * Protects modeset plane state, together with the mutex of &drm_crtc
 +       * this plane is linked to (when active, getting actived or getting
 +       * disabled).
 +       */
        struct drm_modeset_lock mutex;
  
        struct drm_mode_object base;
  
        enum drm_plane_type type;
  
 +      /* position inside the mode_config.list, can be used as a [] idx */
 +      unsigned index;
 +
        const struct drm_plane_helper_funcs *helper_private;
  
        struct drm_plane_state *state;
@@@ -1731,31 -1695,19 +1733,31 @@@ struct drm_bridge 
        void *driver_private;
  };
  
 +struct __drm_planes_state {
 +      struct drm_plane *ptr;
 +      struct drm_plane_state *state;
 +};
 +
 +struct __drm_crtcs_state {
 +      struct drm_crtc *ptr;
 +      struct drm_crtc_state *state;
 +};
 +
 +struct __drm_connnectors_state {
 +      struct drm_connector *ptr;
 +      struct drm_connector_state *state;
 +};
 +
  /**
   * struct drm_atomic_state - the global state object for atomic updates
   * @dev: parent DRM device
   * @allow_modeset: allow full modeset
   * @legacy_cursor_update: hint to enforce legacy cursor IOCTL semantics
   * @legacy_set_config: Disable conflicting encoders instead of failing with -EINVAL.
 - * @planes: pointer to array of plane pointers
 - * @plane_states: pointer to array of plane states pointers
 + * @planes: pointer to array of structures with per-plane data
   * @crtcs: pointer to array of CRTC pointers
 - * @crtc_states: pointer to array of CRTC states pointers
   * @num_connector: size of the @connectors and @connector_states arrays
 - * @connectors: pointer to array of connector pointers
 - * @connector_states: pointer to array of connector states pointers
 + * @connectors: pointer to array of structures with per-connector data
   * @acquire_ctx: acquire context for this atomic modeset state update
   */
  struct drm_atomic_state {
        bool allow_modeset : 1;
        bool legacy_cursor_update : 1;
        bool legacy_set_config : 1;
 -      struct drm_plane **planes;
 -      struct drm_plane_state **plane_states;
 -      struct drm_crtc **crtcs;
 -      struct drm_crtc_state **crtc_states;
 +      struct __drm_planes_state *planes;
 +      struct __drm_crtcs_state *crtcs;
        int num_connector;
 -      struct drm_connector **connectors;
 -      struct drm_connector_state **connector_states;
 +      struct __drm_connnectors_state *connectors;
  
        struct drm_modeset_acquire_ctx *acquire_ctx;
  };
@@@ -2069,6 -2024,8 +2071,6 @@@ struct drm_mode_config_funcs 
   * @connection_mutex: ww mutex protecting connector state and routing
   * @acquire_ctx: global implicit acquire context used by atomic drivers for
   *    legacy IOCTLs
 - * @idr_mutex: mutex for KMS ID allocation and management
 - * @crtc_idr: main KMS ID tracking object
   * @fb_lock: mutex to protect fb state and lists
   * @num_fb: number of fbs available
   * @fb_list: list of framebuffers available
   * @fb_base: base address of the framebuffer
   * @poll_enabled: track polling support for this device
   * @poll_running: track polling status for this device
 + * @delayed_event: track delayed poll uevent deliver for this device
   * @output_poll_work: delayed work for polling in process context
   * @property_blob_list: list of all the blob property objects
   * @blob_lock: mutex for blob property allocation and management
@@@ -2118,30 -2074,10 +2120,30 @@@ struct drm_mode_config 
        struct mutex mutex; /* protects configuration (mode lists etc.) */
        struct drm_modeset_lock connection_mutex; /* protects connector->encoder and encoder->crtc links */
        struct drm_modeset_acquire_ctx *acquire_ctx; /* for legacy _lock_all() / _unlock_all() */
 -      struct mutex idr_mutex; /* for IDR management */
 -      struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
 -      struct idr tile_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
 -      /* this is limited to one for now */
 +
 +      /**
 +       * @idr_mutex:
 +       *
 +       * Mutex for KMS ID allocation and management. Protects both @crtc_idr
 +       * and @tile_idr.
 +       */
 +      struct mutex idr_mutex;
 +
 +      /**
 +       * @crtc_idr:
 +       *
 +       * Main KMS ID tracking object. Use this idr for all IDs, fb, crtc,
 +       * connector, modes - just makes life easier to have only one.
 +       */
 +      struct idr crtc_idr;
 +
 +      /**
 +       * @tile_idr:
 +       *
 +       * Use this idr for allocating new IDs for tiled sinks like use in some
 +       * high-res DP MST screens.
 +       */
 +      struct idr tile_idr;
  
        struct mutex fb_lock; /* proctects global and per-file fb lists */
        int num_fb;
        /* whether async page flip is supported or not */
        bool async_page_flip;
  
 -      /* whether the driver supports fb modifiers */
 +      /**
 +       * @allow_fb_modifiers:
 +       *
 +       * Whether the driver supports fb modifiers in the ADDFB2.1 ioctl call.
 +       */
        bool allow_fb_modifiers;
  
        /* cursor size */
@@@ -2300,18 -2232,7 +2302,18 @@@ int drm_crtc_init_with_planes(struct dr
                              const struct drm_crtc_funcs *funcs,
                              const char *name, ...);
  extern void drm_crtc_cleanup(struct drm_crtc *crtc);
 -extern unsigned int drm_crtc_index(struct drm_crtc *crtc);
 +
 +/**
 + * drm_crtc_index - find the index of a registered CRTC
 + * @crtc: CRTC to find index for
 + *
 + * Given a registered CRTC, return the index of that CRTC within a DRM
 + * device's list of CRTCs.
 + */
 +static inline unsigned int drm_crtc_index(struct drm_crtc *crtc)
 +{
 +      return crtc->index;
 +}
  
  /**
   * drm_crtc_mask - find the mask of a registered CRTC
@@@ -2365,18 -2286,7 +2367,18 @@@ int drm_encoder_init(struct drm_device 
                     struct drm_encoder *encoder,
                     const struct drm_encoder_funcs *funcs,
                     int encoder_type, const char *name, ...);
 -extern unsigned int drm_encoder_index(struct drm_encoder *encoder);
 +
 +/**
 + * drm_encoder_index - find the index of a registered encoder
 + * @encoder: encoder to find index for
 + *
 + * Given a registered encoder, return the index of that encoder within a DRM
 + * device's list of encoders.
 + */
 +static inline unsigned int drm_encoder_index(struct drm_encoder *encoder)
 +{
 +      return encoder->index;
 +}
  
  /**
   * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
@@@ -2407,18 -2317,7 +2409,18 @@@ extern int drm_plane_init(struct drm_de
                          const uint32_t *formats, unsigned int format_count,
                          bool is_primary);
  extern void drm_plane_cleanup(struct drm_plane *plane);
 -extern unsigned int drm_plane_index(struct drm_plane *plane);
 +
 +/**
 + * drm_plane_index - find the index of a registered plane
 + * @plane: plane to find index for
 + *
 + * Given a registered plane, return the index of that plane within a DRM
 + * device's list of planes.
 + */
 +static inline unsigned int drm_plane_index(struct drm_plane *plane)
 +{
 +      return plane->index;
 +}
  extern struct drm_plane * drm_plane_from_index(struct drm_device *dev, int idx);
  extern void drm_plane_force_disable(struct drm_plane *plane);
  extern int drm_plane_check_pixel_format(const struct drm_plane *plane,