{
        struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
        const struct sof_intel_dsp_desc *chip = hda->desc;
-       unsigned int status;
+       unsigned int status, target_status;
        u32 ipc_hdr, flags;
        char *dump_msg;
        int ret;
 
        mtl_enable_ipc_interrupts(sdev);
 
+       if (chip->rom_status_reg == MTL_DSP_ROM_STS) {
+               /*
+                * Workaround: when the ROM status register is pointing to
+                * the SRAM window (MTL_DSP_ROM_STS) the platform cannot catch
+                * ROM_INIT_DONE because of a very short timing window.
+                * Follow the recommendations and skip target state waiting.
+                */
+               return 0;
+       }
+
        /*
-        * ACE workaround: don't wait for ROM INIT.
-        * The platform cannot catch ROM_INIT_DONE because of a very short
-        * timing window. Follow the recommendations and skip this part.
+        * step 7:
+        * - Cold/Full boot: wait for ROM init to proceed to download the firmware
+        * - IMR boot: wait for ROM firmware entered (firmware booted up from IMR)
         */
+       if (imr_boot)
+               target_status = FSR_STATE_FW_ENTERED;
+       else
+               target_status = FSR_STATE_INIT_DONE;
 
-       return 0;
+       ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
+                                       chip->rom_status_reg, status,
+                                       (FSR_TO_STATE_CODE(status) == target_status),
+                                       HDA_DSP_REG_POLL_INTERVAL_US,
+                                       chip->rom_init_timeout *
+                                       USEC_PER_MSEC);
+
+       if (!ret)
+               return 0;
+
+       if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
+               dev_err(sdev->dev,
+                       "%s: timeout with rom_status_reg (%#x) read\n",
+                       __func__, chip->rom_status_reg);
 
 err:
        flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX | SOF_DBG_DUMP_OPTIONAL;