1 /* 2 * Copyright (c) 2016 Intel Corporation 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that copyright 7 * notice and this permission notice appear in supporting documentation, and 8 * that the name of the copyright holders not be used in advertising or 9 * publicity pertaining to distribution of the software without specific, 10 * written prior permission. The copyright holders make no representations 11 * about the suitability of this software for any purpose. It is provided "as 12 * is" without express or implied warranty. 13 * 14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 * OF THIS SOFTWARE. 21 */ 22 23 #ifndef __DRM_PROPERTY_H__ 24 #define __DRM_PROPERTY_H__ 25 26 #include <linux/list.h> 27 #include <linux/ctype.h> 28 #include <drm/drm_mode_object.h> 29 30 struct drm_property_blob { 31 struct drm_mode_object base; 32 struct drm_device *dev; 33 struct list_head head_global; 34 struct list_head head_file; 35 size_t length; 36 unsigned char data[]; 37 }; 38 39 struct drm_property_enum { 40 uint64_t value; 41 struct list_head head; 42 char name[DRM_PROP_NAME_LEN]; 43 }; 44 45 struct drm_property { 46 struct list_head head; 47 struct drm_mode_object base; 48 uint32_t flags; 49 char name[DRM_PROP_NAME_LEN]; 50 uint32_t num_values; 51 uint64_t *values; 52 struct drm_device *dev; 53 54 struct list_head enum_list; 55 }; 56 57 struct drm_prop_enum_list { 58 int type; 59 char *name; 60 }; 61 62 #define obj_to_property(x) container_of(x, struct drm_property, base) 63 64 static inline bool drm_property_type_is(struct drm_property *property, 65 uint32_t type) 66 { 67 /* instanceof for props.. handles extended type vs original types: */ 68 if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) 69 return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type; 70 return property->flags & type; 71 } 72 73 struct drm_property *drm_property_create(struct drm_device *dev, int flags, 74 const char *name, int num_values); 75 struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags, 76 const char *name, 77 const struct drm_prop_enum_list *props, 78 int num_values); 79 struct drm_property *drm_property_create_bitmask(struct drm_device *dev, 80 int flags, const char *name, 81 const struct drm_prop_enum_list *props, 82 int num_props, 83 uint64_t supported_bits); 84 struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, 85 const char *name, 86 uint64_t min, uint64_t max); 87 struct drm_property *drm_property_create_signed_range(struct drm_device *dev, 88 int flags, const char *name, 89 int64_t min, int64_t max); 90 struct drm_property *drm_property_create_object(struct drm_device *dev, 91 int flags, const char *name, uint32_t type); 92 struct drm_property *drm_property_create_bool(struct drm_device *dev, int flags, 93 const char *name); 94 int drm_property_add_enum(struct drm_property *property, int index, 95 uint64_t value, const char *name); 96 void drm_property_destroy(struct drm_device *dev, struct drm_property *property); 97 98 struct drm_property_blob *drm_property_create_blob(struct drm_device *dev, 99 size_t length, 100 const void *data); 101 struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev, 102 uint32_t id); 103 int drm_property_replace_global_blob(struct drm_device *dev, 104 struct drm_property_blob **replace, 105 size_t length, 106 const void *data, 107 struct drm_mode_object *obj_holds_id, 108 struct drm_property *prop_holds_id); 109 struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob); 110 void drm_property_unreference_blob(struct drm_property_blob *blob); 111 112 static inline struct drm_property *drm_property_find(struct drm_device *dev, 113 uint32_t id) 114 { 115 struct drm_mode_object *mo; 116 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY); 117 return mo ? obj_to_property(mo) : NULL; 118 } 119 120 #endif 121