Commit f5de6e07 authored by Ander Conselvan de Oliveira's avatar Ander Conselvan de Oliveira Committed by Daniel Vetter

drm/i915: Improve how the memory for crtc state is allocated

The previous patch changed the config field in intel_crtc to a pointer,
but to keep the mechanical changes (done with spatch) separate from the
new code, the pointer was made to point to a new _config field with type
struct intel_crtc_state added to that struct. This patch improves that
code by getting rid of that field, allocating a state struct in
intel_crtc_init() a keeping it properly updated when a mode set
happens.

v2: Manual changes split from previous patch. (Matt)
    Don't leak the current state when the crtc is destroyed (Matt)
Signed-off-by: default avatarAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
[danvet: Squash in fixup from Matt Roper for driver unload.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 6e3c9717
...@@ -8926,6 +8926,13 @@ void intel_mark_idle(struct drm_device *dev) ...@@ -8926,6 +8926,13 @@ void intel_mark_idle(struct drm_device *dev)
intel_runtime_pm_put(dev_priv); intel_runtime_pm_put(dev_priv);
} }
static void intel_crtc_set_state(struct intel_crtc *crtc,
struct intel_crtc_state *crtc_state)
{
kfree(crtc->config);
crtc->config = crtc_state;
}
static void intel_crtc_destroy(struct drm_crtc *crtc) static void intel_crtc_destroy(struct drm_crtc *crtc)
{ {
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
...@@ -8942,6 +8949,7 @@ static void intel_crtc_destroy(struct drm_crtc *crtc) ...@@ -8942,6 +8949,7 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
kfree(work); kfree(work);
} }
intel_crtc_set_state(intel_crtc, NULL);
drm_crtc_cleanup(crtc); drm_crtc_cleanup(crtc);
kfree(intel_crtc); kfree(intel_crtc);
...@@ -10995,8 +11003,7 @@ static int __intel_set_mode(struct drm_crtc *crtc, ...@@ -10995,8 +11003,7 @@ static int __intel_set_mode(struct drm_crtc *crtc,
crtc->mode = *mode; crtc->mode = *mode;
/* mode_set/enable/disable functions rely on a correct pipe /* mode_set/enable/disable functions rely on a correct pipe
* config. */ * config. */
(*(to_intel_crtc(crtc)->config)) = *pipe_config; intel_crtc_set_state(to_intel_crtc(crtc), pipe_config);
to_intel_crtc(crtc)->new_config = to_intel_crtc(crtc)->config;
/* /*
* Calculate and store various constants which * Calculate and store various constants which
...@@ -11040,7 +11047,6 @@ static int __intel_set_mode(struct drm_crtc *crtc, ...@@ -11040,7 +11047,6 @@ static int __intel_set_mode(struct drm_crtc *crtc,
if (ret && crtc->enabled) if (ret && crtc->enabled)
crtc->mode = *saved_mode; crtc->mode = *saved_mode;
kfree(pipe_config);
kfree(saved_mode); kfree(saved_mode);
return ret; return ret;
} }
...@@ -12186,6 +12192,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) ...@@ -12186,6 +12192,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc; struct intel_crtc *intel_crtc;
struct intel_crtc_state *crtc_state = NULL;
struct drm_plane *primary = NULL; struct drm_plane *primary = NULL;
struct drm_plane *cursor = NULL; struct drm_plane *cursor = NULL;
int i, ret; int i, ret;
...@@ -12194,6 +12201,11 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) ...@@ -12194,6 +12201,11 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
if (intel_crtc == NULL) if (intel_crtc == NULL)
return; return;
crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
if (!crtc_state)
goto fail;
intel_crtc_set_state(intel_crtc, crtc_state);
primary = intel_primary_plane_create(dev, pipe); primary = intel_primary_plane_create(dev, pipe);
if (!primary) if (!primary)
goto fail; goto fail;
...@@ -12239,7 +12251,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) ...@@ -12239,7 +12251,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe); WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);
intel_crtc->config = &intel_crtc->_config;
return; return;
fail: fail:
...@@ -12247,6 +12258,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) ...@@ -12247,6 +12258,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
drm_plane_cleanup(primary); drm_plane_cleanup(primary);
if (cursor) if (cursor)
drm_plane_cleanup(cursor); drm_plane_cleanup(cursor);
kfree(crtc_state);
kfree(intel_crtc); kfree(intel_crtc);
} }
......
...@@ -469,7 +469,6 @@ struct intel_crtc { ...@@ -469,7 +469,6 @@ struct intel_crtc {
uint32_t cursor_base; uint32_t cursor_base;
struct intel_plane_config plane_config; struct intel_plane_config plane_config;
struct intel_crtc_state _config;
struct intel_crtc_state *config; struct intel_crtc_state *config;
struct intel_crtc_state *new_config; struct intel_crtc_state *new_config;
bool new_enabled; bool new_enabled;
......
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