[Intel-gfx] [PATCH] [intel-gfx] drm/i915/intel_csr.c Fix DMC FW Loading issue on ICL.

Yadav, Jyoti R jyoti.r.yadav at intel.com
Wed Aug 29 10:18:14 UTC 2018


Hi Imre,

I also checked in Bspec. Good catch:)

FW size = (End address - Start Address) + 1

Will update the patch also. Thanks for quickly reviewing the patch.

Regards

Jyoti

_
On 8/29/2018 2:51 PM, Imre Deak wrote:
> On Tue, Aug 28, 2018 at 03:24:19PM -0400, Jyoti Yadav wrote:
>> From: Jyoti <jyoti.r.yadav at intel.com>
>>
>> This patch resolves the DMC FW loading issue.
>> Earlier DMC FW package have only one DMC FW for one stepping. But as such
>> there is no such restriction from Package side.
>> For ICL icl_dmc_ver1_07.bin binary package has DMC FW for 2 steppings.
>> So while reading the dmc_offset from package header, for 1st stepping offset
>> used to come 0x0 and was working fine till now.
>> But for second stepping and other steppings, offset is non zero numaber and is
>> in dwords. So we need to convert into bytes to fetch correct DMC FW from
>> correct place.
>>
>> v2 : Added check for DMC FW max size for various gen. (Imre Deak)
>> v3 : Corrected naming convention for various gen. (Imre Deak)
>> v4 : Initalized max_fw_size to 0
>>
>> Signed-off-by: Jyoti Yadav <jyoti.r.yadav at intel.com>
>> ---
>>   drivers/gpu/drm/i915/intel_csr.c | 19 ++++++++++++++++---
>>   1 file changed, 16 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
>> index 1ec4f09..d12051b 100644
>> --- a/drivers/gpu/drm/i915/intel_csr.c
>> +++ b/drivers/gpu/drm/i915/intel_csr.c
>> @@ -55,7 +55,9 @@
>>   #define BXT_CSR_VERSION_REQUIRED	CSR_VERSION(1, 7)
>>   
>>   
>> -#define CSR_MAX_FW_SIZE			0x2FFF
>> +#define BXT_CSR_MAX_FW_SIZE		0x2FFF
>> +#define GLK_CSR_MAX_FW_SIZE		0x3FFF
>> +#define ICL_CSR_MAX_FW_SIZE		0x5FFF
> Err, just noticed that both the original and the new ones have
> an off-by-one error, could you still fix them while at it?
> (Correctly 0x3000, 0x4000, 0x6000 see 'Display CSR Program' in
> BSpec). With that and asssuming the description for the fw offset
> field will get clarified in BSpec:
>
> Reviewed-by: Imre Deak <imre.deak at intel.com>
>
>>   #define CSR_DEFAULT_FW_OFFSET		0xFFFFFFFF
>>   
>>   struct intel_css_header {
>> @@ -279,6 +281,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
>>   	struct intel_csr *csr = &dev_priv->csr;
>>   	const struct stepping_info *si = intel_get_stepping_info(dev_priv);
>>   	uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
>> +	uint32_t max_fw_size = 0;
>>   	uint32_t i;
>>   	uint32_t *dmc_payload;
>>   	uint32_t required_version;
>> @@ -359,6 +362,8 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
>>   			  si->stepping);
>>   		return NULL;
>>   	}
>> +	/* Convert dmc_offset into number of bytes. By default it is in dwords*/
>> +	dmc_offset *= 4;
>>   	readcount += dmc_offset;
>>   
>>   	/* Extract dmc_header information. */
>> @@ -391,8 +396,16 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
>>   
>>   	/* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
>>   	nbytes = dmc_header->fw_size * 4;
>> -	if (nbytes > CSR_MAX_FW_SIZE) {
>> -		DRM_ERROR("DMC firmware too big (%u bytes)\n", nbytes);
>> +	if (INTEL_GEN(dev_priv) >= 11)
>> +		max_fw_size = ICL_CSR_MAX_FW_SIZE;
>> +	else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
>> +		max_fw_size = GLK_CSR_MAX_FW_SIZE;
>> +	else if (IS_GEN9(dev_priv))
>> +		max_fw_size = BXT_CSR_MAX_FW_SIZE;
>> +	else
>> +		MISSING_CASE(INTEL_REVID(dev_priv));
>> +	if (nbytes > max_fw_size) {
>> +		DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes);
>>   		return NULL;
>>   	}
>>   	csr->dmc_fw_size = dmc_header->fw_size;
>> -- 
>> 1.9.1
>>



More information about the Intel-gfx mailing list