Skip to content

Commit a64f888

Browse files
Jyoti Yadavideak
authored andcommitted
drm/i915/intel_csr.c Fix DMC FW Loading issue on ICL.
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 number 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 : Initialized max_fw_size to 0 v5 : Corrected DMC FW MAX_SIZE for various gen. (Imre Deak) v6 : Fixed the typo issues. Reviewed-by: Imre Deak <[email protected]> Signed-off-by: Jyoti Yadav <[email protected]> Signed-off-by: Imre Deak <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 3f51b7e commit a64f888

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

drivers/gpu/drm/i915/intel_csr.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ MODULE_FIRMWARE(I915_CSR_BXT);
5555
#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
5656

5757

58-
#define CSR_MAX_FW_SIZE 0x2FFF
58+
#define BXT_CSR_MAX_FW_SIZE 0x3000
59+
#define GLK_CSR_MAX_FW_SIZE 0x4000
60+
#define ICL_CSR_MAX_FW_SIZE 0x6000
5961
#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
6062

6163
struct intel_css_header {
@@ -279,6 +281,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
279281
struct intel_csr *csr = &dev_priv->csr;
280282
const struct stepping_info *si = intel_get_stepping_info(dev_priv);
281283
uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
284+
uint32_t max_fw_size = 0;
282285
uint32_t i;
283286
uint32_t *dmc_payload;
284287
uint32_t required_version;
@@ -359,6 +362,8 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
359362
si->stepping);
360363
return NULL;
361364
}
365+
/* Convert dmc_offset into number of bytes. By default it is in dwords*/
366+
dmc_offset *= 4;
362367
readcount += dmc_offset;
363368

364369
/* Extract dmc_header information. */
@@ -391,8 +396,16 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
391396

392397
/* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
393398
nbytes = dmc_header->fw_size * 4;
394-
if (nbytes > CSR_MAX_FW_SIZE) {
395-
DRM_ERROR("DMC firmware too big (%u bytes)\n", nbytes);
399+
if (INTEL_GEN(dev_priv) >= 11)
400+
max_fw_size = ICL_CSR_MAX_FW_SIZE;
401+
else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
402+
max_fw_size = GLK_CSR_MAX_FW_SIZE;
403+
else if (IS_GEN9(dev_priv))
404+
max_fw_size = BXT_CSR_MAX_FW_SIZE;
405+
else
406+
MISSING_CASE(INTEL_REVID(dev_priv));
407+
if (nbytes > max_fw_size) {
408+
DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes);
396409
return NULL;
397410
}
398411
csr->dmc_fw_size = dmc_header->fw_size;

0 commit comments

Comments
 (0)