[Intel-gfx] [PATCH] drm/i915: Fix subslice configuration on Gen9LP

Lionel Landwerlin lionel.g.landwerlin at intel.com
Wed Aug 22 15:22:54 UTC 2018


On 22/08/2018 16:17, Tvrtko Ursulin wrote:
>
> On 22/08/2018 16:08, Lionel Landwerlin wrote:
>> On 22/08/2018 15:29, Tvrtko Ursulin wrote:
>>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>>
>>> According to the documentation, when programming the subslice count 
>>> power-
>>> gating configuration register, the value to be written into it on 
>>> Gen9LP
>>> should actually in the format of:
>>>
>>>    1 slice  = 0x001
>>>    2 slices = 0x010
>>>    3 slices = 0x100
>>
>>
>> s/slice/subslice/
>>
>>
>> Also 0b001 etc... Not hexadecimal.
>
> Oops, you're right.
>
>>>
>>> And not the popcount of the enabled subslice mask as on other 
>>> platforms.
>>>
>>> So on Gen9LP platforms we have been programming 0x11 into those 
>>> bits, but
>>> the documentation does not explain what would that achieve. Could it be
>>> that we enable only two subslice on three sub-slice parts? Or hardware
>>> simply ignores it and sticks with the maximum configuration?
>>>
>>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>> Cc: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>>> Bspec: 12247
>>> ---
>>> Could this actually be true or I am severely misreading the docs? It 
>>> does
>>> not sound plausible to me this would have been missed all this time..
>>>
>>> How to test in what configuration do these parts run before and 
>>> after this
>>> patch?
>>> ---
>>>   drivers/gpu/drm/i915/intel_lrc.c | 10 ++++++++--
>>>   1 file changed, 8 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_lrc.c 
>>> b/drivers/gpu/drm/i915/intel_lrc.c
>>> index 36050f085071..cdfa962a1975 100644
>>> --- a/drivers/gpu/drm/i915/intel_lrc.c
>>> +++ b/drivers/gpu/drm/i915/intel_lrc.c
>>> @@ -2508,9 +2508,15 @@ make_rpcs(struct drm_i915_private *dev_priv)
>>>       }
>>>       if (INTEL_INFO(dev_priv)->sseu.has_subslice_pg) {
>>> +        u8 val;
>>> +
>>> +        val = hweight8(INTEL_INFO(dev_priv)->sseu.subslice_mask[0]);
>>> +
>>> +        if (IS_GEN9_LP(dev_priv))
>>> +            val = BIT(val - 1);
>>
>>
>> Hmm... Are you breaking the 2 subslices setting here then?
>>
>> (2 subslices = 0b10 which should be equal to hweight8(subslice_mask) 
>> if I'm thinking right)
>
> No and yes, I think.
>
> subslice_mask = 0b011 => hweight = 2 => BIT(2 - 1) = BIT(1) = 0b010 
> into the register
>
> In the same way, all together:
>
> subslice_mask = 0b001 => hweight = 1 => BIT(0) = 0b001
> subslice_mask = 0b011 => hweight = 2 => BIT(1) = 0b010
> subslice_mask = 0b111 => hweight = 3 => BIT(2) = 0b100
>
> Have I made a mistake somewhere?


Ah, yes! You're right :)

My eyes got tricked, thanks for finding this out.


With the comment fixed :


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>


>
> Regards,
>
> Tvrtko
>
>>
>>> +
>>>           rpcs |= GEN8_RPCS_SS_CNT_ENABLE;
>>> -        rpcs |= 
>>> hweight8(INTEL_INFO(dev_priv)->sseu.subslice_mask[0]) <<
>>> -            GEN8_RPCS_SS_CNT_SHIFT;
>>> +        rpcs |= val << GEN8_RPCS_SS_CNT_SHIFT;
>>>           rpcs |= GEN8_RPCS_ENABLE;
>>>       }
>>
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>



More information about the Intel-gfx mailing list