aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_dp_mst_topology.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2017-07-12 11:51:02 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2017-07-13 12:28:43 -0400
commita4370c777406c2810e37fafd166ccddecdb2a60c (patch)
tree656eaad2a6834f2c25525d91f3fb877b123589be /drivers/gpu/drm/drm_dp_mst_topology.c
parent178e32c224d2772d3862828dc6f81e4d8953b2f2 (diff)
drm/atomic: Make private objs proper objects
Make the atomic private object stuff less special by introducing proper base classes for the object and its state. Drivers can embed these in their own appropriate objects, after which these things will work exactly like the plane/crtc/connector states during atomic operations. v2: Reorder to not depend on drm_dynarray (Daniel) Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> #v1 Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170712155102.26276-3-ville.syrjala@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm/drm_dp_mst_topology.c')
-rw-r--r--drivers/gpu/drm/drm_dp_mst_topology.c63
1 files changed, 30 insertions, 33 deletions
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 18cecd94acb6..552e71d5aa5f 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -31,6 +31,8 @@
31#include <drm/drmP.h> 31#include <drm/drmP.h>
32 32
33#include <drm/drm_fixed.h> 33#include <drm/drm_fixed.h>
34#include <drm/drm_atomic.h>
35#include <drm/drm_atomic_helper.h>
34 36
35/** 37/**
36 * DOC: dp mst helper 38 * DOC: dp mst helper
@@ -2992,41 +2994,32 @@ static void drm_dp_destroy_connector_work(struct work_struct *work)
2992 (*mgr->cbs->hotplug)(mgr); 2994 (*mgr->cbs->hotplug)(mgr);
2993} 2995}
2994 2996
2995void *drm_dp_mst_duplicate_state(struct drm_atomic_state *state, void *obj) 2997static struct drm_private_state *
2998drm_dp_mst_duplicate_state(struct drm_private_obj *obj)
2996{ 2999{
2997 struct drm_dp_mst_topology_mgr *mgr = obj; 3000 struct drm_dp_mst_topology_state *state;
2998 struct drm_dp_mst_topology_state *new_mst_state;
2999 3001
3000 if (WARN_ON(!mgr->state)) 3002 state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
3003 if (!state)
3001 return NULL; 3004 return NULL;
3002 3005
3003 new_mst_state = kmemdup(mgr->state, sizeof(*new_mst_state), GFP_KERNEL); 3006 __drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
3004 if (new_mst_state)
3005 new_mst_state->state = state;
3006 return new_mst_state;
3007}
3008
3009void drm_dp_mst_swap_state(void *obj, void **obj_state_ptr)
3010{
3011 struct drm_dp_mst_topology_mgr *mgr = obj;
3012 struct drm_dp_mst_topology_state **topology_state_ptr;
3013
3014 topology_state_ptr = (struct drm_dp_mst_topology_state **)obj_state_ptr;
3015 3007
3016 mgr->state->state = (*topology_state_ptr)->state; 3008 return &state->base;
3017 swap(*topology_state_ptr, mgr->state);
3018 mgr->state->state = NULL;
3019} 3009}
3020 3010
3021void drm_dp_mst_destroy_state(void *obj_state) 3011static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
3012 struct drm_private_state *state)
3022{ 3013{
3023 kfree(obj_state); 3014 struct drm_dp_mst_topology_state *mst_state =
3015 to_dp_mst_topology_state(state);
3016
3017 kfree(mst_state);
3024} 3018}
3025 3019
3026static const struct drm_private_state_funcs mst_state_funcs = { 3020static const struct drm_private_state_funcs mst_state_funcs = {
3027 .duplicate_state = drm_dp_mst_duplicate_state, 3021 .atomic_duplicate_state = drm_dp_mst_duplicate_state,
3028 .swap_state = drm_dp_mst_swap_state, 3022 .atomic_destroy_state = drm_dp_mst_destroy_state,
3029 .destroy_state = drm_dp_mst_destroy_state,
3030}; 3023};
3031 3024
3032/** 3025/**
@@ -3050,8 +3043,7 @@ struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_a
3050 struct drm_device *dev = mgr->dev; 3043 struct drm_device *dev = mgr->dev;
3051 3044
3052 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 3045 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
3053 return drm_atomic_get_private_obj_state(state, mgr, 3046 return to_dp_mst_topology_state(drm_atomic_get_private_obj_state(state, &mgr->base));
3054 &mst_state_funcs);
3055} 3047}
3056EXPORT_SYMBOL(drm_atomic_get_mst_topology_state); 3048EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
3057 3049
@@ -3071,6 +3063,8 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
3071 int max_dpcd_transaction_bytes, 3063 int max_dpcd_transaction_bytes,
3072 int max_payloads, int conn_base_id) 3064 int max_payloads, int conn_base_id)
3073{ 3065{
3066 struct drm_dp_mst_topology_state *mst_state;
3067
3074 mutex_init(&mgr->lock); 3068 mutex_init(&mgr->lock);
3075 mutex_init(&mgr->qlock); 3069 mutex_init(&mgr->qlock);
3076 mutex_init(&mgr->payload_lock); 3070 mutex_init(&mgr->payload_lock);
@@ -3099,14 +3093,18 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
3099 if (test_calc_pbn_mode() < 0) 3093 if (test_calc_pbn_mode() < 0)
3100 DRM_ERROR("MST PBN self-test failed\n"); 3094 DRM_ERROR("MST PBN self-test failed\n");
3101 3095
3102 mgr->state = kzalloc(sizeof(*mgr->state), GFP_KERNEL); 3096 mst_state = kzalloc(sizeof(*mst_state), GFP_KERNEL);
3103 if (mgr->state == NULL) 3097 if (mst_state == NULL)
3104 return -ENOMEM; 3098 return -ENOMEM;
3105 mgr->state->mgr = mgr; 3099
3100 mst_state->mgr = mgr;
3106 3101
3107 /* max. time slots - one slot for MTP header */ 3102 /* max. time slots - one slot for MTP header */
3108 mgr->state->avail_slots = 63; 3103 mst_state->avail_slots = 63;
3109 mgr->funcs = &mst_state_funcs; 3104
3105 drm_atomic_private_obj_init(&mgr->base,
3106 &mst_state->base,
3107 &mst_state_funcs);
3110 3108
3111 return 0; 3109 return 0;
3112} 3110}
@@ -3128,8 +3126,7 @@ void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
3128 mutex_unlock(&mgr->payload_lock); 3126 mutex_unlock(&mgr->payload_lock);
3129 mgr->dev = NULL; 3127 mgr->dev = NULL;
3130 mgr->aux = NULL; 3128 mgr->aux = NULL;
3131 kfree(mgr->state); 3129 drm_atomic_private_obj_fini(&mgr->base);
3132 mgr->state = NULL;
3133 mgr->funcs = NULL; 3130 mgr->funcs = NULL;
3134} 3131}
3135EXPORT_SYMBOL(drm_dp_mst_topology_mgr_destroy); 3132EXPORT_SYMBOL(drm_dp_mst_topology_mgr_destroy);