Merge branch 'topic/core-stuff' into topic/atomic-core
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 17 Dec 2014 19:24:02 +0000 (20:24 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 17 Dec 2014 19:24:02 +0000 (20:24 +0100)
Backmerge my drm-misc branch because of conflicts. Just simple stuff
but better to clear this out before I merge the other atomic patches.

Conflicts:
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_edid.c

Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
1  2 
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_plane_helper.c
drivers/gpu/drm/sti/sti_drm_crtc.c
drivers/gpu/drm/tegra/dc.c

@@@ -4197,17 -4132,11 +4192,19 @@@ int drm_mode_connector_update_edid_prop
  }
  EXPORT_SYMBOL(drm_mode_connector_update_edid_property);
  
 -static bool drm_property_change_is_valid(struct drm_property *property,
 -                                       uint64_t value)
 +/* Some properties could refer to dynamic refcnt'd objects, or things that
 + * need special locking to handle lifetime issues (ie. to ensure the prop
 + * value doesn't become invalid part way through the property update due to
 + * race).  The value returned by reference via 'obj' should be passed back
 + * to drm_property_change_valid_put() after the property is set (and the
 + * object to which the property is attached has a chance to take it's own
 + * reference).
 + */
 +static bool drm_property_change_valid_get(struct drm_property *property,
 +                                       uint64_t value, struct drm_mode_object **ref)
  {
+       int i;
        if (property->flags & DRM_MODE_PROP_IMMUTABLE)
                return false;
  
                /* a zero value for an object property translates to null: */
                if (value == 0)
                        return true;
 -              /*
 -               * NOTE: use _object_find() directly to bypass restriction on
 -               * looking up refcnt'd objects (ie. fb's).  For a refcnt'd
 -               * object this could race against object finalization, so it
 -               * simply tells us that the object *was* valid.  Which is good
 -               * enough.
 -               */
 -              obj = _object_find(property->dev, value, property->values[0]);
 -              return obj != NULL;
 +
 +              /* handle refcnt'd objects specially: */
 +              if (property->values[0] == DRM_MODE_OBJECT_FB) {
 +                      struct drm_framebuffer *fb;
 +                      fb = drm_framebuffer_lookup(property->dev, value);
 +                      if (fb) {
 +                              *ref = &fb->base;
 +                              return true;
 +                      } else {
 +                              return false;
 +                      }
 +              } else {
 +                      return _object_find(property->dev, value, property->values[0]) != NULL;
 +              }
 +      } else {
 +              int i;
 +              for (i = 0; i < property->num_values; i++)
 +                      if (property->values[i] == value)
 +                              return true;
 +              return false;
        }
+       for (i = 0; i < property->num_values; i++)
+               if (property->values[i] == value)
+                       return true;
+       return false;
  }
  
 +static void drm_property_change_valid_put(struct drm_property *property,
 +              struct drm_mode_object *ref)
 +{
 +      if (!ref)
 +              return;
 +
 +      if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
 +              if (property->values[0] == DRM_MODE_OBJECT_FB)
 +                      drm_framebuffer_unreference(obj_to_fb(ref));
 +      }
 +}
 +
  /**
   * drm_mode_connector_property_set_ioctl - set the current value of a connector property
   * @dev: DRM device
Simple merge
Simple merge
Simple merge