aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeeja KP <jeeja.kp@intel.com>2017-02-17 12:18:57 -0500
committerMark Brown <broonie@kernel.org>2017-03-07 07:48:01 -0500
commit7d3f91dc1e4db18b644695c9442c62679a5dff6e (patch)
treecea19eca72bb8a01d2cc7ac1f122e45767c366db
parent31d648f051fe82c9d6c2176b1b5ee402b1a18f21 (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.c27
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
48static unsigned int bxt_get_errorcode(struct sst_dsp *ctx) 51static 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);