Commit ad093607 authored by Thierry Reding's avatar Thierry Reding

drm: Introduce drm_connector_{get,put}()

For consistency with other reference counting APIs in the kernel, add
drm_connector_get() and drm_connector_put() functions to reference count
connectors.

Compatibility aliases are added to keep existing code working. To help
speed up the transition, all the instances of the old functions in the
DRM core are already replaced in this commit.

The existing semantic patch for mode object reference count conversion
is extended for these new helpers.
Reviewed-by: default avatarSean Paul <seanpaul@chromium.org>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170228144643.5668-4-thierry.reding@gmail.com
parent 020a218f
...@@ -150,7 +150,7 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state) ...@@ -150,7 +150,7 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
state->connectors[i].state); state->connectors[i].state);
state->connectors[i].ptr = NULL; state->connectors[i].ptr = NULL;
state->connectors[i].state = NULL; state->connectors[i].state = NULL;
drm_connector_unreference(connector); drm_connector_put(connector);
} }
for (i = 0; i < config->num_crtc; i++) { for (i = 0; i < config->num_crtc; i++) {
...@@ -1030,7 +1030,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state, ...@@ -1030,7 +1030,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
if (!connector_state) if (!connector_state)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
drm_connector_reference(connector); drm_connector_get(connector);
state->connectors[index].state = connector_state; state->connectors[index].state = connector_state;
state->connectors[index].old_state = connector->state; state->connectors[index].old_state = connector->state;
state->connectors[index].new_state = connector_state; state->connectors[index].new_state = connector_state;
...@@ -1380,7 +1380,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, ...@@ -1380,7 +1380,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
crtc_state->connector_mask &= crtc_state->connector_mask &=
~(1 << drm_connector_index(conn_state->connector)); ~(1 << drm_connector_index(conn_state->connector));
drm_connector_unreference(conn_state->connector); drm_connector_put(conn_state->connector);
conn_state->crtc = NULL; conn_state->crtc = NULL;
} }
...@@ -1392,7 +1392,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, ...@@ -1392,7 +1392,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
crtc_state->connector_mask |= crtc_state->connector_mask |=
1 << drm_connector_index(conn_state->connector); 1 << drm_connector_index(conn_state->connector);
drm_connector_reference(conn_state->connector); drm_connector_get(conn_state->connector);
conn_state->crtc = crtc; conn_state->crtc = crtc;
DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n", DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
......
...@@ -3351,7 +3351,7 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector, ...@@ -3351,7 +3351,7 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
{ {
memcpy(state, connector->state, sizeof(*state)); memcpy(state, connector->state, sizeof(*state));
if (state->crtc) if (state->crtc)
drm_connector_reference(connector); drm_connector_get(connector);
} }
EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state); EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
...@@ -3477,7 +3477,7 @@ void ...@@ -3477,7 +3477,7 @@ void
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state) __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
{ {
if (state->crtc) if (state->crtc)
drm_connector_unreference(state->connector); drm_connector_put(state->connector);
} }
EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state); EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
......
...@@ -35,8 +35,8 @@ ...@@ -35,8 +35,8 @@
* als fixed panels or anything else that can display pixels in some form. As * als fixed panels or anything else that can display pixels in some form. As
* opposed to all other KMS objects representing hardware (like CRTC, encoder or * opposed to all other KMS objects representing hardware (like CRTC, encoder or
* plane abstractions) connectors can be hotplugged and unplugged at runtime. * plane abstractions) connectors can be hotplugged and unplugged at runtime.
* Hence they are reference-counted using drm_connector_reference() and * Hence they are reference-counted using drm_connector_get() and
* drm_connector_unreference(). * drm_connector_put().
* *
* KMS driver must create, initialize, register and attach at a &struct * KMS driver must create, initialize, register and attach at a &struct
* drm_connector for each such sink. The instance is created as other KMS * drm_connector for each such sink. The instance is created as other KMS
...@@ -557,7 +557,7 @@ drm_connector_list_iter_next(struct drm_connector_list_iter *iter) ...@@ -557,7 +557,7 @@ drm_connector_list_iter_next(struct drm_connector_list_iter *iter)
spin_unlock_irqrestore(&config->connector_list_lock, flags); spin_unlock_irqrestore(&config->connector_list_lock, flags);
if (old_conn) if (old_conn)
drm_connector_unreference(old_conn); drm_connector_put(old_conn);
return iter->conn; return iter->conn;
} }
...@@ -576,7 +576,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter) ...@@ -576,7 +576,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter)
{ {
iter->dev = NULL; iter->dev = NULL;
if (iter->conn) if (iter->conn)
drm_connector_unreference(iter->conn); drm_connector_put(iter->conn);
lock_release(&connector_list_iter_dep_map, 0, _RET_IP_); lock_release(&connector_list_iter_dep_map, 0, _RET_IP_);
} }
EXPORT_SYMBOL(drm_connector_list_iter_put); EXPORT_SYMBOL(drm_connector_list_iter_put);
...@@ -1309,7 +1309,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, ...@@ -1309,7 +1309,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
out: out:
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
out_unref: out_unref:
drm_connector_unreference(connector); drm_connector_put(connector);
return ret; return ret;
} }
......
...@@ -685,7 +685,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -685,7 +685,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
if (connector_set) { if (connector_set) {
for (i = 0; i < crtc_req->count_connectors; i++) { for (i = 0; i < crtc_req->count_connectors; i++) {
if (connector_set[i]) if (connector_set[i])
drm_connector_unreference(connector_set[i]); drm_connector_put(connector_set[i]);
} }
} }
kfree(connector_set); kfree(connector_set);
......
...@@ -465,7 +465,7 @@ drm_crtc_helper_disable(struct drm_crtc *crtc) ...@@ -465,7 +465,7 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
connector->dpms = DRM_MODE_DPMS_OFF; connector->dpms = DRM_MODE_DPMS_OFF;
/* we keep a reference while the encoder is bound */ /* we keep a reference while the encoder is bound */
drm_connector_unreference(connector); drm_connector_put(connector);
} }
drm_connector_list_iter_put(&conn_iter); drm_connector_list_iter_put(&conn_iter);
} }
...@@ -623,7 +623,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) ...@@ -623,7 +623,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
for (ro = 0; ro < set->num_connectors; ro++) { for (ro = 0; ro < set->num_connectors; ro++) {
if (set->connectors[ro]->encoder) if (set->connectors[ro]->encoder)
continue; continue;
drm_connector_reference(set->connectors[ro]); drm_connector_get(set->connectors[ro]);
} }
/* a) traverse passed in connector list and get encoders for them */ /* a) traverse passed in connector list and get encoders for them */
...@@ -772,7 +772,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) ...@@ -772,7 +772,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
for (ro = 0; ro < set->num_connectors; ro++) { for (ro = 0; ro < set->num_connectors; ro++) {
if (set->connectors[ro]->encoder) if (set->connectors[ro]->encoder)
continue; continue;
drm_connector_unreference(set->connectors[ro]); drm_connector_put(set->connectors[ro]);
} }
/* Try to restore the config */ /* Try to restore the config */
......
...@@ -148,7 +148,7 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) ...@@ -148,7 +148,7 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
struct drm_fb_helper_connector *fb_helper_connector = struct drm_fb_helper_connector *fb_helper_connector =
fb_helper->connector_info[i]; fb_helper->connector_info[i];
drm_connector_unreference(fb_helper_connector->connector); drm_connector_put(fb_helper_connector->connector);
kfree(fb_helper_connector); kfree(fb_helper_connector);
fb_helper->connector_info[i] = NULL; fb_helper->connector_info[i] = NULL;
...@@ -185,7 +185,7 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_ ...@@ -185,7 +185,7 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_
if (!fb_helper_connector) if (!fb_helper_connector)
return -ENOMEM; return -ENOMEM;
drm_connector_reference(connector); drm_connector_get(connector);
fb_helper_connector->connector = connector; fb_helper_connector->connector = connector;
fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector;
return 0; return 0;
...@@ -211,7 +211,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, ...@@ -211,7 +211,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
if (i == fb_helper->connector_count) if (i == fb_helper->connector_count)
return -EINVAL; return -EINVAL;
fb_helper_connector = fb_helper->connector_info[i]; fb_helper_connector = fb_helper->connector_info[i];
drm_connector_unreference(fb_helper_connector->connector); drm_connector_put(fb_helper_connector->connector);
for (j = i + 1; j < fb_helper->connector_count; j++) { for (j = i + 1; j < fb_helper->connector_count; j++) {
fb_helper->connector_info[j - 1] = fb_helper->connector_info[j]; fb_helper->connector_info[j - 1] = fb_helper->connector_info[j];
...@@ -633,7 +633,7 @@ static void drm_fb_helper_modeset_release(struct drm_fb_helper *helper, ...@@ -633,7 +633,7 @@ static void drm_fb_helper_modeset_release(struct drm_fb_helper *helper,
int i; int i;
for (i = 0; i < modeset->num_connectors; i++) { for (i = 0; i < modeset->num_connectors; i++) {
drm_connector_unreference(modeset->connectors[i]); drm_connector_put(modeset->connectors[i]);
modeset->connectors[i] = NULL; modeset->connectors[i] = NULL;
} }
modeset->num_connectors = 0; modeset->num_connectors = 0;
...@@ -650,7 +650,7 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper) ...@@ -650,7 +650,7 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
int i; int i;
for (i = 0; i < helper->connector_count; i++) { for (i = 0; i < helper->connector_count; i++) {
drm_connector_unreference(helper->connector_info[i]->connector); drm_connector_put(helper->connector_info[i]->connector);
kfree(helper->connector_info[i]); kfree(helper->connector_info[i]);
} }
kfree(helper->connector_info); kfree(helper->connector_info);
...@@ -2192,7 +2192,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper, ...@@ -2192,7 +2192,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
fb_crtc->y = offset->y; fb_crtc->y = offset->y;
modeset->mode = drm_mode_duplicate(dev, modeset->mode = drm_mode_duplicate(dev,
fb_crtc->desired_mode); fb_crtc->desired_mode);
drm_connector_reference(connector); drm_connector_get(connector);
modeset->connectors[modeset->num_connectors++] = connector; modeset->connectors[modeset->num_connectors++] = connector;
modeset->fb = fb_helper->fb; modeset->fb = fb_helper->fb;
modeset->x = offset->x; modeset->x = offset->x;
......
...@@ -418,7 +418,7 @@ void drm_mode_config_cleanup(struct drm_device *dev) ...@@ -418,7 +418,7 @@ void drm_mode_config_cleanup(struct drm_device *dev)
* current connector itself, which means it is inherently safe * current connector itself, which means it is inherently safe
* against unreferencing the current connector - but not against * against unreferencing the current connector - but not against
* deleting it right away. */ * deleting it right away. */
drm_connector_unreference(connector); drm_connector_put(connector);
} }
drm_connector_list_iter_put(&conn_iter); drm_connector_list_iter_put(&conn_iter);
if (WARN_ON(!list_empty(&dev->mode_config.connector_list))) { if (WARN_ON(!list_empty(&dev->mode_config.connector_list))) {
......
...@@ -812,25 +812,50 @@ static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev, ...@@ -812,25 +812,50 @@ static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
} }
/** /**
* drm_connector_reference - incr the connector refcnt * drm_connector_get - acquire a connector reference
* @connector: connector * @connector: DRM connector
* *
* This function increments the connector's refcount. * This function increments the connector's refcount.
*/ */
static inline void drm_connector_get(struct drm_connector *connector)
{
drm_mode_object_get(&connector->base);
}
/**
* drm_connector_put - release a connector reference
* @connector: DRM connector
*
* This function decrements the connector's reference count and frees the
* object if the reference count drops to zero.
*/
static inline void drm_connector_put(struct drm_connector *connector)
{
drm_mode_object_put(&connector->base);
}
/**
* drm_connector_reference - acquire a connector reference
* @connector: DRM connector
*
* This is a compatibility alias for drm_connector_get() and should not be
* used by new code.
*/
static inline void drm_connector_reference(struct drm_connector *connector) static inline void drm_connector_reference(struct drm_connector *connector)
{ {
drm_mode_object_reference(&connector->base); drm_connector_get(connector);
} }
/** /**
* drm_connector_unreference - unref a connector * drm_connector_unreference - release a connector reference
* @connector: connector to unref * @connector: DRM connector
* *
* This function decrements the connector's refcount and frees it if it drops to zero. * This is a compatibility alias for drm_connector_put() and should not be
* used by new code.
*/ */
static inline void drm_connector_unreference(struct drm_connector *connector) static inline void drm_connector_unreference(struct drm_connector *connector)
{ {
drm_mode_object_unreference(&connector->base); drm_connector_put(connector);
} }
const char *drm_get_connector_status_name(enum drm_connector_status status); const char *drm_get_connector_status_name(enum drm_connector_status status);
...@@ -924,7 +949,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter); ...@@ -924,7 +949,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter);
* *
* Note that @connector is only valid within the list body, if you want to use * Note that @connector is only valid within the list body, if you want to use
* @connector after calling drm_connector_list_iter_put() then you need to grab * @connector after calling drm_connector_list_iter_put() then you need to grab
* your own reference first using drm_connector_reference(). * your own reference first using drm_connector_get().
*/ */
#define drm_for_each_connector_iter(connector, iter) \ #define drm_for_each_connector_iter(connector, iter) \
while ((connector = drm_connector_list_iter_next(iter))) while ((connector = drm_connector_list_iter_next(iter)))
......
...@@ -20,6 +20,12 @@ expression object; ...@@ -20,6 +20,12 @@ expression object;
| |
- drm_mode_object_unreference(object) - drm_mode_object_unreference(object)
+ drm_mode_object_put(object) + drm_mode_object_put(object)
|
- drm_connector_reference(object)
+ drm_connector_get(object)
|
- drm_connector_unreference(object)
+ drm_connector_put(object)
) )
@r depends on report@ @r depends on report@
...@@ -31,6 +37,10 @@ position p; ...@@ -31,6 +37,10 @@ position p;
drm_mode_object_unreference@p(object) drm_mode_object_unreference@p(object)
| |
drm_mode_object_reference@p(object) drm_mode_object_reference@p(object)
|
drm_connector_unreference@p(object)
|
drm_connector_reference@p(object)
) )
@script:python depends on report@ @script:python depends on report@
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment