[Intel-gfx] [PATCH 16/21] drm/i915: Markup paired operations on display power domains

Mika Kuoppala mika.kuoppala at linux.intel.com
Thu Jan 10 16:49:50 UTC 2019


Chris Wilson <chris at chris-wilson.co.uk> writes:

> Quoting Mika Kuoppala (2019-01-10 15:51:33)
>> Chris Wilson <chris at chris-wilson.co.uk> writes:
>> > @@ -680,6 +682,8 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
>> >       wakeref = intel_runtime_pm_get(dev_priv);
>> >  
>> >       if (IS_CHERRYVIEW(dev_priv)) {
>> > +             intel_wakeref_t pref;
>> > +
>> 
>> In here you are introducing a new, descriptive, power reference for display.
>> But then you drop it after using it twice. And can't seem to find
>> reason for inconsistency.
>
> pref, pref, pref...
>
>> >               seq_printf(m, "Master Interrupt Control:\t%08x\n",
>> >                          I915_READ(GEN8_MASTER_IRQ));
>> >  
>> > @@ -695,8 +699,9 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
>> >                       enum intel_display_power_domain power_domain;
>> >  
>> >                       power_domain = POWER_DOMAIN_PIPE(pipe);
>> > -                     if (!intel_display_power_get_if_enabled(dev_priv,
>> > -                                                             power_domain)) {
>> > +                     pref = intel_display_power_get_if_enabled(dev_priv,
>> > +                                                               power_domain);
>> > +                     if (!pref) {
>
> ah, it would have been chosen to fit 80cols.

You should have adopted it then fully! :)
>
>> >                               seq_printf(m, "Pipe %c power disabled\n",
>> >                                          pipe_name(pipe));
>> >                               continue;
>> > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> > index f0a405604b75..44c1b21febba 100644
>> > --- a/drivers/gpu/drm/i915/i915_drv.h
>> > +++ b/drivers/gpu/drm/i915/i915_drv.h
>> > @@ -344,6 +344,7 @@ struct intel_csr {
>> >       uint32_t mmiodata[8];
>> >       uint32_t dc_state;
>> >       uint32_t allowed_dc_mask;
>> > +     intel_wakeref_t wakeref;
>> >  };
>> >  
>> >  enum i915_cache_level {
>> > @@ -1982,6 +1983,7 @@ struct drm_i915_private {
>> >                * is a slight delay before we do so.
>> >                */
>> >               intel_wakeref_t awake;
>> > +             intel_wakeref_t power;
>> 
>> This prolly explains the prefs above :)
>
> Possibly.
>
>> > -     intel_display_power_put(dev_priv, POWER_DOMAIN_PORT_DDI_A_IO);
>> > -
>> > -     if (intel_dsi->dual_link)
>> > -             intel_display_power_put(dev_priv, POWER_DOMAIN_PORT_DDI_B_IO);
>> > +     for_each_dsi_port(port, intel_dsi->ports) {
>> > +             intel_wakeref_t wakeref;
>> > +
>> > +             wakeref = fetch_and_zero(&intel_dsi->io_wakeref[port]);
>> > +             if (wakeref) {
>> > +                     intel_display_power_put(dev_priv,
>> > +                                             port == PORT_A ?
>> > +                                             POWER_DOMAIN_PORT_DDI_A_IO :
>> > +                                             POWER_DOMAIN_PORT_DDI_B_IO,
>> > +                                             wakeref);
>> > +             }
>> > +     }
>> 
>> Ok, well. I have been trying to figure out what really is going on here.
>> 
>> First it seems that you fix a bug. We take refs for each dsi port but
>> only release once special casing 'dual_link' without this patch.
>> 
>> Second, all the hw access is before getting the refs, looking
>> suspicious.
>
> There's always been two, just this moves into a for(;;). I don't think
> it was buggy, but I do think the for(;;) has the advantage of being
> clearer that it operates over all the ports and wakerefs.

Agreed that your patch makes it more clear.

I am still suspicious about the ordering, hopefully there is
upper lever pdomain to cover access. But that is not
problem for this patch.

Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>

>
>> > @@ -15808,12 +15827,13 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
>> >                            struct drm_modeset_acquire_ctx *ctx)
>> >  {
>> >       struct drm_i915_private *dev_priv = to_i915(dev);
>> > -     struct intel_crtc *crtc;
>> >       struct intel_crtc_state *crtc_state;
>> >       struct intel_encoder *encoder;
>> > +     struct intel_crtc *crtc;
>> 
>> Not that I mind but I don't understand the reasoning
>> behind the change of order on this and on few other places in this
>> patch.
>
> Just quietly moving everyone over to a tidy set of variable definitions
> (we are not meant to grow Christmas trees as part of the kernel coding
> style).
>
>> > -/**
>> > - * intel_display_power_put - release a power domain reference
>> > - * @dev_priv: i915 device instance
>> > - * @domain: power domain to reference
>> > - *
>> > - * This function drops the power domain reference obtained by
>> > - * intel_display_power_get() and might power down the corresponding hardware
>> > - * block right away if this is the last reference.
>> > - */
>> > -void intel_display_power_put(struct drm_i915_private *dev_priv,
>> > -                          enum intel_display_power_domain domain)
>> > +static void __intel_display_power_put(struct drm_i915_private *dev_priv,
>> > +                                   enum intel_display_power_domain domain)
>> >  {
>> >       struct i915_power_domains *power_domains;
>> >       struct i915_power_well *power_well;
>> > @@ -1947,10 +1944,34 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
>> >               intel_power_well_put(dev_priv, power_well);
>> >  
>> >       mutex_unlock(&power_domains->lock);
>> > +}
>> >  
>> > +/**
>> > + * intel_display_power_put - release a power domain reference
>> 
>> +unchecked? or is this in wrong place.
>
> unchecked doesn't exist, you just need a stronger pair of glasses.
>
> So the only API documented interface is the full version that requires
> you take ownership of your wakeref, we don't tempt you with the easy
> version that is meant to only exist for transitioning
> -Chris


More information about the Intel-gfx mailing list