// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
 /* Copyright(c) 2020 Intel Corporation */
+#include <linux/iopoll.h>
 #include <adf_accel_devices.h>
 #include <adf_common_drv.h>
 #include <adf_pf2vf_msg.h>
        ADF_CSR_WR(addr, ADF_4XXX_SMIAPF_MASK_OFFSET, 0);
 }
 
+static int adf_init_device(struct adf_accel_dev *accel_dev)
+{
+       void __iomem *addr;
+       u32 status;
+       u32 csr;
+       int ret;
+
+       addr = (&GET_BARS(accel_dev)[ADF_4XXX_PMISC_BAR])->virt_addr;
+
+       /* Temporarily mask PM interrupt */
+       csr = ADF_CSR_RD(addr, ADF_4XXX_ERRMSK2);
+       csr |= ADF_4XXX_PM_SOU;
+       ADF_CSR_WR(addr, ADF_4XXX_ERRMSK2, csr);
+
+       /* Set DRV_ACTIVE bit to power up the device */
+       ADF_CSR_WR(addr, ADF_4XXX_PM_INTERRUPT, ADF_4XXX_PM_DRV_ACTIVE);
+
+       /* Poll status register to make sure the device is powered up */
+       ret = read_poll_timeout(ADF_CSR_RD, status,
+                               status & ADF_4XXX_PM_INIT_STATE,
+                               ADF_4XXX_PM_POLL_DELAY_US,
+                               ADF_4XXX_PM_POLL_TIMEOUT_US, true, addr,
+                               ADF_4XXX_PM_STATUS);
+       if (ret)
+               dev_err(&GET_DEV(accel_dev), "Failed to power up the device\n");
+
+       return ret;
+}
+
 static int adf_enable_pf2vf_comms(struct adf_accel_dev *accel_dev)
 {
        return 0;
        hw_data->exit_arb = adf_exit_arb;
        hw_data->get_arb_mapping = adf_get_arbiter_mapping;
        hw_data->enable_ints = adf_enable_ints;
+       hw_data->init_device = adf_init_device;
        hw_data->reset_device = adf_reset_flr;
        hw_data->admin_ae_mask = ADF_4XXX_ADMIN_AE_MASK;
        hw_data->uof_get_num_objs = uof_get_num_objs;
 
 #define ADF_4XXX_ADMINMSGLR_OFFSET     (0x500578)
 #define ADF_4XXX_MAILBOX_BASE_OFFSET   (0x600970)
 
+/* Power management */
+#define ADF_4XXX_PM_POLL_DELAY_US      20
+#define ADF_4XXX_PM_POLL_TIMEOUT_US    USEC_PER_SEC
+#define ADF_4XXX_PM_STATUS             (0x50A00C)
+#define ADF_4XXX_PM_INTERRUPT          (0x50A028)
+#define ADF_4XXX_PM_DRV_ACTIVE         BIT(20)
+#define ADF_4XXX_PM_INIT_STATE         BIT(21)
+/* Power management source in ERRSOU2 and ERRMSK2 */
+#define ADF_4XXX_PM_SOU                        BIT(18)
+
 /* Firmware Binaries */
 #define ADF_4XXX_FW            "qat_4xxx.bin"
 #define ADF_4XXX_MMP           "qat_4xxx_mmp.bin"