brintos

brintos / linux-shallow public Read only

0
0
Text · 5.5 KiB · 08d7a7f Raw
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