Skip to content

Commit 2abc525

Browse files
committed
drm/i915/gen9: Fix DMC firmware initialization
In commit 1e657ad we moved the last step of firmware initialization to skl_display_core_init(), where it will be run only during system resume, but not during driver loading. Since this init step needs to be done whenever we program the firmware fix this by moving the initialization to the end of intel_csr_load_program(). While at it simplify a bit csr_load_work_fn(). This issue prevented DC5/6 transitions, this change will re-enable those. v2: - remove debugging left-over and redundant comment in csr_load_work_fn() Fixes: 1e657ad ("drm/i915/gen9: Write dc state debugmask bits only once") CC: Mika Kuoppala <mika.kuoppala@intel.com> CC: Patrik Jakobsson <patrik.jakobsson@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1457121461-16729-1-git-send-email-imre.deak@intel.com
1 parent 24a65e6 commit 2abc525

File tree

3 files changed

+29
-35
lines changed

3 files changed

+29
-35
lines changed

drivers/gpu/drm/i915/intel_csr.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,24 @@ static const struct stepping_info *intel_get_stepping_info(struct drm_device *de
212212
return NULL;
213213
}
214214

215+
static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
216+
{
217+
uint32_t val, mask;
218+
219+
mask = DC_STATE_DEBUG_MASK_MEMORY_UP;
220+
221+
if (IS_BROXTON(dev_priv))
222+
mask |= DC_STATE_DEBUG_MASK_CORES;
223+
224+
/* The below bit doesn't need to be cleared ever afterwards */
225+
val = I915_READ(DC_STATE_DEBUG);
226+
if ((val & mask) != mask) {
227+
val |= mask;
228+
I915_WRITE(DC_STATE_DEBUG, val);
229+
POSTING_READ(DC_STATE_DEBUG);
230+
}
231+
}
232+
215233
/**
216234
* intel_csr_load_program() - write the firmware from memory to register.
217235
* @dev_priv: i915 drm device.
@@ -220,19 +238,19 @@ static const struct stepping_info *intel_get_stepping_info(struct drm_device *de
220238
* Everytime display comes back from low power state this function is called to
221239
* copy the firmware from internal memory to registers.
222240
*/
223-
bool intel_csr_load_program(struct drm_i915_private *dev_priv)
241+
void intel_csr_load_program(struct drm_i915_private *dev_priv)
224242
{
225243
u32 *payload = dev_priv->csr.dmc_payload;
226244
uint32_t i, fw_size;
227245

228246
if (!IS_GEN9(dev_priv)) {
229247
DRM_ERROR("No CSR support available for this platform\n");
230-
return false;
248+
return;
231249
}
232250

233251
if (!dev_priv->csr.dmc_payload) {
234252
DRM_ERROR("Tried to program CSR with empty payload\n");
235-
return false;
253+
return;
236254
}
237255

238256
fw_size = dev_priv->csr.dmc_fw_size;
@@ -246,7 +264,7 @@ bool intel_csr_load_program(struct drm_i915_private *dev_priv)
246264

247265
dev_priv->csr.dc_state = 0;
248266

249-
return true;
267+
gen9_set_dc_state_debugmask(dev_priv);
250268
}
251269

252270
static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
@@ -388,18 +406,12 @@ static void csr_load_work_fn(struct work_struct *work)
388406

389407
ret = request_firmware(&fw, dev_priv->csr.fw_path,
390408
&dev_priv->dev->pdev->dev);
391-
if (!fw)
392-
goto out;
409+
if (fw)
410+
dev_priv->csr.dmc_payload = parse_csr_fw(dev_priv, fw);
393411

394-
dev_priv->csr.dmc_payload = parse_csr_fw(dev_priv, fw);
395-
if (!dev_priv->csr.dmc_payload)
396-
goto out;
397-
398-
/* load csr program during system boot, as needed for DC states */
399-
intel_csr_load_program(dev_priv);
400-
401-
out:
402412
if (dev_priv->csr.dmc_payload) {
413+
intel_csr_load_program(dev_priv);
414+
403415
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
404416

405417
DRM_INFO("Finished loading %s (v%u.%u)\n",

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,7 @@ u32 skl_plane_ctl_rotation(unsigned int rotation);
12791279

12801280
/* intel_csr.c */
12811281
void intel_csr_ucode_init(struct drm_i915_private *);
1282-
bool intel_csr_load_program(struct drm_i915_private *);
1282+
void intel_csr_load_program(struct drm_i915_private *);
12831283
void intel_csr_ucode_fini(struct drm_i915_private *);
12841284

12851285
/* intel_dp.c */

drivers/gpu/drm/i915/intel_runtime_pm.c

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -470,24 +470,6 @@ static void assert_can_disable_dc9(struct drm_i915_private *dev_priv)
470470
*/
471471
}
472472

473-
static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
474-
{
475-
uint32_t val, mask;
476-
477-
mask = DC_STATE_DEBUG_MASK_MEMORY_UP;
478-
479-
if (IS_BROXTON(dev_priv))
480-
mask |= DC_STATE_DEBUG_MASK_CORES;
481-
482-
/* The below bit doesn't need to be cleared ever afterwards */
483-
val = I915_READ(DC_STATE_DEBUG);
484-
if ((val & mask) != mask) {
485-
val |= mask;
486-
I915_WRITE(DC_STATE_DEBUG, val);
487-
POSTING_READ(DC_STATE_DEBUG);
488-
}
489-
}
490-
491473
static void gen9_write_dc_state(struct drm_i915_private *dev_priv,
492474
u32 state)
493475
{
@@ -2141,8 +2123,8 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
21412123

21422124
skl_init_cdclk(dev_priv);
21432125

2144-
if (dev_priv->csr.dmc_payload && intel_csr_load_program(dev_priv))
2145-
gen9_set_dc_state_debugmask(dev_priv);
2126+
if (dev_priv->csr.dmc_payload)
2127+
intel_csr_load_program(dev_priv);
21462128
}
21472129

21482130
static void skl_display_core_uninit(struct drm_i915_private *dev_priv)

0 commit comments

Comments
 (0)