[Intel-gfx] [PATCH 3/3] drm/i915: Program PFI credits for VLV
Vandana Kannan
vandana.kannan at intel.com
Mon Aug 18 11:14:45 CEST 2014
Hi Ville,
Apologize for the delay in reply.
For your inputs on the programming side (modeset global resources
handling and self documenting code parts), I agree with you and will
make the changes.
For opens related to info on the feature, internal discussions are
ongoing. I will get back to you on them next week..
Thanks,
Vandana
On Aug-08-2014 6:33 PM, Ville Syrjälä wrote:
> On Thu, Aug 07, 2014 at 06:40:03PM +0530, Vandana Kannan wrote:
>> From: Vidya Srinivas <vidya.srinivas at intel.com>
>>
>> PFI credit programming is required when CD clock (related to data flow from
>> display pipeline to end display) is greater than CZ clock (related to data
>> flow from memory to display plane). This programming should be done when all
>> planes are OFF to avoid intermittent hangs while accessing memory even from
>> different Gfx units (not just display).
>>
>> If cdclk/czclk >=1, PFI credits could be set as any number. To get better
>> performance, larger PFI credit can be assigned to PND. Otherwise if
>> cdclk/czclk<1, the default PFI credit of 8 should be set.
>
> Do we have any docs for this? I see the register in the docs but nothing
> about the correct programming. Some kind of refrence to the used
> documentation would be nice.
>
>>
>> v2:
>> - Change log to lower log level instead of DRM_ERROR
>> - Change function name to valleyview_program_pfi_credits
>> - Move program PFI credits to modeset_init instead of intel_set_mode
>> - Change magic numbers to logical constants
>>
>> Signed-off-by: Vidya Srinivas <vidya.srinivas at intel.com>
>> Signed-off-by: Gajanan Bhat <gajanan.bhat at intel.com>
>> Signed-off-by: Vandana Kannan <vandana.kannan at intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_drv.c | 6 ++++++
>> drivers/gpu/drm/i915/i915_drv.h | 2 ++
>> drivers/gpu/drm/i915/i915_reg.h | 5 +++++
>> drivers/gpu/drm/i915/intel_display.c | 4 +++-
>> drivers/gpu/drm/i915/intel_pm.c | 22 ++++++++++++++++++++++
>> 5 files changed, 38 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
>> index 6c4b25c..00e0b4a 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -558,6 +558,9 @@ static int i915_drm_freeze(struct drm_device *dev)
>> intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED);
>> console_unlock();
>>
>> + if (IS_VALLEYVIEW(dev))
>> + valleyview_program_pfi_credits(dev_priv, false);
>
> If we want to do this for system suspend I think we should stick it
> into i915_drm_freeze() (just after turning off the pipes). Not sure if
> we should also force cdclk to minimum there...
>
> Hmm. Is the GCI_CONTROL register is part of the disp2d power well? If it
> is we probably need to enable the power well around the register write.
>
>> +
>> dev_priv->suspend_count++;
>>
>> intel_display_set_init_power(dev_priv, false);
>> @@ -693,6 +696,9 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
>> dev_priv->modeset_restore = MODESET_DONE;
>> mutex_unlock(&dev_priv->modeset_restore_lock);
>>
>> + if (IS_VALLEYVIEW(dev))
>> + valleyview_program_pfi_credits(dev_priv, true);
>
> I think this thing can be dropped. We need to do the reprogramming as
> part of the modeset global resources handling.
>
>> +
>> intel_opregion_notify_adapter(dev, PCI_D0);
>>
>> return 0;
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index 881e0a6..88fd4c7 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -2172,6 +2172,8 @@ extern struct i915_params i915 __read_mostly;
>>
>> /* i915_dma.c */
>> void i915_update_dri1_breadcrumb(struct drm_device *dev);
>> +extern void valleyview_program_pfi_credits(struct drm_i915_private *dev_priv,
>> + bool flag);
>> extern void i915_kernel_lost_context(struct drm_device * dev);
>> extern int i915_driver_load(struct drm_device *, unsigned long flags);
>> extern int i915_driver_unload(struct drm_device *);
>> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
>> index fb111cd..7f4c2f5 100644
>> --- a/drivers/gpu/drm/i915/i915_reg.h
>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>> @@ -1937,6 +1937,11 @@ enum punit_power_well {
>> #define CZCLK_FREQ_MASK 0xf
>> #define GMBUSFREQ_VLV (VLV_DISPLAY_BASE + 0x6510)
>>
>> +#define GCI_CONTROL (VLV_DISPLAY_BASE + 0x650C)
>> +#define PFI_CREDIT (7 << 28)
>
> Maybe something like this for a bit more self documenting code.
>
> #define PFI_CREDIT(x) (((x)-8) << 28) /* 8-15 */
>
>> +#define PFI_CREDIT_RESEND (1 << 27)
>> +#define VGA_FAST_MODE_DISABLE (1 << 14)
>> +
>> /*
>> * Palette regs
>> */
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index 2089319..2af2e60 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -12691,8 +12691,10 @@ void intel_modeset_init_hw(struct drm_device *dev)
>> {
>> intel_prepare_ddi(dev);
>>
>> - if (IS_VALLEYVIEW(dev))
>> + if (IS_VALLEYVIEW(dev)) {
>> vlv_update_cdclk(dev);
>> + valleyview_program_pfi_credits(dev->dev_private, true);
>
> The planes may be be active here. So for the initial state we just need
> to trust that the BIOS got it right.
>
> For runtime cdclk changes this needs to be handled in
> valleyview_modeset_global_resources().
>
>> + }
>>
>> intel_init_clock_gating(dev);
>>
>> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
>> index ba8dfeb..ad8e190 100644
>> --- a/drivers/gpu/drm/i915/intel_pm.c
>> +++ b/drivers/gpu/drm/i915/intel_pm.c
>> @@ -7154,6 +7154,28 @@ void intel_fini_runtime_pm(struct drm_i915_private *dev_priv)
>> pm_runtime_disable(device);
>> }
>>
>> +void valleyview_program_pfi_credits(struct drm_i915_private *dev_priv,
>> + bool flag)
>> +{
>> + int cd_clk, cz_clk;
>> +
>> + if (!flag) {
>> + I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE);
>> + return;
>> + }
>> +
>> + cd_clk = dev_priv->display.get_display_clock_speed(dev_priv->dev);
>> + cz_clk = valleyview_get_cz_clock_speed(dev_priv->dev);
>> +
>> + if (cd_clk >= cz_clk) {
>> + /* WA - write default credits before re-programming */
>> + I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE);
>
> Why do you write just the vga fast mode disable bit first?
>
>> + I915_WRITE(GCI_CONTROL, (PFI_CREDIT | PFI_CREDIT_RESEND |
>> + VGA_FAST_MODE_DISABLE));
>> + } else
>> + DRM_DEBUG_KMS("cd clk < cz clk");
>
> So we never reprogram the credits for the cd<cz case? Shouldn't we have
> something like this here?
> I915_WRITE(GCI_CONTROL, PFI_CREDIT(8) | PFI_CREDIT_RESEND | VGA_FAST_MODE_DISABLE);
>
> Also does the PFI_CREDIT_RESEND bit get cleared immediately by the
> hardware or do we have to poll for it to clear?
>
>> +}
>> +
>> /* Set up chip specific power management-related functions */
>> void intel_init_pm(struct drm_device *dev)
>> {
>> --
>> 2.0.1
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
More information about the Intel-gfx
mailing list