mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
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
This commit is contained in:
parent
178e32c224
commit
a4370c7774
6 changed files with 203 additions and 102 deletions
|
@ -31,6 +31,8 @@
|
|||
#include <drm/drmP.h>
|
||||
|
||||
#include <drm/drm_fixed.h>
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
|
||||
/**
|
||||
* DOC: dp mst helper
|
||||
|
@ -2992,41 +2994,32 @@ static void drm_dp_destroy_connector_work(struct work_struct *work)
|
|||
(*mgr->cbs->hotplug)(mgr);
|
||||
}
|
||||
|
||||
void *drm_dp_mst_duplicate_state(struct drm_atomic_state *state, void *obj)
|
||||
static struct drm_private_state *
|
||||
drm_dp_mst_duplicate_state(struct drm_private_obj *obj)
|
||||
{
|
||||
struct drm_dp_mst_topology_mgr *mgr = obj;
|
||||
struct drm_dp_mst_topology_state *new_mst_state;
|
||||
struct drm_dp_mst_topology_state *state;
|
||||
|
||||
if (WARN_ON(!mgr->state))
|
||||
state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return NULL;
|
||||
|
||||
new_mst_state = kmemdup(mgr->state, sizeof(*new_mst_state), GFP_KERNEL);
|
||||
if (new_mst_state)
|
||||
new_mst_state->state = state;
|
||||
return new_mst_state;
|
||||
__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
|
||||
|
||||
return &state->base;
|
||||
}
|
||||
|
||||
void drm_dp_mst_swap_state(void *obj, void **obj_state_ptr)
|
||||
static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
|
||||
struct drm_private_state *state)
|
||||
{
|
||||
struct drm_dp_mst_topology_mgr *mgr = obj;
|
||||
struct drm_dp_mst_topology_state **topology_state_ptr;
|
||||
struct drm_dp_mst_topology_state *mst_state =
|
||||
to_dp_mst_topology_state(state);
|
||||
|
||||
topology_state_ptr = (struct drm_dp_mst_topology_state **)obj_state_ptr;
|
||||
|
||||
mgr->state->state = (*topology_state_ptr)->state;
|
||||
swap(*topology_state_ptr, mgr->state);
|
||||
mgr->state->state = NULL;
|
||||
}
|
||||
|
||||
void drm_dp_mst_destroy_state(void *obj_state)
|
||||
{
|
||||
kfree(obj_state);
|
||||
kfree(mst_state);
|
||||
}
|
||||
|
||||
static const struct drm_private_state_funcs mst_state_funcs = {
|
||||
.duplicate_state = drm_dp_mst_duplicate_state,
|
||||
.swap_state = drm_dp_mst_swap_state,
|
||||
.destroy_state = drm_dp_mst_destroy_state,
|
||||
.atomic_duplicate_state = drm_dp_mst_duplicate_state,
|
||||
.atomic_destroy_state = drm_dp_mst_destroy_state,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -3050,8 +3043,7 @@ struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_a
|
|||
struct drm_device *dev = mgr->dev;
|
||||
|
||||
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
|
||||
return drm_atomic_get_private_obj_state(state, mgr,
|
||||
&mst_state_funcs);
|
||||
return to_dp_mst_topology_state(drm_atomic_get_private_obj_state(state, &mgr->base));
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
|
||||
|
||||
|
@ -3071,6 +3063,8 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
|
|||
int max_dpcd_transaction_bytes,
|
||||
int max_payloads, int conn_base_id)
|
||||
{
|
||||
struct drm_dp_mst_topology_state *mst_state;
|
||||
|
||||
mutex_init(&mgr->lock);
|
||||
mutex_init(&mgr->qlock);
|
||||
mutex_init(&mgr->payload_lock);
|
||||
|
@ -3099,14 +3093,18 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
|
|||
if (test_calc_pbn_mode() < 0)
|
||||
DRM_ERROR("MST PBN self-test failed\n");
|
||||
|
||||
mgr->state = kzalloc(sizeof(*mgr->state), GFP_KERNEL);
|
||||
if (mgr->state == NULL)
|
||||
mst_state = kzalloc(sizeof(*mst_state), GFP_KERNEL);
|
||||
if (mst_state == NULL)
|
||||
return -ENOMEM;
|
||||
mgr->state->mgr = mgr;
|
||||
|
||||
mst_state->mgr = mgr;
|
||||
|
||||
/* max. time slots - one slot for MTP header */
|
||||
mgr->state->avail_slots = 63;
|
||||
mgr->funcs = &mst_state_funcs;
|
||||
mst_state->avail_slots = 63;
|
||||
|
||||
drm_atomic_private_obj_init(&mgr->base,
|
||||
&mst_state->base,
|
||||
&mst_state_funcs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3128,8 +3126,7 @@ void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
|
|||
mutex_unlock(&mgr->payload_lock);
|
||||
mgr->dev = NULL;
|
||||
mgr->aux = NULL;
|
||||
kfree(mgr->state);
|
||||
mgr->state = NULL;
|
||||
drm_atomic_private_obj_fini(&mgr->base);
|
||||
mgr->funcs = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_mst_topology_mgr_destroy);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue