summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/drm_property.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-09-07 12:52:40 +0300
committerJani Nikula <jani.nikula@intel.com>2016-09-07 13:24:22 +0300
commit30c06570cd6716ba392f674c49dee5a69f96e096 (patch)
treefd69af7c585f170cbf1db82c25a72f681938cbca /drivers/gpu/drm/drm_property.c
parent737ba10928061c899b7da45e8580ac5c20ff3593 (diff)
downloadlinux-30c06570cd6716ba392f674c49dee5a69f96e096.tar.xz
Revert "drm: Unify handling of blob and object properties"
This reverts commit 77953bd136d2a70bca2dc93b3ccda07a2b37076f. This causes a kernel panic when trying to assign a blob to a property, and has obviously never been tested. Fixes: 77953bd136d2 ("drm: Unify handling of blob and object properties") Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Tested-by: Liu Ying <gnuiyl@gmail.com> Acked-by: Daniel Stone <daniels@collabora.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/8c0d3482-1bb5-6a15-b105-6bda2b31b5dc@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm/drm_property.c')
-rw-r--r--drivers/gpu/drm/drm_property.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
index 4139afbcc267..a4d81cf4ffa0 100644
--- a/drivers/gpu/drm/drm_property.c
+++ b/drivers/gpu/drm/drm_property.c
@@ -870,8 +870,20 @@ bool drm_property_change_valid_get(struct drm_property *property,
for (i = 0; i < property->num_values; i++)
valid_mask |= (1ULL << property->values[i]);
return !(value & ~valid_mask);
- } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB) ||
- drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
+ } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB)) {
+ struct drm_property_blob *blob;
+
+ if (value == 0)
+ return true;
+
+ blob = drm_property_lookup_blob(property->dev, value);
+ if (blob) {
+ *ref = &blob->base;
+ return true;
+ } else {
+ return false;
+ }
+ } else if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
/* a zero value for an object property translates to null: */
if (value == 0)
return true;
@@ -888,12 +900,13 @@ bool drm_property_change_valid_get(struct drm_property *property,
}
void drm_property_change_valid_put(struct drm_property *property,
- struct drm_mode_object *ref)
+ struct drm_mode_object *ref)
{
if (!ref)
return;
- if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT) ||
- drm_property_type_is(property, DRM_MODE_PROP_BLOB))
+ if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
drm_mode_object_unreference(ref);
+ } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
+ drm_property_unreference_blob(obj_to_blob(ref));
}