From: Karol Wachowski <karol.wachow...@linux.intel.com>

Split ivpu_ipc_send_receive() implementation to have a version
that does not call pm_runtime_resume_and_get(). That implementation
can be invoked when device is up and runtime resume is prohibited
(for example at the end of boot sequence).

Signed-off-by: Karol Wachowski <karol.wachow...@linux.intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
Signed-off-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
---
 drivers/accel/ivpu/ivpu_ipc.c | 33 ++++++++++++++++++++++-----------
 drivers/accel/ivpu/ivpu_ipc.h |  8 +++++---
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c
index a4ca40b184d4..962b3bcca460 100644
--- a/drivers/accel/ivpu/ivpu_ipc.c
+++ b/drivers/accel/ivpu/ivpu_ipc.c
@@ -285,23 +285,20 @@ ivpu_ipc_send_receive_internal(struct ivpu_device *vdev, 
struct vpu_jsm_msg *req
        return ret;
 }
 
-int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
-                         enum vpu_ipc_msg_type expected_resp_type,
-                         struct vpu_jsm_msg *resp, u32 channel,
-                         unsigned long timeout_ms)
+int ivpu_ipc_send_receive_active(struct ivpu_device *vdev, struct vpu_jsm_msg 
*req,
+                                enum vpu_ipc_msg_type expected_resp, struct 
vpu_jsm_msg *resp,
+                                u32 channel, unsigned long timeout_ms)
 {
        struct vpu_jsm_msg hb_req = { .type = VPU_JSM_MSG_QUERY_ENGINE_HB };
        struct vpu_jsm_msg hb_resp;
        int ret, hb_ret;
 
-       ret = ivpu_rpm_get(vdev);
-       if (ret < 0)
-               return ret;
+       drm_WARN_ON(&vdev->drm,
+                   vdev->drm.dev->power.runtime_status == RPM_SUSPENDED);
 
-       ret = ivpu_ipc_send_receive_internal(vdev, req, expected_resp_type, 
resp,
-                                            channel, timeout_ms);
+       ret = ivpu_ipc_send_receive_internal(vdev, req, expected_resp, resp, 
channel, timeout_ms);
        if (ret != -ETIMEDOUT)
-               goto rpm_put;
+               return ret;
 
        hb_ret = ivpu_ipc_send_receive_internal(vdev, &hb_req, 
VPU_JSM_MSG_QUERY_ENGINE_HB_DONE,
                                                &hb_resp, 
VPU_IPC_CHAN_ASYNC_CMD,
@@ -311,7 +308,21 @@ int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct 
vpu_jsm_msg *req,
                ivpu_pm_schedule_recovery(vdev);
        }
 
-rpm_put:
+       return ret;
+}
+
+int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
+                         enum vpu_ipc_msg_type expected_resp, struct 
vpu_jsm_msg *resp,
+                         u32 channel, unsigned long timeout_ms)
+{
+       int ret;
+
+       ret = ivpu_rpm_get(vdev);
+       if (ret < 0)
+               return ret;
+
+       ret = ivpu_ipc_send_receive_active(vdev, req, expected_resp, resp, 
channel, timeout_ms);
+
        ivpu_rpm_put(vdev);
        return ret;
 }
diff --git a/drivers/accel/ivpu/ivpu_ipc.h b/drivers/accel/ivpu/ivpu_ipc.h
index 68f5b6668e00..6918db23daa4 100644
--- a/drivers/accel/ivpu/ivpu_ipc.h
+++ b/drivers/accel/ivpu/ivpu_ipc.h
@@ -85,9 +85,11 @@ int ivpu_ipc_receive(struct ivpu_device *vdev, struct 
ivpu_ipc_consumer *cons,
                     struct ivpu_ipc_hdr *ipc_buf, struct vpu_jsm_msg 
*ipc_payload,
                     unsigned long timeout_ms);
 
+int ivpu_ipc_send_receive_active(struct ivpu_device *vdev, struct vpu_jsm_msg 
*req,
+                                enum vpu_ipc_msg_type expected_resp, struct 
vpu_jsm_msg *resp,
+                                u32 channel, unsigned long timeout_ms);
 int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
-                         enum vpu_ipc_msg_type expected_resp_type,
-                         struct vpu_jsm_msg *resp, u32 channel,
-                         unsigned long timeout_ms);
+                         enum vpu_ipc_msg_type expected_resp, struct 
vpu_jsm_msg *resp,
+                         u32 channel, unsigned long timeout_ms);
 
 #endif /* __IVPU_IPC_H__ */
-- 
2.25.1

Reply via email to