143 lines · c
1/*2 * Copyright (c) 2016 Intel Corporation3 *4 * Permission to use, copy, modify, distribute, and sell this software and its5 * documentation for any purpose is hereby granted without fee, provided that6 * the above copyright notice appear in all copies and that both that copyright7 * notice and this permission notice appear in supporting documentation, and8 * that the name of the copyright holders not be used in advertising or9 * publicity pertaining to distribution of the software without specific,10 * written prior permission. The copyright holders make no representations11 * about the suitability of this software for any purpose. It is provided "as12 * 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 NO16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE20 * OF THIS SOFTWARE.21 */22 23#ifndef __DRM_MODESET_H__24#define __DRM_MODESET_H__25 26#include <linux/kref.h>27#include <drm/drm_lease.h>28struct drm_object_properties;29struct drm_property;30struct drm_device;31struct drm_file;32 33/**34 * struct drm_mode_object - base structure for modeset objects35 * @id: userspace visible identifier36 * @type: type of the object, one of DRM_MODE_OBJECT\_\*37 * @properties: properties attached to this object, including values38 * @refcount: reference count for objects which with dynamic lifetime39 * @free_cb: free function callback, only set for objects with dynamic lifetime40 *41 * Base structure for modeset objects visible to userspace. Objects can be42 * looked up using drm_mode_object_find(). Besides basic uapi interface43 * properties like @id and @type it provides two services:44 *45 * - It tracks attached properties and their values. This is used by &drm_crtc,46 * &drm_plane and &drm_connector. Properties are attached by calling47 * drm_object_attach_property() before the object is visible to userspace.48 *49 * - For objects with dynamic lifetimes (as indicated by a non-NULL @free_cb) it50 * provides reference counting through drm_mode_object_get() and51 * drm_mode_object_put(). This is used by &drm_framebuffer, &drm_connector52 * and &drm_property_blob. These objects provide specialized reference53 * counting wrappers.54 */55struct drm_mode_object {56 uint32_t id;57 uint32_t type;58 struct drm_object_properties *properties;59 struct kref refcount;60 void (*free_cb)(struct kref *kref);61};62 63#define DRM_OBJECT_MAX_PROPERTY 6464/**65 * struct drm_object_properties - property tracking for &drm_mode_object66 */67struct drm_object_properties {68 /**69 * @count: number of valid properties, must be less than or equal to70 * DRM_OBJECT_MAX_PROPERTY.71 */72 73 int count;74 /**75 * @properties: Array of pointers to &drm_property.76 *77 * NOTE: if we ever start dynamically destroying properties (ie.78 * not at drm_mode_config_cleanup() time), then we'd have to do79 * a better job of detaching property from mode objects to avoid80 * dangling property pointers:81 */82 struct drm_property *properties[DRM_OBJECT_MAX_PROPERTY];83 84 /**85 * @values: Array to store the property values, matching @properties. Do86 * not read/write values directly, but use87 * drm_object_property_get_value() and drm_object_property_set_value().88 *89 * Note that atomic drivers do not store mutable properties in this90 * array, but only the decoded values in the corresponding state91 * structure. The decoding is done using the &drm_crtc.atomic_get_property and92 * &drm_crtc.atomic_set_property hooks for &struct drm_crtc. For93 * &struct drm_plane the hooks are &drm_plane_funcs.atomic_get_property and94 * &drm_plane_funcs.atomic_set_property. And for &struct drm_connector95 * the hooks are &drm_connector_funcs.atomic_get_property and96 * &drm_connector_funcs.atomic_set_property .97 *98 * Hence atomic drivers should not use drm_object_property_set_value()99 * and drm_object_property_get_value() on mutable objects, i.e. those100 * without the DRM_MODE_PROP_IMMUTABLE flag set.101 *102 * For atomic drivers the default value of properties is stored in this103 * array, so drm_object_property_get_default_value can be used to104 * retrieve it.105 */106 uint64_t values[DRM_OBJECT_MAX_PROPERTY];107};108 109/* Avoid boilerplate. I'm tired of typing. */110#define DRM_ENUM_NAME_FN(fnname, list) \111 const char *fnname(int val) \112 { \113 int i; \114 for (i = 0; i < ARRAY_SIZE(list); i++) { \115 if (list[i].type == val) \116 return list[i].name; \117 } \118 return "(unknown)"; \119 }120 121struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,122 struct drm_file *file_priv,123 uint32_t id, uint32_t type);124void drm_mode_object_get(struct drm_mode_object *obj);125void drm_mode_object_put(struct drm_mode_object *obj);126 127int drm_object_property_set_value(struct drm_mode_object *obj,128 struct drm_property *property,129 uint64_t val);130int drm_object_property_get_value(struct drm_mode_object *obj,131 struct drm_property *property,132 uint64_t *value);133int drm_object_property_get_default_value(struct drm_mode_object *obj,134 struct drm_property *property,135 uint64_t *val);136 137void drm_object_attach_property(struct drm_mode_object *obj,138 struct drm_property *property,139 uint64_t init_val);140 141bool drm_mode_object_lease_required(uint32_t type);142#endif143