Skip to content

Commit

Permalink
drm/i915: Convert bandwidth state to global state
Browse files Browse the repository at this point in the history
Now that we have the more formal global state thing let's
use if for memory bandwidth tracking. No real difference
to the current private object usage since we already
tried to avoid taking the single serializing lock needlessly.
But since we're going to roll the global state out to more
things probably a good idea to unify the approaches a bit.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200120174728.21095-16-ville.syrjala@linux.intel.com
Reviewed-by: Imre Deak <imre.deak@intel.com>
  • Loading branch information
Ville Syrjälä committed Jan 31, 2020
1 parent 0ef1905 commit fd1a9bb
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 22 deletions.
31 changes: 14 additions & 17 deletions drivers/gpu/drm/i915/display/intel_bw.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,10 +377,9 @@ static struct intel_bw_state *
intel_atomic_get_bw_state(struct intel_atomic_state *state)
{
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct drm_private_state *bw_state;
struct intel_global_state *bw_state;

bw_state = drm_atomic_get_private_obj_state(&state->base,
&dev_priv->bw_obj);
bw_state = intel_atomic_get_global_obj_state(state, &dev_priv->bw_obj);
if (IS_ERR(bw_state))
return ERR_CAST(bw_state);

Expand All @@ -395,7 +394,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
unsigned int data_rate, max_data_rate;
unsigned int num_active_planes;
struct intel_crtc *crtc;
int i;
int i, ret;

/* FIXME earlier gens need some checks too */
if (INTEL_GEN(dev_priv) < 11)
Expand Down Expand Up @@ -437,6 +436,10 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
if (!bw_state)
return 0;

ret = intel_atomic_lock_global_state(&bw_state->base);
if (ret)
return ret;

data_rate = intel_bw_data_rate(dev_priv, bw_state);
num_active_planes = intel_bw_num_active_planes(dev_priv, bw_state);

Expand All @@ -454,26 +457,25 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
return 0;
}

static struct drm_private_state *intel_bw_duplicate_state(struct drm_private_obj *obj)
static struct intel_global_state *
intel_bw_duplicate_state(struct intel_global_obj *obj)
{
struct intel_bw_state *state;

state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
if (!state)
return NULL;

__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);

return &state->base;
}

static void intel_bw_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
static void intel_bw_destroy_state(struct intel_global_obj *obj,
struct intel_global_state *state)
{
kfree(state);
}

static const struct drm_private_state_funcs intel_bw_funcs = {
static const struct intel_global_state_funcs intel_bw_funcs = {
.atomic_duplicate_state = intel_bw_duplicate_state,
.atomic_destroy_state = intel_bw_destroy_state,
};
Expand All @@ -486,13 +488,8 @@ int intel_bw_init(struct drm_i915_private *dev_priv)
if (!state)
return -ENOMEM;

drm_atomic_private_obj_init(&dev_priv->drm, &dev_priv->bw_obj,
&state->base, &intel_bw_funcs);
intel_atomic_global_obj_init(dev_priv, &dev_priv->bw_obj,
&state->base, &intel_bw_funcs);

return 0;
}

void intel_bw_cleanup(struct drm_i915_private *dev_priv)
{
drm_atomic_private_obj_fini(&dev_priv->bw_obj);
}
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/display/intel_bw.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@
#include <drm/drm_atomic.h>

#include "intel_display.h"
#include "intel_global_state.h"

struct drm_i915_private;
struct intel_atomic_state;
struct intel_crtc_state;

struct intel_bw_state {
struct drm_private_state base;
struct intel_global_state base;

unsigned int data_rate[I915_MAX_PIPES];
u8 num_active_planes[I915_MAX_PIPES];
Expand All @@ -25,7 +26,6 @@ struct intel_bw_state {

void intel_bw_init_hw(struct drm_i915_private *dev_priv);
int intel_bw_init(struct drm_i915_private *dev_priv);
void intel_bw_cleanup(struct drm_i915_private *dev_priv);
int intel_bw_atomic_check(struct intel_atomic_state *state);
void intel_bw_crtc_update(struct intel_bw_state *bw_state,
const struct intel_crtc_state *crtc_state);
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/i915/display/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -18822,8 +18822,6 @@ void intel_modeset_driver_remove(struct drm_i915_private *i915)

intel_gmbus_teardown(i915);

intel_bw_cleanup(i915);

destroy_workqueue(i915->flip_wq);
destroy_workqueue(i915->modeset_wq);

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1249,7 +1249,7 @@ struct drm_i915_private {
u8 num_planes;
} max_bw[6];

struct drm_private_obj bw_obj;
struct intel_global_obj bw_obj;

struct intel_runtime_pm runtime_pm;

Expand Down

0 comments on commit fd1a9bb

Please sign in to comment.