#define FW_FILE_MAX_SIZE               0x1400000 /* maximum size of 20MB */
 
-#define FW_CPU_STATUS_POLL_INTERVAL_USEC       10000
-
 static char *extract_fw_ver_from_str(const char *fw_str)
 {
        char *str, *fw_ver, *whitespace;
                (status == CPU_BOOT_STATUS_NIC_FW_RDY) ||
                (status == CPU_BOOT_STATUS_READY_TO_BOOT) ||
                (status == CPU_BOOT_STATUS_WAITING_FOR_BOOT_FIT),
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                timeout);
 
        if (rc) {
 {
        int rc;
 
-       /* pldm was added for cases in which we use preboot on pldm and want
-        * to load boot fit, but we can't wait for preboot because it runs
-        * very slowly
-        */
-       if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU) || hdev->pldm)
+       if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))
                return 0;
 
        /*
                le32_to_cpu(dyn_regs->cpu_cmd_status_to_host),
                status,
                FIELD_GET(COMMS_STATUS_STATUS_MASK, status) == expected_status,
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                timeout);
 
        if (rc) {
                status,
                (status == CPU_BOOT_STATUS_READY_TO_BOOT) ||
                (status == CPU_BOOT_STATUS_SRAM_AVAIL),
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                dyn_loader->wait_for_bl_timeout);
        if (rc) {
                dev_err(hdev->dev, "failed to wait for boot\n");
                le32_to_cpu(dyn_loader->comm_desc.cpu_dyn_regs.cpu_boot_status),
                status,
                (status == CPU_BOOT_STATUS_SRAM_AVAIL),
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                fw_loader->cpu_timeout);
        if (rc) {
                dev_err(hdev->dev, "failed to wait for Linux\n");
                goto protocol_err;
        }
 
+       /*
+        * when testing FW load (without Linux) on PLDM we don't want to
+        * wait until boot fit is active as it may take several hours.
+        * instead, we load the bootfit and let it do all initializations in
+        * the background.
+        */
+       if (hdev->pldm && !(hdev->fw_components & FW_TYPE_LINUX))
+               return 0;
+
        rc = hl_fw_dynamic_wait_for_boot_fit_active(hdev, fw_loader);
        if (rc)
                goto protocol_err;
                cpu_boot_status_reg,
                status,
                status == CPU_BOOT_STATUS_WAITING_FOR_BOOT_FIT,
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                fw_loader->boot_fit_timeout);
 
        if (rc) {
                        cpu_msg_status_reg,
                        status,
                        status == CPU_MSG_OK,
-                       FW_CPU_STATUS_POLL_INTERVAL_USEC,
+                       hdev->fw_poll_interval_usec,
                        fw_loader->boot_fit_timeout);
 
                if (rc) {
                (status == CPU_BOOT_STATUS_NIC_FW_RDY) ||
                (status == CPU_BOOT_STATUS_READY_TO_BOOT) ||
                (status == CPU_BOOT_STATUS_SRAM_AVAIL),
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                cpu_timeout);
 
        dev_dbg(hdev->dev, "uboot status = %d\n", status);
                        cpu_boot_status_reg,
                        status,
                        (status == CPU_BOOT_STATUS_BMC_WAITING_SKIPPED),
-                       FW_CPU_STATUS_POLL_INTERVAL_USEC,
+                       hdev->fw_poll_interval_usec,
                        cpu_timeout);
 
                if (rc) {
                cpu_boot_status_reg,
                status,
                (status == CPU_BOOT_STATUS_SRAM_AVAIL),
-               FW_CPU_STATUS_POLL_INTERVAL_USEC,
+               hdev->fw_poll_interval_usec,
                cpu_timeout);
 
        /* Clear message */
 
 #define HL_CPUCP_INFO_TIMEOUT_USEC     10000000 /* 10s */
 #define HL_CPUCP_EEPROM_TIMEOUT_USEC   10000000 /* 10s */
 
+#define HL_FW_STATUS_POLL_INTERVAL_USEC                10000 /* 10ms */
+#define HL_FW_STATUS_PLDM_POLL_INTERVAL_USEC   300000000 /* 300s */
+
 #define HL_PCI_ELBI_TIMEOUT_MSEC       10 /* 10ms */
 
 #define HL_SIM_MAX_TIMEOUT_US          10000000 /* 10s */
  * @last_open_session_duration_jif: duration (jiffies) of the last device open
  *                                  session.
  * @open_counter: number of successful device open operations.
+ * @fw_poll_interval_usec: FW status poll interval in usec.
  * @in_reset: is device in reset flow.
  * @curr_pll_profile: current PLL profile.
  * @card_type: Various ASICs have several card types. This indicates the card
        u64                             last_successful_open_jif;
        u64                             last_open_session_duration_jif;
        u64                             open_counter;
+       u64                             fw_poll_interval_usec;
        atomic_t                        in_reset;
        enum hl_pll_frequency           curr_pll_profile;
        enum cpucp_card_types           card_type;