[PATCH 09/22] drm/atomic: Convert state->connectors to drm_dynarray
ville.syrjala at linux.intel.com
ville.syrjala at linux.intel.com
Thu Jul 6 20:24:29 UTC 2017
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
state->connectors[] can grows dynamically, so we can switch over to
using the new drm_dynarray.
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
drivers/gpu/drm/drm_atomic.c | 49 +++++++++++++++++++------------------
drivers/gpu/drm/drm_atomic_helper.c | 4 +--
include/drm/drm_atomic.h | 42 ++++++++++++++++++-------------
3 files changed, 52 insertions(+), 43 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 09ca662fcd35..1663ec3626a1 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -28,6 +28,7 @@
#include <drm/drmP.h>
#include <drm/drm_atomic.h>
+#include <drm/drm_dynarray.h>
#include <drm/drm_mode.h>
#include <drm/drm_print.h>
#include <linux/sync_file.h>
@@ -53,7 +54,7 @@ EXPORT_SYMBOL(__drm_crtc_commit_free);
*/
void drm_atomic_state_default_release(struct drm_atomic_state *state)
{
- kfree(state->connectors);
+ drm_dynarray_fini(&state->connectors);
kfree(state->crtcs);
kfree(state->planes);
kfree(state->private_objs);
@@ -87,6 +88,9 @@ drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state)
if (!state->planes)
goto fail;
+ drm_dynarray_init(&state->connectors,
+ sizeof(struct __drm_connectors_state));
+
state->dev = dev;
DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state);
@@ -142,15 +146,17 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
for (i = 0; i < state->num_connector; i++) {
- struct drm_connector *connector = state->connectors[i].ptr;
+ struct __drm_connectors_state *c =
+ __drm_atomic_state_connector(state, i);
+ struct drm_connector *connector = c->ptr;
if (!connector)
continue;
connector->funcs->atomic_destroy_state(connector,
- state->connectors[i].state);
- state->connectors[i].ptr = NULL;
- state->connectors[i].state = NULL;
+ c->state);
+ c->ptr = NULL;
+ c->state = NULL;
drm_connector_put(connector);
}
@@ -1064,6 +1070,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
int ret, index;
struct drm_mode_config *config = &connector->dev->mode_config;
struct drm_connector_state *connector_state;
+ struct __drm_connectors_state *c;
WARN_ON(!state->acquire_ctx);
@@ -1073,35 +1080,29 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
index = drm_connector_index(connector);
- if (index >= state->num_connector) {
- struct __drm_connnectors_state *c;
- int alloc = max(index + 1, config->num_connector);
-
- c = krealloc(state->connectors, alloc * sizeof(*state->connectors), GFP_KERNEL);
- if (!c)
- return ERR_PTR(-ENOMEM);
-
- state->connectors = c;
- memset(&state->connectors[state->num_connector], 0,
- sizeof(*state->connectors) * (alloc - state->num_connector));
+ ret = drm_dynarray_reserve(&state->connectors,
+ max(index, config->num_connector - 1));
+ if (ret)
+ return ERR_PTR(ret);
- state->num_connector = alloc;
- }
+ c = __drm_atomic_state_connector(state, index);
- if (state->connectors[index].state)
- return state->connectors[index].state;
+ if (c->state)
+ return c->state;
connector_state = connector->funcs->atomic_duplicate_state(connector);
if (!connector_state)
return ERR_PTR(-ENOMEM);
drm_connector_get(connector);
- state->connectors[index].state = connector_state;
- state->connectors[index].old_state = connector->state;
- state->connectors[index].new_state = connector_state;
- state->connectors[index].ptr = connector;
+ c->state = connector_state;
+ c->old_state = connector->state;
+ c->new_state = connector_state;
+ c->ptr = connector;
connector_state->state = state;
+ state->num_connector = state->connectors.num_elems;
+
DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d:%s] %p state to %p\n",
connector->base.id, connector->name,
connector_state, state);
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 667ec97d4efb..2d747ac35ecf 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -2297,7 +2297,7 @@ void drm_atomic_helper_swap_state(struct drm_atomic_state *state,
old_conn_state->state = state;
new_conn_state->state = NULL;
- state->connectors[i].state = old_conn_state;
+ __drm_atomic_state_connector(state, i)->state = old_conn_state;
connector->state = new_conn_state;
}
@@ -2871,7 +2871,7 @@ int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
state->crtcs[i].old_state = crtc->state;
for_each_new_connector_in_state(state, connector, new_conn_state, i)
- state->connectors[i].old_state = connector->state;
+ __drm_atomic_state_connector(state, i)->old_state = connector->state;
return drm_atomic_commit(state);
}
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index dcc8e0cdb7ff..44316ce45fbb 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -29,6 +29,7 @@
#define DRM_ATOMIC_H_
#include <drm/drm_crtc.h>
+#include <drm/drm_dynarray.h>
/**
* struct drm_crtc_commit - track modeset commits on a CRTC
@@ -149,7 +150,7 @@ struct __drm_crtcs_state {
unsigned last_vblank_count;
};
-struct __drm_connnectors_state {
+struct __drm_connectors_state {
struct drm_connector *ptr;
struct drm_connector_state *state, *old_state, *new_state;
};
@@ -226,7 +227,7 @@ struct drm_atomic_state {
struct __drm_planes_state *planes;
struct __drm_crtcs_state *crtcs;
int num_connector;
- struct __drm_connnectors_state *connectors;
+ struct drm_dynarray connectors; /* struct __drm_connectors_state [] */;
int num_private_objs;
struct __drm_private_objs_state *private_objs;
@@ -241,6 +242,13 @@ struct drm_atomic_state {
struct work_struct commit_work;
};
+static inline struct __drm_connectors_state *
+__drm_atomic_state_connector(const struct drm_atomic_state *state,
+ unsigned int index)
+{
+ return drm_dynarray_elem(&state->connectors, index);
+}
+
void __drm_crtc_commit_free(struct kref *kref);
/**
@@ -441,7 +449,7 @@ drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
if (index >= state->num_connector)
return NULL;
- return state->connectors[index].state;
+ return __drm_atomic_state_connector(state, index)->state;
}
/**
@@ -461,7 +469,7 @@ drm_atomic_get_old_connector_state(struct drm_atomic_state *state,
if (index >= state->num_connector)
return NULL;
- return state->connectors[index].old_state;
+ return __drm_atomic_state_connector(state, index)->old_state;
}
/**
@@ -481,7 +489,7 @@ drm_atomic_get_new_connector_state(struct drm_atomic_state *state,
if (index >= state->num_connector)
return NULL;
- return state->connectors[index].new_state;
+ return __drm_atomic_state_connector(state, index)->new_state;
}
/**
@@ -573,9 +581,9 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
*/
#define for_each_connector_in_state(__state, connector, connector_state, __i) \
for ((__i) = 0; \
- (__i) < (__state)->num_connector && \
- ((connector) = (__state)->connectors[__i].ptr, \
- (connector_state) = (__state)->connectors[__i].state, 1); \
+ (__i) < (__state)->num_connector && \
+ ((connector) = __drm_atomic_state_connector(__state, __i)->ptr, \
+ (connector_state) = __drm_atomic_state_connector(__state, __i)->state, 1); \
(__i)++) \
for_each_if (connector)
@@ -595,10 +603,10 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
*/
#define for_each_oldnew_connector_in_state(__state, connector, old_connector_state, new_connector_state, __i) \
for ((__i) = 0; \
- (__i) < (__state)->num_connector && \
- ((connector) = (__state)->connectors[__i].ptr, \
- (old_connector_state) = (__state)->connectors[__i].old_state, \
- (new_connector_state) = (__state)->connectors[__i].new_state, 1); \
+ (__i) < (__state)->num_connector && \
+ ((connector) = __drm_atomic_state_connector(__state, __i)->ptr, \
+ (old_connector_state) = __drm_atomic_state_connector(__state, __i)->old_state, \
+ (new_connector_state) = __drm_atomic_state_connector(__state, __i)->new_state, 1); \
(__i)++) \
for_each_if (connector)
@@ -616,9 +624,9 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
*/
#define for_each_old_connector_in_state(__state, connector, old_connector_state, __i) \
for ((__i) = 0; \
- (__i) < (__state)->num_connector && \
- ((connector) = (__state)->connectors[__i].ptr, \
- (old_connector_state) = (__state)->connectors[__i].old_state, 1); \
+ (__i) < (__state)->num_connector && \
+ ((connector) = __drm_atomic_state_connector(__state, __i)->ptr, \
+ (old_connector_state) = __drm_atomic_state_connector(__state, __i)->old_state, 1); \
(__i)++) \
for_each_if (connector)
@@ -637,8 +645,8 @@ void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
#define for_each_new_connector_in_state(__state, connector, new_connector_state, __i) \
for ((__i) = 0; \
(__i) < (__state)->num_connector && \
- ((connector) = (__state)->connectors[__i].ptr, \
- (new_connector_state) = (__state)->connectors[__i].new_state, 1); \
+ ((connector) = __drm_atomic_state_connector(__state, __i)->ptr, \
+ (new_connector_state) = __drm_atomic_state_connector(__state, __i)->new_state, 1); \
(__i)++) \
for_each_if (connector)
--
2.13.0
More information about the dri-devel
mailing list