2016-08-15 17:07:02 +03:00
/*
* Copyright ( c ) 2016 Intel Corporation
*
* Permission to use , copy , modify , distribute , and sell this software and its
* documentation for any purpose is hereby granted without fee , provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation , and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific ,
* written prior permission . The copyright holders make no representations
* about the suitability of this software for any purpose . It is provided " as
* is " without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE ,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS , IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL , INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE ,
* DATA OR PROFITS , WHETHER IN AN ACTION OF CONTRACT , NEGLIGENCE OR OTHER
* TORTIOUS ACTION , ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE .
*/
# ifndef __DRM_MODESET_H__
# define __DRM_MODESET_H__
# include <linux/kref.h>
struct drm_object_properties ;
2016-08-12 23:48:50 +03:00
struct drm_property ;
2016-08-31 19:09:05 +03:00
struct drm_device ;
2016-08-15 17:07:02 +03:00
2016-08-29 11:27:53 +03:00
/**
* struct drm_mode_object - base structure for modeset objects
* @ id : userspace visible identifier
* @ type : type of the object , one of DRM_MODE_OBJECT \ _ \ *
* @ properties : properties attached to this object , including values
* @ refcount : reference count for objects which with dynamic lifetime
* @ free_cb : free function callback , only set for objects with dynamic lifetime
*
* Base structure for modeset objects visible to userspace . Objects can be
* looked up using drm_mode_object_find ( ) . Besides basic uapi interface
* properties like @ id and @ type it provides two services :
*
* - It tracks attached properties and their values . This is used by & drm_crtc ,
* & drm_plane and & drm_connector . Properties are attached by calling
* drm_object_attach_property ( ) before the object is visible to userspace .
*
* - For objects with dynamic lifetimes ( as indicated by a non - NULL @ free_cb ) it
* provides reference counting through drm_mode_object_reference ( ) and
* drm_mode_object_unreference ( ) . This is used by & drm_framebuffer ,
* & drm_connector and & drm_property_blob . These objects provide specialized
* reference counting wrappers .
*/
2016-08-15 17:07:02 +03:00
struct drm_mode_object {
uint32_t id ;
uint32_t type ;
struct drm_object_properties * properties ;
struct kref refcount ;
void ( * free_cb ) ( struct kref * kref ) ;
} ;
2016-08-12 23:48:50 +03:00
# define DRM_OBJECT_MAX_PROPERTY 24
2016-08-29 11:27:53 +03:00
/**
* struct drm_object_properties - property tracking for & drm_mode_object
*/
2016-08-12 23:48:50 +03:00
struct drm_object_properties {
2016-08-29 11:27:53 +03:00
/**
* @ count : number of valid properties , must be less than or equal to
* DRM_OBJECT_MAX_PROPERTY .
*/
2016-08-29 11:27:52 +03:00
int count ;
2016-08-29 11:27:53 +03:00
/**
* @ properties : Array of pointers to & drm_property .
*
* NOTE : if we ever start dynamically destroying properties ( ie .
2016-08-12 23:48:50 +03:00
* not at drm_mode_config_cleanup ( ) time ) , then we ' d have to do
* a better job of detaching property from mode objects to avoid
* dangling property pointers :
*/
struct drm_property * properties [ DRM_OBJECT_MAX_PROPERTY ] ;
2016-08-29 11:27:53 +03:00
/**
* @ values : Array to store the property values , matching @ properties . Do
* not read / write values directly , but use
* drm_object_property_get_value ( ) and drm_object_property_set_value ( ) .
*
* Note that atomic drivers do not store mutable properties in this
* array , but only the decoded values in the corresponding state
* structure . The decoding is done using the - > atomic_get_property and
* - > atomic_set_property hooks of the corresponding object . Hence atomic
* drivers should not use drm_object_property_set_value ( ) and
* drm_object_property_get_value ( ) on mutable objects , i . e . those
* without the DRM_MODE_PROP_IMMUTABLE flag set .
2016-08-12 23:48:50 +03:00
*/
uint64_t values [ DRM_OBJECT_MAX_PROPERTY ] ;
} ;
/* Avoid boilerplate. I'm tired of typing. */
# define DRM_ENUM_NAME_FN(fnname, list) \
const char * fnname ( int val ) \
{ \
int i ; \
for ( i = 0 ; i < ARRAY_SIZE ( list ) ; i + + ) { \
if ( list [ i ] . type = = val ) \
return list [ i ] . name ; \
} \
return " (unknown) " ; \
}
2016-08-15 17:07:02 +03:00
struct drm_mode_object * drm_mode_object_find ( struct drm_device * dev ,
uint32_t id , uint32_t type ) ;
void drm_mode_object_reference ( struct drm_mode_object * obj ) ;
void drm_mode_object_unreference ( struct drm_mode_object * obj ) ;
2016-08-29 11:27:51 +03:00
int drm_object_property_set_value ( struct drm_mode_object * obj ,
struct drm_property * property ,
uint64_t val ) ;
int drm_object_property_get_value ( struct drm_mode_object * obj ,
struct drm_property * property ,
uint64_t * value ) ;
void drm_object_attach_property ( struct drm_mode_object * obj ,
struct drm_property * property ,
uint64_t init_val ) ;
2016-08-15 17:07:02 +03:00
# endif