[Intel-gfx] [PATCH 4/4] drm/i915: Decouple I915_NUM_PLLS from PLL IDs
Jani Nikula
jani.nikula at linux.intel.com
Thu Sep 22 15:55:37 UTC 2022
On Wed, 21 Sep 2022, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Stop assuming the size of PLL ID based bitmask is restricted
> to I915_NUM_PLLS bits. This is the last thing coupling the
> two things together and thus artificially limiting PLL IDs.
>
> We could just pass any arbitrary (large enough) size to
> for_each_set_bit() and be done with it, but the WARN
> requiring the caller to not pass in a bogus bitmask seems
> potentially useful to keep around. So let's just calculate
> the full bitmask on the spot.
>
> And while at it let's assert that the PLL IDs will fit
> into the bitmask we use for them.
>
> TODO: could also get rid of I915_NUM_PLLS entirely and just
> dynamically allocate i915->shared_dplls[] and state->shared_dpll[].
> But that would involve error handling in the modeset init path. Uff.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 24 +++++++++++++++++--
> 1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> index fb09029cc4aa..ee04b63d2696 100644
> --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> @@ -315,6 +315,21 @@ void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state)
> mutex_unlock(&dev_priv->display.dpll.lock);
> }
>
> +static unsigned long
> +intel_dpll_mask_all(struct drm_i915_private *i915)
> +{
> + unsigned long dpll_mask = 0;
> + int i;
> +
> + for (i = 0; i < i915->display.dpll.num_shared_dpll; i++) {
> + struct intel_shared_dpll *pll = &i915->display.dpll.shared_dplls[i];
> +
> + dpll_mask |= BIT(pll->info->id);
> + }
> +
> + return dpll_mask;
> +}
> +
> static struct intel_shared_dpll *
> intel_find_shared_dpll(struct intel_atomic_state *state,
> const struct intel_crtc *crtc,
> @@ -322,15 +337,16 @@ intel_find_shared_dpll(struct intel_atomic_state *state,
> unsigned long dpll_mask)
> {
> struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + unsigned long dpll_mask_all = intel_dpll_mask_all(dev_priv);
> struct intel_shared_dpll_state *shared_dpll;
> struct intel_shared_dpll *unused_pll = NULL;
> enum intel_dpll_id id;
>
> shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
>
> - drm_WARN_ON(&dev_priv->drm, dpll_mask & ~(BIT(I915_NUM_PLLS) - 1));
> + drm_WARN_ON(&dev_priv->drm, dpll_mask & ~dpll_mask_all);
>
> - for_each_set_bit(id, &dpll_mask, I915_NUM_PLLS) {
> + for_each_set_bit(id, &dpll_mask, fls(dpll_mask_all)) {
> struct intel_shared_dpll *pll;
> int i;
>
> @@ -4234,6 +4250,10 @@ void intel_shared_dpll_init(struct drm_i915_private *dev_priv)
> i >= ARRAY_SIZE(dev_priv->display.dpll.shared_dplls)))
> break;
Would be nice to add
unsigned long dpll_mask;
drm_WARN_ON(&dev_priv->drm, dpll_mask & BIT(pll->info->id));
dpll_mask |= BIT(pll->info->id);
to check for collisions.
>
> + /* must fit into unsigned long bitmask on 32bit */
> + if (drm_WARN_ON(&dev_priv->drm, dpll_info[i].id >= 32))
BITS_PER_TYPE(dpll_mask) instead of 32? Of course would only hit this
when actually running a 32-bit build.
Regardless,
Reviewed-by: Jani Nikula <jani.nikula at intel.com>
> + break;
> +
> dev_priv->display.dpll.shared_dplls[i].info = &dpll_info[i];
> }
--
Jani Nikula, Intel Open Source Graphics Center
More information about the Intel-gfx
mailing list