|
@@ -3457,7 +3457,7 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags,
|
|
|
|
|
|
property->flags = flags;
|
|
|
property->num_values = num_values;
|
|
|
- INIT_LIST_HEAD(&property->enum_blob_list);
|
|
|
+ INIT_LIST_HEAD(&property->enum_list);
|
|
|
|
|
|
if (name) {
|
|
|
strncpy(property->name, name, DRM_PROP_NAME_LEN);
|
|
@@ -3679,8 +3679,8 @@ int drm_property_add_enum(struct drm_property *property, int index,
|
|
|
(value > 63))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!list_empty(&property->enum_blob_list)) {
|
|
|
- list_for_each_entry(prop_enum, &property->enum_blob_list, head) {
|
|
|
+ if (!list_empty(&property->enum_list)) {
|
|
|
+ list_for_each_entry(prop_enum, &property->enum_list, head) {
|
|
|
if (prop_enum->value == value) {
|
|
|
strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN);
|
|
|
prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0';
|
|
@@ -3698,7 +3698,7 @@ int drm_property_add_enum(struct drm_property *property, int index,
|
|
|
prop_enum->value = value;
|
|
|
|
|
|
property->values[index] = value;
|
|
|
- list_add_tail(&prop_enum->head, &property->enum_blob_list);
|
|
|
+ list_add_tail(&prop_enum->head, &property->enum_list);
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_property_add_enum);
|
|
@@ -3715,7 +3715,7 @@ void drm_property_destroy(struct drm_device *dev, struct drm_property *property)
|
|
|
{
|
|
|
struct drm_property_enum *prop_enum, *pt;
|
|
|
|
|
|
- list_for_each_entry_safe(prop_enum, pt, &property->enum_blob_list, head) {
|
|
|
+ list_for_each_entry_safe(prop_enum, pt, &property->enum_list, head) {
|
|
|
list_del(&prop_enum->head);
|
|
|
kfree(prop_enum);
|
|
|
}
|
|
@@ -3839,16 +3839,12 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
|
|
|
struct drm_mode_get_property *out_resp = data;
|
|
|
struct drm_property *property;
|
|
|
int enum_count = 0;
|
|
|
- int blob_count = 0;
|
|
|
int value_count = 0;
|
|
|
int ret = 0, i;
|
|
|
int copied;
|
|
|
struct drm_property_enum *prop_enum;
|
|
|
struct drm_mode_property_enum __user *enum_ptr;
|
|
|
- struct drm_property_blob *prop_blob;
|
|
|
- uint32_t __user *blob_id_ptr;
|
|
|
uint64_t __user *values_ptr;
|
|
|
- uint32_t __user *blob_length_ptr;
|
|
|
|
|
|
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
|
|
return -EINVAL;
|
|
@@ -3862,11 +3858,8 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
|
|
|
|
|
|
if (drm_property_type_is(property, DRM_MODE_PROP_ENUM) ||
|
|
|
drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
|
|
|
- list_for_each_entry(prop_enum, &property->enum_blob_list, head)
|
|
|
+ list_for_each_entry(prop_enum, &property->enum_list, head)
|
|
|
enum_count++;
|
|
|
- } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB)) {
|
|
|
- list_for_each_entry(prop_blob, &property->enum_blob_list, head)
|
|
|
- blob_count++;
|
|
|
}
|
|
|
|
|
|
value_count = property->num_values;
|
|
@@ -3891,7 +3884,7 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
|
|
|
if ((out_resp->count_enum_blobs >= enum_count) && enum_count) {
|
|
|
copied = 0;
|
|
|
enum_ptr = (struct drm_mode_property_enum __user *)(unsigned long)out_resp->enum_blob_ptr;
|
|
|
- list_for_each_entry(prop_enum, &property->enum_blob_list, head) {
|
|
|
+ list_for_each_entry(prop_enum, &property->enum_list, head) {
|
|
|
|
|
|
if (copy_to_user(&enum_ptr[copied].value, &prop_enum->value, sizeof(uint64_t))) {
|
|
|
ret = -EFAULT;
|
|
@@ -3909,28 +3902,16 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
|
|
|
out_resp->count_enum_blobs = enum_count;
|
|
|
}
|
|
|
|
|
|
- if (drm_property_type_is(property, DRM_MODE_PROP_BLOB)) {
|
|
|
- if ((out_resp->count_enum_blobs >= blob_count) && blob_count) {
|
|
|
- copied = 0;
|
|
|
- blob_id_ptr = (uint32_t __user *)(unsigned long)out_resp->enum_blob_ptr;
|
|
|
- blob_length_ptr = (uint32_t __user *)(unsigned long)out_resp->values_ptr;
|
|
|
-
|
|
|
- list_for_each_entry(prop_blob, &property->enum_blob_list, head) {
|
|
|
- if (put_user(prop_blob->base.id, blob_id_ptr + copied)) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
- if (put_user(prop_blob->length, blob_length_ptr + copied)) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
- copied++;
|
|
|
- }
|
|
|
- }
|
|
|
- out_resp->count_enum_blobs = blob_count;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * NOTE: The idea seems to have been to use this to read all the blob
|
|
|
+ * property values. But nothing ever added them to the corresponding
|
|
|
+ * list, userspace always used the special-purpose get_blob ioctl to
|
|
|
+ * read the value for a blob property. It also doesn't make a lot of
|
|
|
+ * sense to return values here when everything else is just metadata for
|
|
|
+ * the property itself.
|
|
|
+ */
|
|
|
+ if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
|
|
|
+ out_resp->count_enum_blobs = 0;
|
|
|
done:
|
|
|
drm_modeset_unlock_all(dev);
|
|
|
return ret;
|