@ -1948,13 +1948,12 @@ get_weston_protection_from_drm(enum wdrm_content_protection_state protection,
* Get current content - protection status for a given head .
* Get current content - protection status for a given head .
*
*
* @ param head drm_head , whose protection is to be retrieved
* @ param head drm_head , whose protection is to be retrieved
* @ param props drm property object of the connector , related to the head
* @ return protection status in case of success , - 1 otherwise
* @ return protection status in case of success , - 1 otherwise
*/
*/
static enum weston_hdcp_protection
static enum weston_hdcp_protection
drm_head_get_current_protection ( struct drm_head * head ,
drm_head_get_current_protection ( struct drm_head * head )
drmModeObjectProperties * props )
{
{
drmModeObjectProperties * props = head - > connector . props_drm ;
struct drm_property_info * info ;
struct drm_property_info * info ;
enum wdrm_content_protection_state protection ;
enum wdrm_content_protection_state protection ;
enum wdrm_hdcp_content_type type ;
enum wdrm_hdcp_content_type type ;
@ -1991,6 +1990,26 @@ drm_head_get_current_protection(struct drm_head *head,
return weston_hdcp ;
return weston_hdcp ;
}
}
static int
drm_connector_update_properties ( struct drm_connector * connector )
{
drmModeObjectProperties * props ;
props = drmModeObjectGetProperties ( connector - > backend - > drm . fd ,
connector - > connector_id ,
DRM_MODE_OBJECT_CONNECTOR ) ;
if ( ! props ) {
weston_log ( " Error: failed to get connector properties \n " ) ;
return - 1 ;
}
if ( connector - > props_drm )
drmModeFreeObjectProperties ( connector - > props_drm ) ;
connector - > props_drm = props ;
return 0 ;
}
/** Replace connector data and monitor information
/** Replace connector data and monitor information
*
*
* @ param connector The drm_connector object to be updated .
* @ param connector The drm_connector object to be updated .
@ -2006,17 +2025,10 @@ static int
drm_connector_assign_connector_info ( struct drm_connector * connector ,
drm_connector_assign_connector_info ( struct drm_connector * connector ,
drmModeConnector * conn )
drmModeConnector * conn )
{
{
drmModeObjectProperties * props ;
assert ( connector - > connector_id = = conn - > connector_id ) ;
assert ( connector - > connector_id = = conn - > connector_id ) ;
props = drmModeObjectGetProperties ( connector - > backend - > drm . fd ,
if ( drm_connector_update_properties ( connector ) < 0 )
connector - > connector_id ,
DRM_MODE_OBJECT_CONNECTOR ) ;
if ( ! props ) {
weston_log ( " Error: failed to get connector properties \n " ) ;
return - 1 ;
return - 1 ;
}
if ( connector - > conn & & connector - > conn ! = conn )
if ( connector - > conn & & connector - > conn ! = conn )
drmModeFreeConnector ( connector - > conn ) ;
drmModeFreeConnector ( connector - > conn ) ;
@ -2025,16 +2037,14 @@ drm_connector_assign_connector_info(struct drm_connector *connector,
drm_property_info_free ( connector - > props , WDRM_CONNECTOR__COUNT ) ;
drm_property_info_free ( connector - > props , WDRM_CONNECTOR__COUNT ) ;
drm_property_info_populate ( connector - > backend , connector_props ,
drm_property_info_populate ( connector - > backend , connector_props ,
connector - > props ,
connector - > props ,
WDRM_CONNECTOR__COUNT , props ) ;
WDRM_CONNECTOR__COUNT , connector - > props_drm ) ;
if ( connector - > head ! = NULL ) {
if ( connector - > head ! = NULL ) {
update_head_from_connector ( connector - > head , props ) ;
update_head_from_connector ( connector - > head ) ;
weston_head_set_content_protection_status ( & connector - > head - > base ,
weston_head_set_content_protection_status ( & connector - > head - > base ,
drm_head_get_current_protection ( connector - > head , props ) ) ;
drm_head_get_current_protection ( connector - > head ) ) ;
}
}
drmModeFreeObjectProperties ( props ) ;
return 0 ;
return 0 ;
}
}
@ -2045,6 +2055,7 @@ drm_connector_init(struct drm_backend *b, struct drm_connector *connector,
connector - > backend = b ;
connector - > backend = b ;
connector - > connector_id = connector_id ;
connector - > connector_id = connector_id ;
connector - > head = NULL ;
connector - > head = NULL ;
connector - > props_drm = NULL ;
connector - > conn = drmModeGetConnector ( b - > drm . fd , connector_id ) ;
connector - > conn = drmModeGetConnector ( b - > drm . fd , connector_id ) ;
if ( ! connector - > conn ) {
if ( ! connector - > conn ) {
@ -2059,6 +2070,7 @@ static void
drm_connector_fini ( struct drm_connector * connector )
drm_connector_fini ( struct drm_connector * connector )
{
{
drmModeFreeConnector ( connector - > conn ) ;
drmModeFreeConnector ( connector - > conn ) ;
drmModeFreeObjectProperties ( connector - > props_drm ) ;
drm_property_info_free ( connector - > props , WDRM_CONNECTOR__COUNT ) ;
drm_property_info_free ( connector - > props , WDRM_CONNECTOR__COUNT ) ;
}
}
@ -2348,7 +2360,6 @@ drm_backend_update_conn_props(struct drm_backend *b,
{
{
struct drm_head * head ;
struct drm_head * head ;
enum wdrm_connector_property conn_prop ;
enum wdrm_connector_property conn_prop ;
drmModeObjectProperties * props ;
head = drm_head_find_by_connector ( b , connector_id ) ;
head = drm_head_find_by_connector ( b , connector_id ) ;
if ( ! head ) {
if ( ! head ) {
@ -2361,19 +2372,13 @@ drm_backend_update_conn_props(struct drm_backend *b,
if ( conn_prop > = WDRM_CONNECTOR__COUNT )
if ( conn_prop > = WDRM_CONNECTOR__COUNT )
return ;
return ;
props = drmModeObjectGetProperties ( b - > drm . fd ,
if ( drm_connector_update_properties ( & head - > connector ) < 0 )
connector_id ,
DRM_MODE_OBJECT_CONNECTOR ) ;
if ( ! props ) {
weston_log ( " Error: failed to get connector '%s' properties \n " ,
head - > base . name ) ;
return ;
return ;
}
if ( conn_prop = = WDRM_CONNECTOR_CONTENT_PROTECTION ) {
if ( conn_prop = = WDRM_CONNECTOR_CONTENT_PROTECTION ) {
weston_head_set_content_protection_status ( & head - > base ,
weston_head_set_content_protection_status ( & head - > base ,
drm_head_get_current_protection ( head , props ) ) ;
drm_head_get_current_protection ( head ) ) ;
}
}
drmModeFreeObjectProperties ( props ) ;
}
}
static int
static int