ctx->dsp_ops.stream_tag = stream_tag;
        memcpy(ctx->dmab.area, fwdata, fwsize);
 
+       ret = skl_dsp_core_power_up(ctx, SKL_DSP_CORE0_MASK);
+       if (ret < 0) {
+               dev_err(ctx->dev, "dsp core0 power up failed\n");
+               ret = -EIO;
+               goto base_fw_load_failed;
+       }
+
        /* purge FW request */
        sst_dsp_shim_write(ctx, CNL_ADSP_REG_HIPCIDR,
                           CNL_ADSP_REG_HIPCIDR_BUSY | (CNL_IPC_PURGE |
                           ((stream_tag - 1) << CNL_ROM_CTRL_DMA_ID)));
 
-       ret = cnl_dsp_enable_core(ctx, SKL_DSP_CORE0_MASK);
+       ret = skl_dsp_start_core(ctx, SKL_DSP_CORE0_MASK);
        if (ret < 0) {
-               dev_err(ctx->dev, "dsp boot core failed ret: %d\n", ret);
+               dev_err(ctx->dev, "Start dsp core failed ret: %d\n", ret);
                ret = -EIO;
                goto base_fw_load_failed;
        }
 
+       ret = sst_dsp_register_poll(ctx, CNL_ADSP_REG_HIPCIDA,
+                                   CNL_ADSP_REG_HIPCIDA_DONE,
+                                   CNL_ADSP_REG_HIPCIDA_DONE,
+                                   BXT_INIT_TIMEOUT, "HIPCIDA Done");
+       if (ret < 0) {
+               dev_err(ctx->dev, "timeout for purge request: %d\n", ret);
+               goto base_fw_load_failed;
+       }
+
        /* enable interrupt */
        cnl_ipc_int_enable(ctx);
        cnl_ipc_op_int_enable(ctx);