[Intel-gfx] [PATCH 5/8] drm/i915/skl+: ddb min requirement may exceed allocation

Mahesh Kumar mahesh1.kumar at intel.com
Wed Apr 12 15:09:34 UTC 2017


Hi Ander,

Thanks for review

On Wednesday 12 April 2017 02:47 PM, Ander Conselvan De Oliveira wrote:
> On Tue, 2017-02-28 at 17:01 +0530, Mahesh Kumar wrote:
>> DDB minimum requirement may also exceed the allocated DDB for CRTC.
>> Instead of directly deducting from alloc_size, check against
>> total_min_ddb requirement. if exceeding fail the flip.
> Instead of doing a low level description of the code change, including variable
> names and whatnot, use this space to describe in a high level what the patch
> does and why it is necessary. For instance, in this particular case the patch
> changes the modeset to fail when there isn't enough ddb for the given
> configuration. Previously it succeeded, but the plane ddb allocations would be
> bogus because of the negative value of alloc_size, leading to screen corruption
> and system hangs.
Ok, will make changes,
Not only modeset, any flip whose requirement is exceeding available ddb 
allocation, we should fail that ioctl.
>
> Do I understand correctly that this patch is independent from the rest of the
> series? Might make sense to merge it earlier, since the bug is there with the
> old ddb allocation algorithm too.
Yes, patch 3,4 as well are independent of the series & applicable for 
old algorithm too.
>
>> Signed-off-by: Mahesh Kumar <mahesh1.kumar at intel.com>
>> ---
>>   drivers/gpu/drm/i915/intel_pm.c | 13 +++++++++++--
>>   1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
>> index 76c986166664..24e9e5d69833 100644
>> --- a/drivers/gpu/drm/i915/intel_pm.c
>> +++ b/drivers/gpu/drm/i915/intel_pm.c
>> @@ -3380,6 +3380,7 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
>>   	int num_active;
>>   	unsigned plane_data_rate[I915_MAX_PLANES] = {};
>>   	unsigned plane_y_data_rate[I915_MAX_PLANES] = {};
>> +	uint16_t total_min_blocks = 0;
>>   
>>   	/* Clear the partitioning for disabled planes. */
>>   	memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
>> @@ -3407,10 +3408,18 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
>>   	 */
>>   
>>   	for_each_plane_id_on_crtc(intel_crtc, plane_id) {
>> -		alloc_size -= minimum[plane_id];
>> -		alloc_size -= y_minimum[plane_id];
>> +		total_min_blocks += minimum[plane_id];
>> +		total_min_blocks += y_minimum[plane_id];
>>   	}
>>   
>> +	if ((total_min_blocks > alloc_size)) {
> One '(' is enough.
will do :)
>
>> +		DRM_DEBUG_KMS("Requested display configuration exceeds system DDB limitations");
>> +		DRM_DEBUG_KMS("minimum required %d/%d\n", total_min_blocks,
>> +							alloc_size);
>> +		return-EINVAL;
> Space between return and -EINVAL please.
will update.

-Mahesh
>
> Ander
>
>> +	}
>> +
>> +	alloc_size -= total_min_blocks;
>>   	ddb->plane[pipe][PLANE_CURSOR].start = alloc->end - minimum[PLANE_CURSOR];
>>   	ddb->plane[pipe][PLANE_CURSOR].end = alloc->end;
>>   



More information about the Intel-gfx mailing list