#include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
-#include <asm/intel_pmc_ipc.h>
 #include <asm/intel_punit_ipc.h>
 #include <asm/intel_telemetry.h>
 
 #define TELEM_SSRAM_STARTTIME_OFFSET   8
 #define TELEM_SSRAM_EVTLOG_OFFSET      16
 
+#define IOSS_TELEM                     0xeb
 #define IOSS_TELEM_EVENT_READ          0x0
 #define IOSS_TELEM_EVENT_WRITE         0x1
 #define IOSS_TELEM_INFO_READ           0x2
 #define IOSS_TELEM_TRACE_CTL_WRITE     0x6
 #define IOSS_TELEM_EVENT_CTL_READ      0x7
 #define IOSS_TELEM_EVENT_CTL_WRITE     0x8
-#define IOSS_TELEM_EVT_CTRL_WRITE_SIZE 0x4
-#define IOSS_TELEM_READ_WORD           0x1
-#define IOSS_TELEM_WRITE_FOURBYTES     0x4
 #define IOSS_TELEM_EVT_WRITE_SIZE      0x3
 
 #define TELEM_INFO_SRAMEVTS_MASK       0xFF00
 static inline int telemetry_plt_config_ioss_event(u32 evt_id, int index)
 {
        u32 write_buf;
-       int ret;
 
        write_buf = evt_id | TELEM_EVENT_ENABLE;
        write_buf <<= BITS_PER_BYTE;
        write_buf |= index;
 
-       ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                                   IOSS_TELEM_EVENT_WRITE, (u8 *)&write_buf,
-                                   IOSS_TELEM_EVT_WRITE_SIZE, NULL, 0);
-
-       return ret;
+       return intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
+                                        IOSS_TELEM_EVENT_WRITE, &write_buf,
+                                        IOSS_TELEM_EVT_WRITE_SIZE, NULL, 0);
 }
 
 static inline int telemetry_plt_config_pss_event(u32 evt_id, int index)
 static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
                                         enum telemetry_action action)
 {
+       struct intel_scu_ipc_dev *scu = telm_conf->scu;
        u8 num_ioss_evts, ioss_period;
        int ret, index, idx;
        u32 *ioss_evtmap;
        ioss_evtmap = evtconfig.evtmap;
 
        /* Get telemetry EVENT CTL */
-       ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
+       ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
                                    IOSS_TELEM_EVENT_CTL_READ, NULL, 0,
-                                   &telem_ctrl, IOSS_TELEM_READ_WORD);
+                                   &telem_ctrl, sizeof(telem_ctrl));
        if (ret) {
                pr_err("IOSS TELEM_CTRL Read Failed\n");
                return ret;
        /* Disable Telemetry */
        TELEM_DISABLE(telem_ctrl);
 
-       ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                                   IOSS_TELEM_EVENT_CTL_WRITE,
-                                   (u8 *)&telem_ctrl,
-                                   IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
-                                   NULL, 0);
+       ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
+                                   IOSS_TELEM_EVENT_CTL_WRITE, &telem_ctrl,
+                                   sizeof(telem_ctrl), NULL, 0);
        if (ret) {
                pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
                return ret;
                /* Clear All Events */
                TELEM_CLEAR_EVENTS(telem_ctrl);
 
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
+               ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
                                            IOSS_TELEM_EVENT_CTL_WRITE,
-                                           (u8 *)&telem_ctrl,
-                                           IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
+                                           &telem_ctrl, sizeof(telem_ctrl),
                                            NULL, 0);
                if (ret) {
                        pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
                /* Clear All Events */
                TELEM_CLEAR_EVENTS(telem_ctrl);
 
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
+               ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
                                            IOSS_TELEM_EVENT_CTL_WRITE,
-                                           (u8 *)&telem_ctrl,
-                                           IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
+                                           &telem_ctrl, sizeof(telem_ctrl),
                                            NULL, 0);
                if (ret) {
                        pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
        TELEM_ENABLE_PERIODIC(telem_ctrl);
        telem_ctrl |= ioss_period;
 
-       ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
+       ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
                                    IOSS_TELEM_EVENT_CTL_WRITE,
-                                   (u8 *)&telem_ctrl,
-                                   IOSS_TELEM_EVT_CTRL_WRITE_SIZE, NULL, 0);
+                                   &telem_ctrl, sizeof(telem_ctrl), NULL, 0);
        if (ret) {
                pr_err("IOSS TELEM_CTRL Event Enable Write Failed\n");
                return ret;
        u32 read_buf, events, event_regs;
        int ret;
 
-       ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY, IOSS_TELEM_INFO_READ,
-                                   NULL, 0, &read_buf, IOSS_TELEM_READ_WORD);
+       ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
+                                       IOSS_TELEM_INFO_READ, NULL, 0,
+                                       &read_buf, sizeof(read_buf));
        if (ret) {
                dev_err(&pdev->dev, "IOSS TELEM_INFO Read Failed\n");
                return ret;
 
        mutex_lock(&(telm_conf->telem_lock));
        if (ioss_period) {
+               struct intel_scu_ipc_dev *scu = telm_conf->scu;
+
                if (TELEM_SAMPLE_PERIOD_INVALID(ioss_period)) {
                        pr_err("IOSS Sampling Period Out of Range\n");
                        ret = -EINVAL;
                }
 
                /* Get telemetry EVENT CTL */
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
+               ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
                                            IOSS_TELEM_EVENT_CTL_READ, NULL, 0,
-                                           &telem_ctrl, IOSS_TELEM_READ_WORD);
+                                           &telem_ctrl, sizeof(telem_ctrl));
                if (ret) {
                        pr_err("IOSS TELEM_CTRL Read Failed\n");
                        goto out;
                /* Disable Telemetry */
                TELEM_DISABLE(telem_ctrl);
 
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                                           IOSS_TELEM_EVENT_CTL_WRITE,
-                                           (u8 *)&telem_ctrl,
-                                           IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
-                                           NULL, 0);
+               ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
+                                               IOSS_TELEM_EVENT_CTL_WRITE,
+                                               &telem_ctrl, sizeof(telem_ctrl),
+                                               NULL, 0);
                if (ret) {
                        pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
                        goto out;
                TELEM_ENABLE_PERIODIC(telem_ctrl);
                telem_ctrl |= ioss_period;
 
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                                           IOSS_TELEM_EVENT_CTL_WRITE,
-                                           (u8 *)&telem_ctrl,
-                                           IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
-                                           NULL, 0);
+               ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
+                                               IOSS_TELEM_EVENT_CTL_WRITE,
+                                               &telem_ctrl, sizeof(telem_ctrl),
+                                               NULL, 0);
                if (ret) {
                        pr_err("IOSS TELEM_CTRL Event Enable Write Failed\n");
                        goto out;
                break;
 
        case TELEM_IOSS:
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                               IOSS_TELEM_TRACE_CTL_READ, NULL, 0, &temp,
-                               IOSS_TELEM_READ_WORD);
+               ret = intel_scu_ipc_dev_command(telm_conf->scu,
+                               IOSS_TELEM, IOSS_TELEM_TRACE_CTL_READ,
+                               NULL, 0, &temp, sizeof(temp));
                if (ret) {
                        pr_err("IOSS TRACE_CTL Read Failed\n");
                        goto out;
                break;
 
        case TELEM_IOSS:
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                               IOSS_TELEM_TRACE_CTL_READ, NULL, 0, &temp,
-                               IOSS_TELEM_READ_WORD);
+               ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
+                                               IOSS_TELEM_TRACE_CTL_READ,
+                                               NULL, 0, &temp, sizeof(temp));
                if (ret) {
                        pr_err("IOSS TRACE_CTL Read Failed\n");
                        goto out;
                TELEM_CLEAR_VERBOSITY_BITS(temp);
                TELEM_SET_VERBOSITY_BITS(temp, verbosity);
 
-               ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
-                               IOSS_TELEM_TRACE_CTL_WRITE, (u8 *)&temp,
-                               IOSS_TELEM_WRITE_FOURBYTES, NULL, 0);
+               ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
+                                               IOSS_TELEM_TRACE_CTL_WRITE,
+                                               &temp, sizeof(temp), NULL, 0);
                if (ret) {
                        pr_err("IOSS TRACE_CTL Verbosity Set Failed\n");
                        goto out;
 
        telm_conf->ioss_config.regmap = mem;
 
+       telm_conf->scu = devm_intel_scu_ipc_dev_get(&pdev->dev);
+       if (!telm_conf->scu) {
+               ret = -EPROBE_DEFER;
+               goto out;
+       }
+
        mutex_init(&telm_conf->telem_lock);
        mutex_init(&telm_conf->telem_trace_lock);