Skip to content

Commit

Permalink
drm/i915: Store active_pipes bitmask in cdclk state
Browse files Browse the repository at this point in the history
Let's add a copy of the active_pipes bitmask into the cdclk_state.
While this is duplicating a bit of information we may already
have elsewhere, I think it's worth it to decopule the cdclk stuff
from whatever else wants to use that bitmask. Also we want to get
rid of all the old ad-hoc global state which is what the current
bitmask is, so this removes one obstacle.

The one extra thing we have to remember is write locking the cdclk
state whenever the bitmask changes.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200120174728.21095-19-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 28a30b4 commit 0c2d551
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
20 changes: 11 additions & 9 deletions drivers/gpu/drm/i915/display/intel_cdclk.c
Original file line number Diff line number Diff line change
Expand Up @@ -2142,7 +2142,7 @@ static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
cdclk_state->logical.voltage_level =
vlv_calc_voltage_level(dev_priv, cdclk);

if (!state->active_pipes) {
if (!cdclk_state->active_pipes) {
cdclk = vlv_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);

cdclk_state->actual.cdclk = cdclk;
Expand All @@ -2157,7 +2157,6 @@ static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)

static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
{
struct intel_atomic_state *state = cdclk_state->base.state;
int min_cdclk, cdclk;

min_cdclk = intel_compute_min_cdclk(cdclk_state);
Expand All @@ -2174,7 +2173,7 @@ static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
cdclk_state->logical.voltage_level =
bdw_calc_voltage_level(cdclk);

if (!state->active_pipes) {
if (!cdclk_state->active_pipes) {
cdclk = bdw_calc_cdclk(cdclk_state->force_min_cdclk);

cdclk_state->actual.cdclk = cdclk;
Expand Down Expand Up @@ -2226,7 +2225,6 @@ static int skl_dpll0_vco(struct intel_cdclk_state *cdclk_state)

static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
{
struct intel_atomic_state *state = cdclk_state->base.state;
int min_cdclk, cdclk, vco;

min_cdclk = intel_compute_min_cdclk(cdclk_state);
Expand All @@ -2246,7 +2244,7 @@ static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
cdclk_state->logical.voltage_level =
skl_calc_voltage_level(cdclk);

if (!state->active_pipes) {
if (!cdclk_state->active_pipes) {
cdclk = skl_calc_cdclk(cdclk_state->force_min_cdclk, vco);

cdclk_state->actual.vco = vco;
Expand Down Expand Up @@ -2283,7 +2281,7 @@ static int bxt_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
max_t(int, min_voltage_level,
dev_priv->display.calc_voltage_level(cdclk));

if (!state->active_pipes) {
if (!cdclk_state->active_pipes) {
cdclk = bxt_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);

Expand Down Expand Up @@ -2419,6 +2417,9 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)

old_cdclk_state = intel_atomic_get_old_cdclk_state(state);

new_cdclk_state->active_pipes =
intel_calc_active_pipes(state, old_cdclk_state->active_pipes);

ret = dev_priv->display.modeset_calc_cdclk(new_cdclk_state);
if (ret)
return ret;
Expand All @@ -2432,7 +2433,8 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
ret = intel_atomic_serialize_global_state(&new_cdclk_state->base);
if (ret)
return ret;
} else if (intel_cdclk_changed(&old_cdclk_state->logical,
} else if (old_cdclk_state->active_pipes != new_cdclk_state->active_pipes ||
intel_cdclk_changed(&old_cdclk_state->logical,
&new_cdclk_state->logical)) {
ret = intel_atomic_lock_global_state(&new_cdclk_state->base);
if (ret)
Expand All @@ -2441,14 +2443,14 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
return 0;
}

if (is_power_of_2(state->active_pipes) &&
if (is_power_of_2(new_cdclk_state->active_pipes) &&
intel_cdclk_can_cd2x_update(dev_priv,
&old_cdclk_state->actual,
&new_cdclk_state->actual)) {
struct intel_crtc *crtc;
struct intel_crtc_state *crtc_state;

pipe = ilog2(state->active_pipes);
pipe = ilog2(new_cdclk_state->active_pipes);
crtc = intel_get_crtc_for_pipe(dev_priv, pipe);

crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/display/intel_cdclk.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ struct intel_cdclk_state {
/* forced minimum cdclk for glk+ audio w/a */
int force_min_cdclk;
bool force_min_cdclk_changed;

/* bitmask of active pipes */
u8 active_pipes;
};

int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state);
Expand Down
8 changes: 5 additions & 3 deletions drivers/gpu/drm/i915/display/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -7603,6 +7603,7 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
dev_priv->active_pipes &= ~BIT(pipe);
cdclk_state->min_cdclk[pipe] = 0;
cdclk_state->min_voltage_level[pipe] = 0;
cdclk_state->active_pipes &= ~BIT(pipe);

bw_state->data_rate[pipe] = 0;
bw_state->num_active_planes[pipe] = 0;
Expand Down Expand Up @@ -18367,10 +18368,9 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
struct intel_encoder *encoder;
struct intel_connector *connector;
struct drm_connector_list_iter conn_iter;
u8 active_pipes = 0;
int i;

dev_priv->active_pipes = 0;

for_each_intel_crtc(dev, crtc) {
struct intel_crtc_state *crtc_state =
to_intel_crtc_state(crtc->base.state);
Expand All @@ -18386,14 +18386,16 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
crtc->active = crtc_state->hw.active;

if (crtc_state->hw.active)
dev_priv->active_pipes |= BIT(crtc->pipe);
active_pipes |= BIT(crtc->pipe);

drm_dbg_kms(&dev_priv->drm,
"[CRTC:%d:%s] hw state readout: %s\n",
crtc->base.base.id, crtc->base.name,
enableddisabled(crtc_state->hw.active));
}

dev_priv->active_pipes = cdclk_state->active_pipes = active_pipes;

readout_plane_state(dev_priv);

for (i = 0; i < dev_priv->num_shared_dpll; i++) {
Expand Down

0 comments on commit 0c2d551

Please sign in to comment.