diff mbox

[v3] drm/i915: resize the GuC WOPCM for rc6

Message ID 572B4D76.9040708@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dave Gordon May 5, 2016, 1:41 p.m. UTC
On 26/04/2016 10:11, Peter Antoine wrote:
> This patch resizes the GuC WOPCM to so that the GuC and the RC6 memory
> spaces do not overlap.
>
> Issue: https://jira01.devtools.intel.com/browse/VIZ-6638
> Signed-off-by: Peter Antoine <peter.antoine@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_guc_reg.h     | 5 +++--
>   drivers/gpu/drm/i915/intel_guc_loader.c | 6 +++++-
>   2 files changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_reg.h b/drivers/gpu/drm/i915/i915_guc_reg.h
> index 80786d9..6e01238 100644
> --- a/drivers/gpu/drm/i915/i915_guc_reg.h
> +++ b/drivers/gpu/drm/i915/i915_guc_reg.h
> @@ -68,10 +68,11 @@
>   #define GUC_MAX_IDLE_COUNT		_MMIO(0xC3E4)
>   
>   #define GUC_WOPCM_SIZE			_MMIO(0xc050)
> -#define   GUC_WOPCM_SIZE_VALUE  	  (0x80 << 12)	/* 512KB */
> +#define   GUC_WOPCM_SIZE_VALUE		(0x80 << 12)	/* 512KB */
> +#define   BXT_GUC_WOPCM_SIZE_VALUE	(0x70 << 12)	/* 448KB */
>   
>   /* GuC addresses below GUC_WOPCM_TOP don't map through the GTT */
> -#define	GUC_WOPCM_TOP			(GUC_WOPCM_SIZE_VALUE)
> +#define	GUC_WOPCM_TOP			(0x80 << 12)	/* 512KB */
>   
>   #define GEN8_GT_PM_CONFIG		_MMIO(0x138140)
>   #define GEN9LP_GT_PM_CONFIG		_MMIO(0x138140)
> diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
> index fc3ff68..38fb321 100644
> --- a/drivers/gpu/drm/i915/intel_guc_loader.c
> +++ b/drivers/gpu/drm/i915/intel_guc_loader.c
> @@ -312,7 +312,11 @@ static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
>   	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
>   
>   	/* init WOPCM */
> -	I915_WRITE(GUC_WOPCM_SIZE, GUC_WOPCM_SIZE_VALUE);
> +	if (IS_BROXTON(dev))
> +		I915_WRITE(GUC_WOPCM_SIZE, BXT_GUC_WOPCM_SIZE_VALUE);
> +	else
> +		I915_WRITE(GUC_WOPCM_SIZE, GUC_WOPCM_SIZE_VALUE);
> +
>   	I915_WRITE(DMA_GUC_WOPCM_OFFSET, GUC_WOPCM_OFFSET_VALUE);
>   
>   	/* Enable MIA caching. GuC clock gating is disabled. */

So, this gives the right result, but doesn't really show or explain why 
we have different values, or how the values are arrived at; they're just 
more magic numbers. Also, in the loader there's a check on the firmware 
size that uses different values. So I'd rather prefer the unified 
approach in the attached version ...

.Dave.
From fa0f5e514eea4342933e237e693ea547b9b10f81 Mon Sep 17 00:00:00 2001
From: Peter Antoine <peter.antoine@intel.com>
Date: Tue, 26 Apr 2016 10:11:41 +0100
Subject: [PATCH] drm/i915/bxt: reserve space for RC6 in the the GuC WOPCM
Organization: Intel Corporation (UK) Ltd. - Co. Reg. #1134945 - Pipers Way, Swindon SN3 1RJ

This patch resizes the GuC WOPCM (specifically on BXT)
so that the GuC and RC6 memory spaces do not overlap.

Issue: https://jira01.devtools.intel.com/browse/VIZ-6638
Signed-off-by: Peter Antoine <peter.antoine@intel.com>
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
---
 drivers/gpu/drm/i915/i915_guc_reg.h     |  6 +++---
 drivers/gpu/drm/i915/intel_guc_loader.c | 17 +++++++++++++----
 2 files changed, 16 insertions(+), 7 deletions(-)

Comments

Peter Antoine May 5, 2016, 2:02 p.m. UTC | #1
The attached version still does not explain that the WOPCM_TOP is to tell the GuC not to use that space.
The extra information does not aid anybody as the information is used internally within the GuC.

But, I have not actual objection to the patch.

Peter.

-----Original Message-----
From: Gordon, David S 
Sent: Thursday, May 5, 2016 2:41 PM
To: Antoine, Peter <peter.antoine@intel.com>; intel-gfx@lists.freedesktop.org
Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: Re: [PATCH v3] drm/i915: resize the GuC WOPCM for rc6

On 26/04/2016 10:11, Peter Antoine wrote:
> This patch resizes the GuC WOPCM to so that the GuC and the RC6 memory 
> spaces do not overlap.
>
> Issue: https://jira01.devtools.intel.com/browse/VIZ-6638
> Signed-off-by: Peter Antoine <peter.antoine@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_guc_reg.h     | 5 +++--
>   drivers/gpu/drm/i915/intel_guc_loader.c | 6 +++++-
>   2 files changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_reg.h 
> b/drivers/gpu/drm/i915/i915_guc_reg.h
> index 80786d9..6e01238 100644
> --- a/drivers/gpu/drm/i915/i915_guc_reg.h
> +++ b/drivers/gpu/drm/i915/i915_guc_reg.h
> @@ -68,10 +68,11 @@
>   #define GUC_MAX_IDLE_COUNT		_MMIO(0xC3E4)
>   
>   #define GUC_WOPCM_SIZE			_MMIO(0xc050)
> -#define   GUC_WOPCM_SIZE_VALUE  	  (0x80 << 12)	/* 512KB */
> +#define   GUC_WOPCM_SIZE_VALUE		(0x80 << 12)	/* 512KB */
> +#define   BXT_GUC_WOPCM_SIZE_VALUE	(0x70 << 12)	/* 448KB */
>   
>   /* GuC addresses below GUC_WOPCM_TOP don't map through the GTT */
> -#define	GUC_WOPCM_TOP			(GUC_WOPCM_SIZE_VALUE)
> +#define	GUC_WOPCM_TOP			(0x80 << 12)	/* 512KB */
>   
>   #define GEN8_GT_PM_CONFIG		_MMIO(0x138140)
>   #define GEN9LP_GT_PM_CONFIG		_MMIO(0x138140)
> diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c 
> b/drivers/gpu/drm/i915/intel_guc_loader.c
> index fc3ff68..38fb321 100644
> --- a/drivers/gpu/drm/i915/intel_guc_loader.c
> +++ b/drivers/gpu/drm/i915/intel_guc_loader.c
> @@ -312,7 +312,11 @@ static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
>   	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
>   
>   	/* init WOPCM */
> -	I915_WRITE(GUC_WOPCM_SIZE, GUC_WOPCM_SIZE_VALUE);
> +	if (IS_BROXTON(dev))
> +		I915_WRITE(GUC_WOPCM_SIZE, BXT_GUC_WOPCM_SIZE_VALUE);
> +	else
> +		I915_WRITE(GUC_WOPCM_SIZE, GUC_WOPCM_SIZE_VALUE);
> +
>   	I915_WRITE(DMA_GUC_WOPCM_OFFSET, GUC_WOPCM_OFFSET_VALUE);
>   
>   	/* Enable MIA caching. GuC clock gating is disabled. */

So, this gives the right result, but doesn't really show or explain why we have different values, or how the values are arrived at; they're just more magic numbers. Also, in the loader there's a check on the firmware size that uses different values. So I'd rather prefer the unified approach in the attached version ...

.Dave.
Dave Gordon May 5, 2016, 3:04 p.m. UTC | #2
On 05/05/2016 15:02, Antoine, Peter wrote:
> The attached version still does not explain that the WOPCM_TOP is to tell the GuC not to use that space.

That's NOT what WOPCM_TOP means. The GuC is allowed to use the space up 
to the value stored in the GUC_WOPCM_SIZE register (as the comment above 
the #define says). Architecturally, this is allowed to be any value 
greater than (16K+sizeof internal SRAM (64, 128, or 256K)) and less than 
or equal to GUC_WOPCM_TOP (which is a platform-independent constant), so 
we normally choose the maximm allowed. Howver on BXT, we need to leave 
some space at the top for the RC6 image, hence the logic (and comments!) 
in guc_wopcm_size().

> The extra information does not aid anybody as the information is used internally within the GuC.
It may help the next person who has to figure out what's gone wrong on 
some future chip that needs more than 64K for RC6!

.Dave.
>
> But, I have not actual objection to the patch.
>
> Peter.
>
Peter Antoine May 6, 2016, 7:01 a.m. UTC | #3
On Thu, 5 May 2016, Dave Gordon wrote:

> On 05/05/2016 15:02, Antoine, Peter wrote:
> 
> The attached version still does not explain that the WOPCM_TOP is to tell the GuC not to use that space.
> 
> 
> That's NOT what WOPCM_TOP means. The GuC is allowed to use the space up to the value stored in the GUC_WOPCM_SIZE register (as the comment above the #define says). Architecturally, this is allowed to be any value greater than
> (16K+sizeof internal SRAM (64, 128, or 256K)) and less than or equal to GUC_WOPCM_TOP (which is a platform-independent constant), so we normally choose the maximm allowed. Howver on BXT, we need to leave some space at the top for the
> RC6 image, hence the logic (and comments!) in guc_wopcm_size().
Yes, the firmware can use upto GUC_WOPCM_TOP and to leave the rest alone.
> 
> The extra information does not aid anybody as the information is used internally within the GuC.
> 
> It may help the next person who has to figure out what's gone wrong on some future chip that needs more than 64K for RC6!

You hid a if statement in a function (making the code harder to read and 
more prone to error). Where maybe a slightly clearer comment was required.

And this patch has been held up two weeks just for a better comment.

Peter.
> 
> .Dave.

And what if the next reserved space is not for RC6?

> 
> 
> But, I have not actual objection to the patch.
> 
> Peter.
> 
> 
> 
>

--
    Peter Antoine (Android Graphics Driver Software Engineer)
    ---------------------------------------------------------------------
    Intel Corporation (UK) Limited
    Registered No. 1134945 (England)
    Registered Office: Pipers Way, Swindon SN3 1RJ
    VAT No: 860 2173 47
Nick Hoath May 6, 2016, 9:36 a.m. UTC | #4
On 06/05/2016 08:01, Peter Antoine wrote:
> On Thu, 5 May 2016, Dave Gordon wrote:
>
>> On 05/05/2016 15:02, Antoine, Peter wrote:
>>
>> The attached version still does not explain that the WOPCM_TOP is to
>> tell the GuC not to use that space.
>>
>>
>> That's NOT what WOPCM_TOP means. The GuC is allowed to use the space
>> up to the value stored in the GUC_WOPCM_SIZE register (as the comment
>> above the #define says). Architecturally, this is allowed to be any
>> value greater than
>> (16K+sizeof internal SRAM (64, 128, or 256K)) and less than or equal
>> to GUC_WOPCM_TOP (which is a platform-independent constant), so we
>> normally choose the maximm allowed. Howver on BXT, we need to leave
>> some space at the top for the
>> RC6 image, hence the logic (and comments!) in guc_wopcm_size().
> Yes, the firmware can use upto GUC_WOPCM_TOP and to leave the rest alone.
>>
>> The extra information does not aid anybody as the information is used
>> internally within the GuC.
>>
>> It may help the next person who has to figure out what's gone wrong on
>> some future chip that needs more than 64K for RC6!
>
> You hid a if statement in a function (making the code harder to read and
> more prone to error). Where maybe a slightly clearer comment was required.
>
> And this patch has been held up two weeks just for a better comment.
>
> Peter.
>>
>> .Dave.
>
> And what if the next reserved space is not for RC6?
>
>>
>>
>> But, I have not actual objection to the patch.
>>
>> Peter.
>>
>>
>>
>>
Tested-by: Nick Hoath <nicholas.hoath@intel.com>
Reviewed-by: Nick Hoath <nicholas.hoath@intel.com>
>
> --
>     Peter Antoine (Android Graphics Driver Software Engineer)
>     ---------------------------------------------------------------------
>     Intel Corporation (UK) Limited
>     Registered No. 1134945 (England)
>     Registered Office: Pipers Way, Swindon SN3 1RJ
>     VAT No: 860 2173 47
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Nick Hoath May 6, 2016, 9:37 a.m. UTC | #5
On 05/05/2016 16:04, Dave Gordon wrote:
> On 05/05/2016 15:02, Antoine, Peter wrote:
>> The attached version still does not explain that the WOPCM_TOP is to tell the GuC not to use that space.
>
> That's NOT what WOPCM_TOP means. The GuC is allowed to use the space up
> to the value stored in the GUC_WOPCM_SIZE register (as the comment above
> the #define says). Architecturally, this is allowed to be any value
> greater than (16K+sizeof internal SRAM (64, 128, or 256K)) and less than
> or equal to GUC_WOPCM_TOP (which is a platform-independent constant), so
> we normally choose the maximm allowed. Howver on BXT, we need to leave
> some space at the top for the RC6 image, hence the logic (and comments!)
> in guc_wopcm_size().
>
>> The extra information does not aid anybody as the information is used internally within the GuC.
> It may help the next person who has to figure out what's gone wrong on
> some future chip that needs more than 64K for RC6!
>
> .Dave.
>>
>> But, I have not actual objection to the patch.
>>
>> Peter.
>>
>
Unfortunately Dave's patch locked my test system on bootup, so I've t-b 
& r-b'd Peter's.
Dave Gordon May 6, 2016, 12:18 p.m. UTC | #6
On 06/05/16 10:37, Nick Hoath wrote:
> On 05/05/2016 16:04, Dave Gordon wrote:
>> On 05/05/2016 15:02, Antoine, Peter wrote:
>>> The attached version still does not explain that the WOPCM_TOP is to
>>> tell the GuC not to use that space.
>>
>> That's NOT what WOPCM_TOP means. The GuC is allowed to use the space up
>> to the value stored in the GUC_WOPCM_SIZE register (as the comment above
>> the #define says). Architecturally, this is allowed to be any value
>> greater than (16K+sizeof internal SRAM (64, 128, or 256K)) and less than
>> or equal to GUC_WOPCM_TOP (which is a platform-independent constant), so
>> we normally choose the maximm allowed. Howver on BXT, we need to leave
>> some space at the top for the RC6 image, hence the logic (and comments!)
>> in guc_wopcm_size().
>>
>>> The extra information does not aid anybody as the information is used
>>> internally within the GuC.
>> It may help the next person who has to figure out what's gone wrong on
>> some future chip that needs more than 64K for RC6!
>>
>> .Dave.
>>>
>>> But, I have not actual objection to the patch.
>>>
>>> Peter.
>>>
>>
> Unfortunately Dave's patch locked my test system on bootup, so I've t-b
> & r-b'd Peter's.

They're equivalent, unless your firmware happens to be between 458752 
and 491520 bytes in size (in which case you have a problem anyway).

To check, I've run both versions, with debug printing the value chosen 
(on SKL) and the value that would have been chosen on BXT, and they're 
identical (and both work). So I think your build had some other problem 
unrelated to the specific patch.

I've no problem with using Peter's patch for now, but it's not just a 
matter of the comments; there's also the other use(s) of 
GUC_WOP_(TOP,SIZE_VALUE), with ad-hoc additions or subtractions. So it 
still needs fixing properly.

.Dave.
Nick Hoath May 16, 2016, 2:12 p.m. UTC | #7
On 06/05/2016 13:18, Gordon, David S wrote:
> On 06/05/16 10:37, Nick Hoath wrote:
>> On 05/05/2016 16:04, Dave Gordon wrote:
>>> On 05/05/2016 15:02, Antoine, Peter wrote:
>>>> The attached version still does not explain that the WOPCM_TOP is to
>>>> tell the GuC not to use that space.
>>>
>>> That's NOT what WOPCM_TOP means. The GuC is allowed to use the space up
>>> to the value stored in the GUC_WOPCM_SIZE register (as the comment above
>>> the #define says). Architecturally, this is allowed to be any value
>>> greater than (16K+sizeof internal SRAM (64, 128, or 256K)) and less than
>>> or equal to GUC_WOPCM_TOP (which is a platform-independent constant), so
>>> we normally choose the maximm allowed. Howver on BXT, we need to leave
>>> some space at the top for the RC6 image, hence the logic (and comments!)
>>> in guc_wopcm_size().
>>>
>>>> The extra information does not aid anybody as the information is used
>>>> internally within the GuC.
>>> It may help the next person who has to figure out what's gone wrong on
>>> some future chip that needs more than 64K for RC6!
>>>
>>> .Dave.
>>>>
>>>> But, I have not actual objection to the patch.
>>>>
>>>> Peter.
>>>>
>>>
>> Unfortunately Dave's patch locked my test system on bootup, so I've t-b
>> & r-b'd Peter's.
>
> They're equivalent, unless your firmware happens to be between 458752
> and 491520 bytes in size (in which case you have a problem anyway).
>
> To check, I've run both versions, with debug printing the value chosen
> (on SKL) and the value that would have been chosen on BXT, and they're
> identical (and both work). So I think your build had some other problem
> unrelated to the specific patch.
>
> I've no problem with using Peter's patch for now, but it's not just a
> matter of the comments; there's also the other use(s) of
> GUC_WOP_(TOP,SIZE_VALUE), with ad-hoc additions or subtractions. So it
> still needs fixing properly.
>
> .Dave.
>
After a rebuild & a retest, Dave's patch works fine. Therefore for 
"drm/i915/bxt: reserve space for RC6 in the the GuC WOPCM":
Tested-by: Nick Hoath <nicholas.hoath@intel.com>
Reviewed-by: Nick Hoath <nicholas.hoath@intel.com>
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_guc_reg.h b/drivers/gpu/drm/i915/i915_guc_reg.h
index 80786d9..cf5a65b 100644
--- a/drivers/gpu/drm/i915/i915_guc_reg.h
+++ b/drivers/gpu/drm/i915/i915_guc_reg.h
@@ -67,11 +67,11 @@ 
 #define   GUC_WOPCM_OFFSET_VALUE	  0x80000	/* 512KB */
 #define GUC_MAX_IDLE_COUNT		_MMIO(0xC3E4)
 
+/* Defines WOPCM space available to GuC firmware */
 #define GUC_WOPCM_SIZE			_MMIO(0xc050)
-#define   GUC_WOPCM_SIZE_VALUE  	  (0x80 << 12)	/* 512KB */
-
 /* GuC addresses below GUC_WOPCM_TOP don't map through the GTT */
-#define	GUC_WOPCM_TOP			(GUC_WOPCM_SIZE_VALUE)
+#define   GUC_WOPCM_TOP			  (0x80 << 12)	/* 512KB */
+#define   BXT_GUC_WOPCM_RC6_RESERVED	  (0x10 << 12)	/* 64KB  */
 
 #define GEN8_GT_PM_CONFIG		_MMIO(0x138140)
 #define GEN9LP_GT_PM_CONFIG		_MMIO(0x138140)
diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 876e5da..80fc1e0 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -281,6 +281,17 @@  static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv)
 	return ret;
 }
 
+static u32 guc_wopcm_size(struct drm_i915_private *dev_priv)
+{
+	u32 wopcm_size = GUC_WOPCM_TOP;
+
+	/* On BXT, the top of WOPCM is reserved for RC6 context */
+	if (IS_BROXTON(dev_priv))
+		wopcm_size -= BXT_GUC_WOPCM_RC6_RESERVED;
+
+	return wopcm_size;
+}
+
 /*
  * Load the GuC firmware blob into the MinuteIA.
  */
@@ -308,7 +319,7 @@  static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
 	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 
 	/* init WOPCM */
-	I915_WRITE(GUC_WOPCM_SIZE, GUC_WOPCM_SIZE_VALUE);
+	I915_WRITE(GUC_WOPCM_SIZE, guc_wopcm_size(dev_priv));
 	I915_WRITE(DMA_GUC_WOPCM_OFFSET, GUC_WOPCM_OFFSET_VALUE);
 
 	/* Enable MIA caching. GuC clock gating is disabled. */
@@ -552,9 +563,7 @@  static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 
 	/* Header and uCode will be loaded to WOPCM. Size of the two. */
 	size = guc_fw->header_size + guc_fw->ucode_size;
-
-	/* Top 32k of WOPCM is reserved (8K stack + 24k RC6 context). */
-	if (size > GUC_WOPCM_SIZE_VALUE - 0x8000) {
+	if (size > guc_wopcm_size(dev->dev_private)) {
 		DRM_ERROR("Firmware is too large to fit in WOPCM\n");
 		goto fail;
 	}