diff options
author | Jeeja KP <jeeja.kp@intel.com> | 2017-02-17 12:18:57 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-03-07 07:48:01 -0500 |
commit | 7d3f91dc1e4db18b644695c9442c62679a5dff6e (patch) | |
tree | cea19eca72bb8a01d2cc7ac1f122e45767c366db | |
parent | 31d648f051fe82c9d6c2176b1b5ee402b1a18f21 (diff) |
ASoC: Intel: bxtn: optimize ROM init retries
During S3->S0 transition, sometime ROM init fails because of
authentication engine loads later than the OS. In this case driver
waits for a longer period and then retries the FW download causing
huge delay in resume time of audio device.
To avoid this, ROM INIT wait time is set to a optimal value and
increased the retries for firmware download.
Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/intel/skylake/bxt-sst.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/sound/soc/intel/skylake/bxt-sst.c b/sound/soc/intel/skylake/bxt-sst.c index 7762d5a18fce..d3be1be5a372 100644 --- a/sound/soc/intel/skylake/bxt-sst.c +++ b/sound/soc/intel/skylake/bxt-sst.c | |||
@@ -25,7 +25,8 @@ | |||
25 | #include "skl-sst-ipc.h" | 25 | #include "skl-sst-ipc.h" |
26 | 26 | ||
27 | #define BXT_BASEFW_TIMEOUT 3000 | 27 | #define BXT_BASEFW_TIMEOUT 3000 |
28 | #define BXT_INIT_TIMEOUT 500 | 28 | #define BXT_INIT_TIMEOUT 300 |
29 | #define BXT_ROM_INIT_TIMEOUT 70 | ||
29 | #define BXT_IPC_PURGE_FW 0x01004000 | 30 | #define BXT_IPC_PURGE_FW 0x01004000 |
30 | 31 | ||
31 | #define BXT_ROM_INIT 0x5 | 32 | #define BXT_ROM_INIT 0x5 |
@@ -45,6 +46,8 @@ | |||
45 | /* Delay before scheduling D0i3 entry */ | 46 | /* Delay before scheduling D0i3 entry */ |
46 | #define BXT_D0I3_DELAY 5000 | 47 | #define BXT_D0I3_DELAY 5000 |
47 | 48 | ||
49 | #define BXT_FW_ROM_INIT_RETRY 3 | ||
50 | |||
48 | static unsigned int bxt_get_errorcode(struct sst_dsp *ctx) | 51 | static unsigned int bxt_get_errorcode(struct sst_dsp *ctx) |
49 | { | 52 | { |
50 | return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE); | 53 | return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE); |
@@ -185,7 +188,7 @@ static int sst_bxt_prepare_fw(struct sst_dsp *ctx, | |||
185 | 188 | ||
186 | /* Step 7: Wait for ROM init */ | 189 | /* Step 7: Wait for ROM init */ |
187 | ret = sst_dsp_register_poll(ctx, BXT_ADSP_FW_STATUS, SKL_FW_STS_MASK, | 190 | ret = sst_dsp_register_poll(ctx, BXT_ADSP_FW_STATUS, SKL_FW_STS_MASK, |
188 | SKL_FW_INIT, BXT_INIT_TIMEOUT, "ROM Load"); | 191 | SKL_FW_INIT, BXT_ROM_INIT_TIMEOUT, "ROM Load"); |
189 | if (ret < 0) { | 192 | if (ret < 0) { |
190 | dev_err(ctx->dev, "Timeout for ROM init, ret:%d\n", ret); | 193 | dev_err(ctx->dev, "Timeout for ROM init, ret:%d\n", ret); |
191 | goto base_fw_load_failed; | 194 | goto base_fw_load_failed; |
@@ -218,7 +221,7 @@ static int bxt_load_base_firmware(struct sst_dsp *ctx) | |||
218 | { | 221 | { |
219 | struct firmware stripped_fw; | 222 | struct firmware stripped_fw; |
220 | struct skl_sst *skl = ctx->thread_context; | 223 | struct skl_sst *skl = ctx->thread_context; |
221 | int ret; | 224 | int ret, i; |
222 | 225 | ||
223 | if (ctx->fw == NULL) { | 226 | if (ctx->fw == NULL) { |
224 | ret = request_firmware(&ctx->fw, ctx->fw_name, ctx->dev); | 227 | ret = request_firmware(&ctx->fw, ctx->fw_name, ctx->dev); |
@@ -239,18 +242,20 @@ static int bxt_load_base_firmware(struct sst_dsp *ctx) | |||
239 | stripped_fw.size = ctx->fw->size; | 242 | stripped_fw.size = ctx->fw->size; |
240 | skl_dsp_strip_extended_manifest(&stripped_fw); | 243 | skl_dsp_strip_extended_manifest(&stripped_fw); |
241 | 244 | ||
242 | ret = sst_bxt_prepare_fw(ctx, stripped_fw.data, stripped_fw.size); | 245 | |
243 | /* Retry Enabling core and ROM load. Retry seemed to help */ | 246 | for (i = 0; i < BXT_FW_ROM_INIT_RETRY; i++) { |
244 | if (ret < 0) { | ||
245 | ret = sst_bxt_prepare_fw(ctx, stripped_fw.data, stripped_fw.size); | 247 | ret = sst_bxt_prepare_fw(ctx, stripped_fw.data, stripped_fw.size); |
246 | if (ret < 0) { | 248 | if (ret == 0) |
247 | dev_err(ctx->dev, "Error code=0x%x: FW status=0x%x\n", | 249 | break; |
250 | } | ||
251 | |||
252 | if (ret < 0) { | ||
253 | dev_err(ctx->dev, "Error code=0x%x: FW status=0x%x\n", | ||
248 | sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE), | 254 | sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE), |
249 | sst_dsp_shim_read(ctx, BXT_ADSP_FW_STATUS)); | 255 | sst_dsp_shim_read(ctx, BXT_ADSP_FW_STATUS)); |
250 | 256 | ||
251 | dev_err(ctx->dev, "Core En/ROM load fail:%d\n", ret); | 257 | dev_err(ctx->dev, "Core En/ROM load fail:%d\n", ret); |
252 | goto sst_load_base_firmware_failed; | 258 | goto sst_load_base_firmware_failed; |
253 | } | ||
254 | } | 259 | } |
255 | 260 | ||
256 | ret = sst_transfer_fw_host_dma(ctx); | 261 | ret = sst_transfer_fw_host_dma(ctx); |