[Intel-gfx] [PATCH 1/2] drm/i915: prepare for multiple power wells
Paulo Zanoni
przanoni at gmail.com
Wed Oct 23 15:56:09 CEST 2013
2013/10/22 Imre Deak <imre.deak at intel.com>:
> In the future we'll need to support multiple power wells, so prepare for
> that here. Create a new power domains struct which contains all
> power domain/well specific fields. Since we'll have one lock protecting
> all power wells, move power_well->lock to the new struct too.
>
> No functional change.
>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 11 ++++++---
> drivers/gpu/drm/i915/intel_pm.c | 55 +++++++++++++++++++++++++----------------
> 2 files changed, 42 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 80957ca..7315095 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -911,12 +911,18 @@ struct intel_ilk_power_mgmt {
> /* Power well structure for haswell */
> struct i915_power_well {
> struct drm_device *device;
Can't we also move "device" to i915_power_domains?
> - struct mutex lock;
> /* power well enable/disable usage count */
> int count;
> int i915_request;
> };
>
> +#define I915_MAX_POWER_WELLS 1
How about this?
enum intel_power_wells {
HASWELL_POWER_WELL = 0, /* Or any other more creative name,
since I guess we'll have an equivalent power well on other gens */
I915_MAX_POWER_WELLS,
};
And then you switch all the code below that uses index zero for the
actual enum name.
Maybe "NON_LPSP_POWER_WELL = 0" since the docs describe LPSP (Low
Power Single Pipe) as a feature that is enabled when the power well is
disabled. Feel free to invent better names :)
> +
> +struct i915_power_domains {
> + struct mutex lock;
> + struct i915_power_well power_wells[I915_MAX_POWER_WELLS];
> +};
> +
> struct i915_dri1_state {
> unsigned allow_batchbuffer : 1;
> u32 __iomem *gfx_hws_cpu_addr;
> @@ -1412,8 +1418,7 @@ typedef struct drm_i915_private {
> * mchdev_lock in intel_pm.c */
> struct intel_ilk_power_mgmt ips;
>
> - /* Haswell power well */
> - struct i915_power_well power_well;
> + struct i915_power_domains power_domains;
>
> struct i915_psr psr;
>
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 3e140ab..09ca6f9 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -5625,7 +5625,7 @@ void intel_display_power_get(struct drm_device *dev,
> enum intel_display_power_domain domain)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - struct i915_power_well *power_well = &dev_priv->power_well;
> + struct i915_power_domains *power_domains;
>
> if (!HAS_POWER_WELL(dev))
> return;
> @@ -5633,16 +5633,18 @@ void intel_display_power_get(struct drm_device *dev,
> if (is_always_on_power_domain(dev, domain))
> return;
>
> - mutex_lock(&power_well->lock);
> - __intel_power_well_get(power_well);
> - mutex_unlock(&power_well->lock);
> + power_domains = &dev_priv->power_domains;
> +
> + mutex_lock(&power_domains->lock);
> + __intel_power_well_get(&power_domains->power_wells[0]);
> + mutex_unlock(&power_domains->lock);
> }
>
> void intel_display_power_put(struct drm_device *dev,
> enum intel_display_power_domain domain)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - struct i915_power_well *power_well = &dev_priv->power_well;
> + struct i915_power_domains *power_domains;
>
> if (!HAS_POWER_WELL(dev))
> return;
> @@ -5650,12 +5652,14 @@ void intel_display_power_put(struct drm_device *dev,
> if (is_always_on_power_domain(dev, domain))
> return;
>
> - mutex_lock(&power_well->lock);
> - __intel_power_well_put(power_well);
> - mutex_unlock(&power_well->lock);
> + power_domains = &dev_priv->power_domains;
> +
> + mutex_lock(&power_domains->lock);
> + __intel_power_well_put(&power_domains->power_wells[0]);
> + mutex_unlock(&power_domains->lock);
> }
>
> -static struct i915_power_well *hsw_pwr;
> +static struct i915_power_domains *hsw_pwr;
>
> /* Display audio driver power well request */
> void i915_request_power_well(void)
> @@ -5664,7 +5668,7 @@ void i915_request_power_well(void)
> return;
>
> mutex_lock(&hsw_pwr->lock);
> - __intel_power_well_get(hsw_pwr);
> + __intel_power_well_get(&hsw_pwr->power_wells[0]);
> mutex_unlock(&hsw_pwr->lock);
> }
> EXPORT_SYMBOL_GPL(i915_request_power_well);
> @@ -5676,7 +5680,7 @@ void i915_release_power_well(void)
> return;
>
> mutex_lock(&hsw_pwr->lock);
> - __intel_power_well_put(hsw_pwr);
> + __intel_power_well_put(&hsw_pwr->power_wells[0]);
> mutex_unlock(&hsw_pwr->lock);
> }
> EXPORT_SYMBOL_GPL(i915_release_power_well);
> @@ -5684,12 +5688,15 @@ EXPORT_SYMBOL_GPL(i915_release_power_well);
> int i915_init_power_well(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> + struct i915_power_domains *power_domains = &dev_priv->power_domains;
> + struct i915_power_well *power_well;
>
> - hsw_pwr = &dev_priv->power_well;
> + mutex_init(&power_domains->lock);
> + hsw_pwr = power_domains;
>
> - hsw_pwr->device = dev;
> - mutex_init(&hsw_pwr->lock);
> - hsw_pwr->count = 0;
> + power_well = &power_domains->power_wells[0];
> + power_well->device = dev;
> + power_well->count = 0;
How about this?
for (i = 0; i < I915_MAX_POWER_WELLS; i++) {
power_well = &power_domains->power_wells[0];
power_well->device = dev; /* If you don't move this to the
power_domains struct. */
power_well->count = 0;
}
Then we'll always be safe :)
With or without my 3 bikesheds (although I would really like to see them):
Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
By the way, do you also plan to change some functions so they take
struct i915_power_well (or an index representing the power well
number) as a parameter? E.g., intel_set_power_well.
>
> return 0;
> }
> @@ -5702,7 +5709,8 @@ void i915_remove_power_well(struct drm_device *dev)
> void intel_set_power_well(struct drm_device *dev, bool enable)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - struct i915_power_well *power_well = &dev_priv->power_well;
> + struct i915_power_domains *power_domains = &dev_priv->power_domains;
> + struct i915_power_well *power_well;
>
> if (!HAS_POWER_WELL(dev))
> return;
> @@ -5710,8 +5718,9 @@ void intel_set_power_well(struct drm_device *dev, bool enable)
> if (!i915_disable_power_well && !enable)
> return;
>
> - mutex_lock(&power_well->lock);
> + mutex_lock(&power_domains->lock);
>
> + power_well = &power_domains->power_wells[0];
> /*
> * This function will only ever contribute one
> * to the power well reference count. i915_request
> @@ -5729,20 +5738,24 @@ void intel_set_power_well(struct drm_device *dev, bool enable)
> __intel_power_well_put(power_well);
>
> out:
> - mutex_unlock(&power_well->lock);
> + mutex_unlock(&power_domains->lock);
> }
>
> static void intel_resume_power_well(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - struct i915_power_well *power_well = &dev_priv->power_well;
> + struct i915_power_domains *power_domains = &dev_priv->power_domains;
> + struct i915_power_well *power_well;
>
> if (!HAS_POWER_WELL(dev))
> return;
>
> - mutex_lock(&power_well->lock);
> + mutex_lock(&power_domains->lock);
> +
> + power_well = &power_domains->power_wells[0];
> __intel_set_power_well(dev, power_well->count > 0);
> - mutex_unlock(&power_well->lock);
> +
> + mutex_unlock(&power_domains->lock);
> }
>
> /*
> --
> 1.8.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Paulo Zanoni
More information about the Intel-gfx
mailing list