[PATCH v4] drm/i915: Allocate intel_engine_cs structure only for the enabled engines

Goel, Akash akash.goel at intel.com
Wed Jul 27 17:40:01 UTC 2016



On 7/27/2016 10:54 PM, Chris Wilson wrote:
> On Wed, Jul 27, 2016 at 10:45:45PM +0530, akash.goel at intel.com wrote:
>>  void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
>>  {
>>  	struct intel_engine_cs *engine;
>> +	u32 iter;
>>
>>  	if (INTEL_INFO(dev_priv)->gen < 6)
>>  		return;
>>
>> -	for_each_engine(engine, dev_priv) {
>> +	for_each_engine(engine, dev_priv, iter) {
>>  		u32 fault_reg;
>>  		fault_reg = I915_READ(RING_FAULT_REG(engine));
>>  		if (fault_reg & RING_FAULT_VALID) {
>> @@ -2285,7 +2288,10 @@ void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
>>  				   fault_reg & ~RING_FAULT_VALID);
>>  		}
>>  	}
>> -	POSTING_READ(RING_FAULT_REG(&dev_priv->engine[RCS]));
>> +
>> +	/* Engine specific init may not have been done till this point. */
>> +	if (dev_priv->engine[RCS])
>> +		POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
>>  }
>
> That deserves to be fixed first. If i915_check_and_clear_faults() is
> being run before engine setup, it is reading bogus addresses. This needs
> to be moved to intel_engines_init().

Yes i915_check_and_clear_faults() gets called before engine setup,

i915_driver_load
	i915_driver_init_mmio
		intel_uncore_init
			i915_check_and_clear_faults

	i915_load_modeset_init
		i915_gem_init
			intel_engines_init


POSTING_READ(RING_FAULT_REG(&dev_priv->engine[RCS]));
#define RING_FAULT_REG(engine)	_MMIO(0x4094 + 0x100*(engine)->id)

Currently the address may not be bogus as (&dev_priv->engine[RCS])->id 
would come as zero.

Best regards
Akash
> -Chris
>


More information about the Intel-gfx-trybot mailing list