2016-09-21 11:59:24 +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_PLANE_H__
# define __DRM_PLANE_H__
# include <linux/list.h>
# include <linux/ctype.h>
# include <drm/drm_mode_object.h>
2018-02-19 23:28:23 +03:00
# include <drm/drm_color_mgmt.h>
2016-09-21 11:59:24 +03:00
struct drm_crtc ;
2016-11-05 18:08:09 +03:00
struct drm_printer ;
2017-03-23 00:50:41 +03:00
struct drm_modeset_acquire_ctx ;
2016-09-21 11:59:24 +03:00
/**
* struct drm_plane_state - mutable plane state
* @ plane : backpointer to the plane
* @ crtc_w : width of visible portion of plane on crtc
* @ crtc_h : height of visible portion of plane on crtc
* @ src_x : left position of visible portion of plane within
* plane ( in 16.16 )
* @ src_y : upper position of visible portion of plane within
* plane ( in 16.16 )
* @ src_w : width of visible portion of plane ( in 16.16 )
* @ src_h : height of visible portion of plane ( in 16.16 )
2018-04-11 10:39:25 +03:00
* @ alpha : opacity of the plane
2016-09-21 11:59:24 +03:00
* @ rotation : rotation of the plane
* @ zpos : priority of the given plane on crtc ( optional )
2016-10-10 17:50:56 +03:00
* Note that multiple active planes on the same crtc can have an identical
* zpos value . The rule to solving the conflict is to compare the plane
* object IDs ; the plane with a higher ID must be stacked on top of a
* plane with a lower ID .
2016-09-21 11:59:24 +03:00
* @ normalized_zpos : normalized value of zpos : unique , range from 0 to N - 1
2016-10-10 17:50:56 +03:00
* where N is the number of active planes for given crtc . Note that
2018-03-21 13:20:24 +03:00
* the driver must set drm_mode_config . normalize_zpos or call
* drm_atomic_normalize_zpos ( ) to update this before it can be trusted .
2016-09-21 11:59:24 +03:00
* @ src : clipped source coordinates of the plane ( in 16.16 )
* @ dst : clipped destination coordinates of the plane
* @ state : backpointer to global drm_atomic_state
*/
struct drm_plane_state {
struct drm_plane * plane ;
2016-11-07 13:03:33 +03:00
/**
* @ crtc :
*
* Currently bound CRTC , NULL if disabled . Do not this write directly ,
* use drm_atomic_set_crtc_for_plane ( )
*/
struct drm_crtc * crtc ;
/**
* @ fb :
*
* Currently bound framebuffer . Do not write this directly , use
* drm_atomic_set_fb_for_plane ( )
*/
struct drm_framebuffer * fb ;
/**
* @ fence :
*
2018-04-05 18:44:46 +03:00
* Optional fence to wait for before scanning out @ fb . The core atomic
* code will set this when userspace is using explicit fencing . Do not
* write this directly for a driver ' s implicit fence , use
* drm_atomic_set_fence_for_plane ( ) to ensure that an explicit fence is
* preserved .
*
* Drivers should store any implicit fence in this from their
* & drm_plane_helper . prepare_fb callback . See drm_gem_fb_prepare_fb ( )
* and drm_gem_fb_simple_display_pipe_prepare_fb ( ) for suitable helpers .
2016-11-07 13:03:33 +03:00
*/
2016-10-25 15:00:45 +03:00
struct dma_fence * fence ;
2016-09-21 11:59:24 +03:00
2016-11-07 13:03:33 +03:00
/**
* @ crtc_x :
*
* Left position of visible portion of plane on crtc , signed dest
* location allows it to be partially off screen .
*/
int32_t crtc_x ;
/**
* @ crtc_y :
*
* Upper position of visible portion of plane on crtc , signed dest
* location allows it to be partially off screen .
*/
int32_t crtc_y ;
2016-09-21 11:59:24 +03:00
uint32_t crtc_w , crtc_h ;
/* Source values are 16.16 fixed point */
uint32_t src_x , src_y ;
uint32_t src_h , src_w ;
2018-04-11 10:39:25 +03:00
/* Plane opacity */
u16 alpha ;
2016-09-21 11:59:24 +03:00
/* Plane rotation */
unsigned int rotation ;
/* Plane zpos */
unsigned int zpos ;
unsigned int normalized_zpos ;
2018-02-19 23:28:23 +03:00
/**
* @ color_encoding :
*
* Color encoding for non RGB formats
*/
enum drm_color_encoding color_encoding ;
/**
* @ color_range :
*
* Color range for non RGB formats
*/
enum drm_color_range color_range ;
2016-09-21 11:59:24 +03:00
/* Clipped coordinates */
struct drm_rect src , dst ;
2016-11-07 13:03:33 +03:00
/**
* @ visible :
*
* Visibility of the plane . This can be false even if fb ! = NULL and
* crtc ! = NULL , due to clipping .
2016-09-21 11:59:24 +03:00
*/
bool visible ;
2017-09-04 13:48:37 +03:00
/**
2017-09-04 13:48:38 +03:00
* @ commit : Tracks the pending commit to prevent use - after - free conditions ,
* and for async plane updates .
2017-09-04 13:48:37 +03:00
*
2017-09-04 13:48:38 +03:00
* May be NULL .
2017-09-04 13:48:37 +03:00
*/
struct drm_crtc_commit * commit ;
2016-09-21 11:59:24 +03:00
struct drm_atomic_state * state ;
} ;
2016-11-05 18:08:08 +03:00
static inline struct drm_rect
drm_plane_state_src ( const struct drm_plane_state * state )
{
struct drm_rect src = {
. x1 = state - > src_x ,
. y1 = state - > src_y ,
. x2 = state - > src_x + state - > src_w ,
. y2 = state - > src_y + state - > src_h ,
} ;
return src ;
}
static inline struct drm_rect
drm_plane_state_dest ( const struct drm_plane_state * state )
{
struct drm_rect dest = {
. x1 = state - > crtc_x ,
. y1 = state - > crtc_y ,
. x2 = state - > crtc_x + state - > crtc_w ,
. y2 = state - > crtc_y + state - > crtc_h ,
} ;
return dest ;
}
2016-09-21 11:59:24 +03:00
/**
* struct drm_plane_funcs - driver plane control functions
*/
struct drm_plane_funcs {
/**
* @ update_plane :
*
* This is the legacy entry point to enable and configure the plane for
* the given CRTC and framebuffer . It is never called to disable the
* plane , i . e . the passed - in crtc and fb paramters are never NULL .
*
* The source rectangle in frame buffer memory coordinates is given by
* the src_x , src_y , src_w and src_h parameters ( as 16.16 fixed point
* values ) . Devices that don ' t support subpixel plane coordinates can
* ignore the fractional part .
*
* The destination rectangle in CRTC coordinates is given by the
* crtc_x , crtc_y , crtc_w and crtc_h parameters ( as integer values ) .
* Devices scale the source rectangle to the destination rectangle . If
* scaling is not supported , and the source rectangle size doesn ' t match
* the destination rectangle size , the driver must return a
* - < errorname > EINVAL < / errorname > error .
*
* Drivers implementing atomic modeset should use
* drm_atomic_helper_update_plane ( ) to implement this hook .
*
* RETURNS :
*
* 0 on success or a negative error code on failure .
*/
int ( * update_plane ) ( struct drm_plane * plane ,
struct drm_crtc * crtc , struct drm_framebuffer * fb ,
int crtc_x , int crtc_y ,
unsigned int crtc_w , unsigned int crtc_h ,
uint32_t src_x , uint32_t src_y ,
2017-03-23 00:50:41 +03:00
uint32_t src_w , uint32_t src_h ,
struct drm_modeset_acquire_ctx * ctx ) ;
2016-09-21 11:59:24 +03:00
/**
* @ disable_plane :
*
* This is the legacy entry point to disable the plane . The DRM core
* calls this method in response to a DRM_IOCTL_MODE_SETPLANE IOCTL call
* with the frame buffer ID set to 0. Disabled planes must not be
* processed by the CRTC .
*
* Drivers implementing atomic modeset should use
* drm_atomic_helper_disable_plane ( ) to implement this hook .
*
* RETURNS :
*
* 0 on success or a negative error code on failure .
*/
2017-03-23 00:50:43 +03:00
int ( * disable_plane ) ( struct drm_plane * plane ,
struct drm_modeset_acquire_ctx * ctx ) ;
2016-09-21 11:59:24 +03:00
/**
* @ destroy :
*
* Clean up plane resources . This is only called at driver unload time
* through drm_mode_config_cleanup ( ) since a plane cannot be hotplugged
* in DRM .
*/
void ( * destroy ) ( struct drm_plane * plane ) ;
/**
* @ reset :
*
* Reset plane hardware and software state to off . This function isn ' t
* called by the core directly , only through drm_mode_config_reset ( ) .
* It ' s not a helper hook only for historical reasons .
*
* Atomic drivers can use drm_atomic_helper_plane_reset ( ) to reset
* atomic state using this hook .
*/
void ( * reset ) ( struct drm_plane * plane ) ;
/**
* @ set_property :
*
* This is the legacy entry point to update a property attached to the
* plane .
*
* This callback is optional if the driver does not support any legacy
2017-07-25 15:02:04 +03:00
* driver - private properties . For atomic drivers it is not used because
* property handling is done entirely in the DRM core .
2016-09-21 11:59:24 +03:00
*
* RETURNS :
*
* 0 on success or a negative error code on failure .
*/
int ( * set_property ) ( struct drm_plane * plane ,
struct drm_property * property , uint64_t val ) ;
/**
* @ atomic_duplicate_state :
*
* Duplicate the current atomic state for this plane and return it .
2017-01-25 09:26:45 +03:00
* The core and helpers guarantee that any atomic state duplicated with
2016-09-21 11:59:24 +03:00
* this hook and still owned by the caller ( i . e . not transferred to the
2017-01-25 09:26:45 +03:00
* driver by calling & drm_mode_config_funcs . atomic_commit ) will be
* cleaned up by calling the @ atomic_destroy_state hook in this
* structure .
2016-09-21 11:59:24 +03:00
*
2016-12-29 23:48:26 +03:00
* Atomic drivers which don ' t subclass & struct drm_plane_state should use
2016-09-21 11:59:24 +03:00
* drm_atomic_helper_plane_duplicate_state ( ) . Drivers that subclass the
* state structure to extend it with driver - private state should use
* __drm_atomic_helper_plane_duplicate_state ( ) to make sure shared state is
* duplicated in a consistent fashion across drivers .
*
2017-01-25 09:26:45 +03:00
* It is an error to call this hook before & drm_plane . state has been
2016-09-21 11:59:24 +03:00
* initialized correctly .
*
* NOTE :
*
* If the duplicate state references refcounted resources this hook must
* acquire a reference for each of them . The driver must release these
* references again in @ atomic_destroy_state .
*
* RETURNS :
*
* Duplicated atomic state or NULL when the allocation failed .
*/
struct drm_plane_state * ( * atomic_duplicate_state ) ( struct drm_plane * plane ) ;
/**
* @ atomic_destroy_state :
*
* Destroy a state duplicated with @ atomic_duplicate_state and release
* or unreference all resources it references
*/
void ( * atomic_destroy_state ) ( struct drm_plane * plane ,
struct drm_plane_state * state ) ;
/**
* @ atomic_set_property :
*
* Decode a driver - private property value and store the decoded value
* into the passed - in state structure . Since the atomic core decodes all
* standardized properties ( even for extensions beyond the core set of
* properties which might not be implemented by all drivers ) this
* requires drivers to subclass the state structure .
*
* Such driver - private properties should really only be implemented for
* truly hardware / vendor specific state . Instead it is preferred to
* standardize atomic extension and decode the properties used to expose
* such an extension in the core .
*
* Do not call this function directly , use
* drm_atomic_plane_set_property ( ) instead .
*
* This callback is optional if the driver does not support any
* driver - private atomic properties .
*
* NOTE :
*
* This function is called in the state assembly phase of atomic
* modesets , which can be aborted for any reason ( including on
* userspace ' s request to just check whether a configuration would be
* possible ) . Drivers MUST NOT touch any persistent state ( hardware or
* software ) or data structures except the passed in @ state parameter .
*
* Also since userspace controls in which order properties are set this
* function must not do any input validation ( since the state update is
* incomplete and hence likely inconsistent ) . Instead any such input
* validation must be done in the various atomic_check callbacks .
*
* RETURNS :
*
* 0 if the property has been found , - EINVAL if the property isn ' t
* implemented by the driver ( which shouldn ' t ever happen , the core only
* asks for properties attached to this plane ) . No other validation is
* allowed by the driver . The core already checks that the property
* value is within the range ( integer , valid enum value , . . . ) the driver
* set when registering the property .
*/
int ( * atomic_set_property ) ( struct drm_plane * plane ,
struct drm_plane_state * state ,
struct drm_property * property ,
uint64_t val ) ;
/**
* @ atomic_get_property :
*
* Reads out the decoded driver - private property . This is used to
* implement the GETPLANE IOCTL .
*
* Do not call this function directly , use
* drm_atomic_plane_get_property ( ) instead .
*
* This callback is optional if the driver does not support any
* driver - private atomic properties .
*
* RETURNS :
*
* 0 on success , - EINVAL if the property isn ' t implemented by the
* driver ( which should never happen , the core only asks for
* properties attached to this plane ) .
*/
int ( * atomic_get_property ) ( struct drm_plane * plane ,
const struct drm_plane_state * state ,
struct drm_property * property ,
uint64_t * val ) ;
/**
* @ late_register :
*
* This optional hook can be used to register additional userspace
* interfaces attached to the plane like debugfs interfaces .
* It is called late in the driver load sequence from drm_dev_register ( ) .
* Everything added from this callback should be unregistered in
* the early_unregister callback .
*
* Returns :
*
* 0 on success , or a negative error code on failure .
*/
int ( * late_register ) ( struct drm_plane * plane ) ;
/**
* @ early_unregister :
*
* This optional hook should be used to unregister the additional
* userspace interfaces attached to the plane from
2017-01-25 09:26:55 +03:00
* @ late_register . It is called from drm_dev_unregister ( ) ,
2016-09-21 11:59:24 +03:00
* early in the driver unload sequence to disable userspace access
* before data structures are torndown .
*/
void ( * early_unregister ) ( struct drm_plane * plane ) ;
2016-11-05 18:08:09 +03:00
/**
* @ atomic_print_state :
*
2016-12-29 23:48:26 +03:00
* If driver subclasses & struct drm_plane_state , it should implement
2016-11-05 18:08:09 +03:00
* this optional hook for printing additional driver specific state .
*
* Do not call this directly , use drm_atomic_plane_print_state ( )
* instead .
*/
void ( * atomic_print_state ) ( struct drm_printer * p ,
const struct drm_plane_state * state ) ;
2017-07-24 06:46:38 +03:00
/**
* @ format_mod_supported :
*
* This optional hook is used for the DRM to determine if the given
* format / modifier combination is valid for the plane . This allows the
* DRM to generate the correct format bitmask ( which formats apply to
2018-03-17 01:04:33 +03:00
* which modifier ) , and to valdiate modifiers at atomic_check time .
*
* If not present , then any modifier in the plane ' s modifier
* list is allowed with any of the plane ' s formats .
2017-07-24 06:46:38 +03:00
*
* Returns :
*
* True if the given modifier is valid for that format on the plane .
* False otherwise .
*/
bool ( * format_mod_supported ) ( struct drm_plane * plane , uint32_t format ,
uint64_t modifier ) ;
2016-09-21 11:59:24 +03:00
} ;
2016-09-21 11:59:25 +03:00
/**
* enum drm_plane_type - uapi plane type enumeration
*
* For historical reasons not all planes are made the same . This enumeration is
* used to tell the different types of planes apart to implement the different
* uapi semantics for them . For userspace which is universal plane aware and
* which is using that atomic IOCTL there ' s no difference between these planes
* ( beyong what the driver and hardware can support of course ) .
*
* For compatibility with legacy userspace , only overlay planes are made
* available to userspace by default . Userspace clients may set the
* DRM_CLIENT_CAP_UNIVERSAL_PLANES client capability bit to indicate that they
* wish to receive a universal plane list containing all plane types . See also
* drm_for_each_legacy_plane ( ) .
2016-09-23 09:35:25 +03:00
*
* WARNING : The values of this enum is UABI since they ' re exposed in the " type "
* property .
2016-09-21 11:59:25 +03:00
*/
2016-09-21 11:59:24 +03:00
enum drm_plane_type {
2016-09-23 09:35:25 +03:00
/**
* @ DRM_PLANE_TYPE_OVERLAY :
*
* Overlay planes represent all non - primary , non - cursor planes . Some
* drivers refer to these types of planes as " sprites " internally .
*/
DRM_PLANE_TYPE_OVERLAY ,
2016-09-21 11:59:25 +03:00
/**
* @ DRM_PLANE_TYPE_PRIMARY :
*
* Primary planes represent a " main " plane for a CRTC . Primary planes
* are the planes operated upon by CRTC modesetting and flipping
2017-01-25 09:26:45 +03:00
* operations described in the & drm_crtc_funcs . page_flip and
* & drm_crtc_funcs . set_config hooks .
2016-09-21 11:59:25 +03:00
*/
2016-09-21 11:59:24 +03:00
DRM_PLANE_TYPE_PRIMARY ,
2016-09-21 11:59:25 +03:00
/**
* @ DRM_PLANE_TYPE_CURSOR :
*
* Cursor planes represent a " cursor " plane for a CRTC . Cursor planes
* are the planes operated upon by the DRM_IOCTL_MODE_CURSOR and
* DRM_IOCTL_MODE_CURSOR2 IOCTLs .
*/
2016-09-21 11:59:24 +03:00
DRM_PLANE_TYPE_CURSOR ,
} ;
/**
* struct drm_plane - central DRM plane control structure
* @ dev : DRM device this plane belongs to
* @ head : for list management
* @ name : human readable name , can be overwritten by the driver
* @ base : base mode object
* @ possible_crtcs : pipes this plane can be bound to
* @ format_types : array of formats supported by this plane
* @ format_count : number of formats supported
* @ format_default : driver hasn ' t supplied supported formats for the plane
2017-11-14 22:10:21 +03:00
* @ modifiers : array of modifiers supported by this plane
* @ modifier_count : number of modifiers supported
2016-09-21 11:59:24 +03:00
* @ old_fb : Temporary tracking of the old fb while a modeset is ongoing . Used by
* drm_mode_set_config_internal ( ) to implement correct refcounting .
* @ funcs : helper functions
* @ properties : property tracking for this plane
* @ type : type of plane ( overlay , primary , cursor )
2018-04-11 10:39:25 +03:00
* @ alpha_property : alpha property for this plane
2016-09-21 11:59:24 +03:00
* @ zpos_property : zpos property for this plane
2016-09-26 19:30:48 +03:00
* @ rotation_property : rotation property for this plane
2016-09-21 11:59:24 +03:00
* @ helper_private : mid - layer private data
*/
struct drm_plane {
struct drm_device * dev ;
struct list_head head ;
char * name ;
/**
* @ mutex :
*
2017-01-25 09:26:45 +03:00
* Protects modeset plane state , together with the & drm_crtc . mutex of
* CRTC this plane is linked to ( when active , getting activated or
* getting disabled ) .
2017-03-28 18:53:48 +03:00
*
* For atomic drivers specifically this protects @ state .
2016-09-21 11:59:24 +03:00
*/
struct drm_modeset_lock mutex ;
struct drm_mode_object base ;
uint32_t possible_crtcs ;
uint32_t * format_types ;
unsigned int format_count ;
bool format_default ;
2017-07-24 06:46:38 +03:00
uint64_t * modifiers ;
unsigned int modifier_count ;
2017-11-08 23:30:07 +03:00
/**
* @ crtc : Currently bound CRTC , only really meaningful for non - atomic
* drivers . Atomic drivers should instead check & drm_plane_state . crtc .
*/
2016-09-21 11:59:24 +03:00
struct drm_crtc * crtc ;
2017-11-08 23:30:07 +03:00
/**
* @ fb : Currently bound framebuffer , only really meaningful for
* non - atomic drivers . Atomic drivers should instead check
* & drm_plane_state . fb .
*/
2016-09-21 11:59:24 +03:00
struct drm_framebuffer * fb ;
struct drm_framebuffer * old_fb ;
const struct drm_plane_funcs * funcs ;
struct drm_object_properties properties ;
enum drm_plane_type type ;
/**
* @ index : Position inside the mode_config . list , can be used as an array
* index . It is invariant over the lifetime of the plane .
*/
unsigned index ;
const struct drm_plane_helper_funcs * helper_private ;
2017-03-28 18:53:48 +03:00
/**
* @ state :
*
* Current atomic state for this plane .
*
* This is protected by @ mutex . Note that nonblocking atomic commits
* access the current plane state without taking locks . Either by going
* through the & struct drm_atomic_state pointers , see
2017-07-19 17:39:20 +03:00
* for_each_oldnew_plane_in_state ( ) , for_each_old_plane_in_state ( ) and
* for_each_new_plane_in_state ( ) . Or through careful ordering of atomic
* commit operations as implemented in the atomic helpers , see
* & struct drm_crtc_commit .
2017-03-28 18:53:48 +03:00
*/
2016-09-21 11:59:24 +03:00
struct drm_plane_state * state ;
2018-04-11 10:39:25 +03:00
struct drm_property * alpha_property ;
2016-09-21 11:59:24 +03:00
struct drm_property * zpos_property ;
2016-09-26 19:30:48 +03:00
struct drm_property * rotation_property ;
2018-02-19 23:28:23 +03:00
/**
* @ color_encoding_property :
*
* Optional " COLOR_ENCODING " enum property for specifying
* color encoding for non RGB formats .
* See drm_plane_create_color_properties ( ) .
*/
struct drm_property * color_encoding_property ;
/**
* @ color_range_property :
*
* Optional " COLOR_RANGE " enum property for specifying
* color range for non RGB formats .
* See drm_plane_create_color_properties ( ) .
*/
struct drm_property * color_range_property ;
2016-09-21 11:59:24 +03:00
} ;
# define obj_to_plane(x) container_of(x, struct drm_plane, base)
2017-07-24 06:46:38 +03:00
__printf ( 9 , 10 )
2016-09-21 11:59:24 +03:00
int drm_universal_plane_init ( struct drm_device * dev ,
struct drm_plane * plane ,
2016-12-02 16:45:35 +03:00
uint32_t possible_crtcs ,
2016-09-21 11:59:24 +03:00
const struct drm_plane_funcs * funcs ,
const uint32_t * formats ,
unsigned int format_count ,
2017-07-24 06:46:38 +03:00
const uint64_t * format_modifiers ,
2016-09-21 11:59:24 +03:00
enum drm_plane_type type ,
const char * name , . . . ) ;
2017-03-22 11:36:02 +03:00
int drm_plane_init ( struct drm_device * dev ,
struct drm_plane * plane ,
uint32_t possible_crtcs ,
const struct drm_plane_funcs * funcs ,
const uint32_t * formats , unsigned int format_count ,
bool is_primary ) ;
void drm_plane_cleanup ( struct drm_plane * plane ) ;
2016-09-21 11:59:24 +03:00
/**
* drm_plane_index - find the index of a registered plane
* @ plane : plane to find index for
*
* Given a registered plane , return the index of that plane within a DRM
* device ' s list of planes .
*/
static inline unsigned int drm_plane_index ( struct drm_plane * plane )
{
return plane - > index ;
}
2017-03-22 11:36:02 +03:00
struct drm_plane * drm_plane_from_index ( struct drm_device * dev , int idx ) ;
void drm_plane_force_disable ( struct drm_plane * plane ) ;
2016-09-21 11:59:24 +03:00
int drm_mode_plane_set_obj_prop ( struct drm_plane * plane ,
struct drm_property * property ,
uint64_t value ) ;
/**
* drm_plane_find - find a & drm_plane
* @ dev : DRM device
2017-11-09 02:35:04 +03:00
* @ file_priv : drm file to check for lease against .
2016-09-21 11:59:24 +03:00
* @ id : plane id
*
* Returns the plane with @ id , NULL if it doesn ' t exist . Simple wrapper around
* drm_mode_object_find ( ) .
*/
static inline struct drm_plane * drm_plane_find ( struct drm_device * dev ,
2017-03-15 09:25:07 +03:00
struct drm_file * file_priv ,
2016-09-21 11:59:24 +03:00
uint32_t id )
{
struct drm_mode_object * mo ;
2017-03-15 09:25:07 +03:00
mo = drm_mode_object_find ( dev , file_priv , id , DRM_MODE_OBJECT_PLANE ) ;
2016-09-21 11:59:24 +03:00
return mo ? obj_to_plane ( mo ) : NULL ;
}
/**
* drm_for_each_plane_mask - iterate over planes specified by bitmask
* @ plane : the loop cursor
* @ dev : the DRM device
* @ plane_mask : bitmask of plane indices
*
* Iterate over all planes specified by bitmask .
*/
# define drm_for_each_plane_mask(plane, dev, plane_mask) \
list_for_each_entry ( ( plane ) , & ( dev ) - > mode_config . plane_list , head ) \
for_each_if ( ( plane_mask ) & ( 1 < < drm_plane_index ( plane ) ) )
2016-09-21 11:59:25 +03:00
/**
* drm_for_each_legacy_plane - iterate over all planes for legacy userspace
* @ plane : the loop cursor
* @ dev : the DRM device
*
* Iterate over all legacy planes of @ dev , excluding primary and cursor planes .
* This is useful for implementing userspace apis when userspace is not
2017-01-25 09:26:45 +03:00
* universal plane aware . See also & enum drm_plane_type .
2016-09-21 11:59:25 +03:00
*/
2016-09-21 11:59:24 +03:00
# define drm_for_each_legacy_plane(plane, dev) \
list_for_each_entry ( plane , & ( dev ) - > mode_config . plane_list , head ) \
for_each_if ( plane - > type = = DRM_PLANE_TYPE_OVERLAY )
2016-09-21 11:59:25 +03:00
/**
* drm_for_each_plane - iterate over all planes
* @ plane : the loop cursor
* @ dev : the DRM device
*
* Iterate over all planes of @ dev , include primary and cursor planes .
*/
2016-09-21 11:59:24 +03:00
# define drm_for_each_plane(plane, dev) \
list_for_each_entry ( plane , & ( dev ) - > mode_config . plane_list , head )
# endif