hdev->last_open_session_duration_jif =
                jiffies - hdev->last_successful_open_jif;
 
+       hdev->asic_funcs->send_device_activity(hdev, false);
+
        return 0;
 }
 
 
                        size);
 }
 
+int hl_fw_send_device_activity(struct hl_device *hdev, bool open)
+{
+       struct cpucp_packet pkt;
+       int rc;
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.ctl = cpu_to_le32(CPUCP_PACKET_ACTIVE_STATUS_SET << CPUCP_PKT_CTL_OPCODE_SHIFT);
+       pkt.value = cpu_to_le64(open);
+       rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt), 0, NULL);
+       if (rc)
+               dev_err(hdev->dev, "failed to send device activity msg(%u)\n", open);
+
+       return rc;
+}
+
 int hl_fw_send_heartbeat(struct hl_device *hdev)
 {
        struct cpucp_packet hb_pkt;
 
  * @access_dev_mem: access device memory
  * @set_dram_bar_base: set the base of the DRAM BAR
  * @set_engine_cores: set a config command to enigne cores
+ * @send_device_activity: indication to FW about device availability
  */
 struct hl_asic_funcs {
        int (*early_init)(struct hl_device *hdev);
        u64 (*set_dram_bar_base)(struct hl_device *hdev, u64 addr);
        int (*set_engine_cores)(struct hl_device *hdev, u32 *core_ids,
                                        u32 num_cores, u32 core_command);
+       int (*send_device_activity)(struct hl_device *hdev, bool open);
 };
 
 
                                struct cpucp_hbm_row_info *info);
 int hl_fw_dram_pending_row_get(struct hl_device *hdev, u32 *pend_rows_num);
 int hl_fw_cpucp_engine_core_asid_set(struct hl_device *hdev, u32 asid);
+int hl_fw_send_device_activity(struct hl_device *hdev, bool open);
 int hl_pci_bars_map(struct hl_device *hdev, const char * const name[3],
                        bool is_wc[3]);
 int hl_pci_elbi_read(struct hl_device *hdev, u64 addr, u32 *data);
 
                goto out_err;
        }
 
+       rc = hdev->asic_funcs->send_device_activity(hdev, true);
+
        list_add(&hpriv->dev_node, &hdev->fpriv_list);
        mutex_unlock(&hdev->fpriv_list_lock);
 
 
        dev_vrm_attr_grp->attrs = gaudi_vrm_dev_attrs;
 }
 
+static int gaudi_send_device_activity(struct hl_device *hdev, bool open)
+{
+       return 0;
+}
+
 static const struct hl_asic_funcs gaudi_funcs = {
        .early_init = gaudi_early_init,
        .early_fini = gaudi_early_fini,
        .mmu_get_real_page_size = hl_mmu_get_real_page_size,
        .access_dev_mem = hl_access_dev_mem,
        .set_dram_bar_base = gaudi_set_hbm_bar_base,
+       .send_device_activity = gaudi_send_device_activity,
 };
 
 /**
 
        return -EOPNOTSUPP;
 }
 
+int gaudi2_send_device_activity(struct hl_device *hdev, bool open)
+{
+       struct gaudi2_device *gaudi2 = hdev->asic_specific;
+
+       if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q) || hdev->fw_major_version < 37)
+               return 0;
+
+       /* TODO: add check for FW version using minor ver once it's known */
+       return hl_fw_send_device_activity(hdev, open);
+}
+
 static const struct hl_asic_funcs gaudi2_funcs = {
        .early_init = gaudi2_early_init,
        .early_fini = gaudi2_early_fini,
        .access_dev_mem = hl_access_dev_mem,
        .set_dram_bar_base = gaudi2_set_hbm_bar_base,
        .set_engine_cores = gaudi2_set_engine_cores,
+       .send_device_activity = gaudi2_send_device_activity,
 };
 
 void gaudi2_set_asic_funcs(struct hl_device *hdev)
 
                                        u32 offended_addr);
 int gaudi2_init_security(struct hl_device *hdev);
 void gaudi2_ack_protection_bits_errors(struct hl_device *hdev);
+int gaudi2_send_device_activity(struct hl_device *hdev, bool open);
 
 #endif /* GAUDI2P_H_ */
 
        return -EOPNOTSUPP;
 }
 
+static int goya_send_device_activity(struct hl_device *hdev, bool open)
+{
+       return 0;
+}
+
 static const struct hl_asic_funcs goya_funcs = {
        .early_init = goya_early_init,
        .early_fini = goya_early_fini,
        .mmu_get_real_page_size = hl_mmu_get_real_page_size,
        .access_dev_mem = hl_access_dev_mem,
        .set_dram_bar_base = goya_set_ddr_bar_base,
+       .send_device_activity = goya_send_device_activity,
 };
 
 /*
 
  *       passes the max size it allows the CpuCP to write to the structure, to prevent
  *       data corruption in case of mismatched driver/FW versions.
  *       Relevant only to Gaudi.
+ *
+ * CPUCP_PACKET_ACTIVE_STATUS_SET -
+ *       LKD sends FW indication whether device is free or in use, this indication is reported
+ *       also to the BMC.
  */
 
 enum cpucp_packet_id {
        CPUCP_PACKET_RESERVED4,                 /* not used */
        CPUCP_PACKET_RESERVED5,                 /* not used */
        CPUCP_PACKET_MONITOR_DUMP_GET,          /* debugfs */
+       CPUCP_PACKET_RESERVED6,                 /* not used */
+       CPUCP_PACKET_RESERVED7,                 /* not used */
+       CPUCP_PACKET_RESERVED8,                 /* not used */
+       CPUCP_PACKET_RESERVED9,                 /* not used */
+       CPUCP_PACKET_RESERVED10,                /* not used */
+       CPUCP_PACKET_ACTIVE_STATUS_SET,         /* internal */
+       CPUCP_PACKET_ID_MAX                     /* must be last */
 };
 
 #define CPUCP_PACKET_FENCE_VAL 0xFE8CE7A5