From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 266841C5F11 for ; Sun, 31 May 2026 09:13:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780218783; cv=none; b=bN8LRV3Z3/tVFsIrfEusu6UlUa+gfwMgkWGTqIV/pFzJobF2/fM83mqv71KZK6XuJmyy7C/2EGGs1h+VSH4utexmQuinHCq9SIIHermDHOrc/FypDDWFpCBBYVIK9FpEm3n9ljm3NUNXRjkcWlRcDCPNwCLUrcWclYSlZbnB+SE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780218783; c=relaxed/simple; bh=3FlQa9REWN5iMUfk0t4uDf3vMAkXAqY3L8nRbzWillc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=D5BVyc9jU0ur364EWCFxvfs4FMdJUAZRUx8RGbgLHV/84MVaDOdGkan5pNbKWBCVoiZtXivvyROCAVhveu1Y/Kq8jHcjT/3vONHnPe9kmoG/UKNWJDvW6juSZmcYvVjpMjzUXfm8F3Y+zvnnP9uvxxrBgbHDP43erejrjLnv1Us= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=oovTdLo1; arc=none smtp.client-ip=209.85.208.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oovTdLo1" Received: by mail-lj1-f169.google.com with SMTP id 38308e7fff4ca-396775c26f9so2981131fa.3 for ; Sun, 31 May 2026 02:13:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780218779; x=1780823579; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=uRmHNETh8QyxZC3rJbR3SzfLqCNfPMJtwTtAlxccZyQ=; b=oovTdLo1H0iMtEaVltsax2MyVJzkh55X6OXdNBaIXeLFgny8rkq+GuUz4Q2oNhmzIU PwarLAOnHUKvj6L73WD3Sa4q2HOAcrMEPHwEslkKesfVsVtnIRxY9CDLMiu45urvtkov cefn/R2INukuZRcDFFTmgVT/OCJ9kn2oUHftyuCcZ5PUoq0x7WwYad3i+ja1D89Czuw0 xkHuzOeLUwi/t9Kr9pyntOV1nNSTOzQGskiJr34J07U/AISXiRG8anC0U1lVE+t7Phgz 9GvsPaz1D0xEHdOKk4dGYhyk/jtbUIcRNsKJrNjXaSAuTOp/NYQQ6AJQnpGd785Lzvco GO2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780218779; x=1780823579; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=uRmHNETh8QyxZC3rJbR3SzfLqCNfPMJtwTtAlxccZyQ=; b=Xhd4MbFga7YaFsTrxb49mOuFKYkrxofhSnf6iBRB4Xsiqc28TtfYU3pXetxZFvdZjU aTaKAoW+xb2oOCjnAk9JQ58KCVPYMHZMLT4atGv8Jf1Gk2iv4E0hqoOu//SaQAhczOde UkDnLK7wJnHCqgQsNaYbYOoJpzOgUvschSuEDiieWNP8GMaxdMMK5F4lYaqtqSojkvYA r1xNI8CHFBKim83MTENay+c2Kki6YUv6uhjF6utOpCKJVOgVz6u1yUm4gEYiSMpS/N21 cSYq8rHJPAPwbw75+CO5MBxCdrYJayFlN9xqD1KMp9kMWYlTVQYoBMkm9NWcKsN4GEfI 9V9Q== X-Forwarded-Encrypted: i=1; AFNElJ+jpBboFSBnoYuYe+LSdFhhysupT0Ir/06HE1kY0Kzw9HwqO6Db/tW2e7FoYGV4DGvf85nfcBM1vhje8UU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywm6PikdlROwwVk4Em0uv5OeLxCm5xsaaIOAVNibXAv+/fb7zsJ 6KrcaaeDrEhou1RR6y1IUJ8UvEkbH1oDw7pNvweLJeDTd4v8GeKU09Hd X-Gm-Gg: Acq92OGUxy5MiHX4HvAi0n6EtZ/+GeesqGb0YJaCclZzZ0V8MnXXAQ32VWvnv6xMALM TKxDtlVOus2gVS/1YgyGxmUetcICuBqCpm1gcD/RWp+I1/cw/JtDmKL8ZA8fBAniAfdzVNCdsX6 qIZs+jXlPVh2ANU1urP54K3Py03KBFdRQmRq/6T7ESeQaXRst/Rma3ww+Utuc/YegLoby7sIoVQ PQNap2u1Om9nlbZMVocHqMZSyGi6nXG7eOH3H5n51l3lM7CpytX/SDvdoFoWbNhvVG04+BYWyBc SvFiCIQgUV+XF/CTjHl+QIyD+Arzm5zKkhrvkIdfLnStNhq6Vd7QjbBNTRyATA55I3thuVZMeXv w5dXMpmVF1tu64/1fRN1dpKp1ZL5W7COkL4coozSINvT3j124Yldt/9YIEzncwjmAb661ID8qqF F/LfKQ0iiU3v7zX0QOmIw0/+GzS08j1jQ4FEXRvKDuhI2HQXlKsuSr5UZpF3SIlXWuXBA= X-Received: by 2002:a05:651c:154d:b0:396:7b8a:3da0 with SMTP id 38308e7fff4ca-3967b8a400dmr4158141fa.26.1780218779027; Sun, 31 May 2026 02:12:59 -0700 (PDT) Received: from Shofiq.home (87-92-218-151.rev.dnainternet.fi. [87.92.218.151]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-39659e86230sm15042351fa.40.2026.05.31.02.12.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 02:12:58 -0700 (PDT) From: Md Shofiqul Islam To: maciej.falkowski@linux.intel.com, karol.wachowski@linux.intel.com Cc: ogabbay@kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Md Shofiqul Islam Subject: [PATCH 2/2] drm/accel/ivpu: send exact IPC message size instead of union size Date: Sun, 31 May 2026 12:12:56 +0300 Message-ID: <20260531091256.1783-1-shofiqtest@gmail.com> X-Mailer: git-send-email 2.51.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The IPC header data_size field is documented to carry the size of the JSM payload. Previously it was always set to sizeof(struct vpu_jsm_msg) which is the size of the full union of all possible payloads, not the size of the specific message being sent. Introduce two helpers in ivpu_ipc.h: IVPU_JSM_MSG_BASE_SIZE -- header-only size for messages with no payload IVPU_JSM_MSG_SIZE(m) -- header + sizeof(payload.m) for messages that carry a specific payload member Thread an explicit msg_size argument through ivpu_ipc_tx_prepare(), ivpu_ipc_send(), ivpu_ipc_send_receive_internal(), ivpu_ipc_send_receive() and ivpu_ipc_send_and_wait(), then update all 25 call-sites in ivpu_jsm_msg.c to pass the appropriate size. This resolves the TODO comment added in commit introducing the IPC layer. Signed-off-by: Md Shofiqul Islam --- drivers/accel/ivpu/ivpu_ipc.c | 27 ++++++----- drivers/accel/ivpu/ivpu_ipc.h | 16 +++++-- drivers/accel/ivpu/ivpu_jsm_msg.c | 75 ++++++++++++++++++++----------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c index f47df092b..0c042a7ee 100644 --- a/drivers/accel/ivpu/ivpu_ipc.c +++ b/drivers/accel/ivpu/ivpu_ipc.c @@ -65,7 +65,7 @@ static void ivpu_ipc_mem_fini(struct ivpu_device *vdev) static int ivpu_ipc_tx_prepare(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, - struct vpu_jsm_msg *req) + struct vpu_jsm_msg *req, u32 msg_size) { struct ivpu_ipc_info *ipc = vdev->ipc; struct ivpu_ipc_tx_buf *tx_buf; @@ -97,8 +97,7 @@ ivpu_ipc_tx_prepare(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, memset(tx_buf, 0, sizeof(*tx_buf)); tx_buf->ipc.data_addr = jsm_vpu_addr; - /* TODO: Set data_size to actual JSM message size, not union of all messages */ - tx_buf->ipc.data_size = sizeof(*req); + tx_buf->ipc.data_size = msg_size; tx_buf->ipc.channel = cons->channel; tx_buf->ipc.src_node = 0; tx_buf->ipc.dst_node = 1; @@ -210,7 +209,8 @@ void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *c ivpu_ipc_tx_release(vdev, cons->tx_vpu_addr); } -int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, struct vpu_jsm_msg *req) +int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, + struct vpu_jsm_msg *req, u32 msg_size) { struct ivpu_ipc_info *ipc = vdev->ipc; int ret; @@ -222,7 +222,7 @@ int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, stru goto unlock; } - ret = ivpu_ipc_tx_prepare(vdev, cons, req); + ret = ivpu_ipc_tx_prepare(vdev, cons, req, msg_size); if (ret) goto unlock; @@ -296,7 +296,8 @@ int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, int ivpu_ipc_send_receive_internal(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) + struct vpu_jsm_msg *resp, u32 channel, unsigned long timeout_ms, + u32 msg_size) { struct ivpu_ipc_consumer cons; int ret; @@ -306,7 +307,7 @@ ivpu_ipc_send_receive_internal(struct ivpu_device *vdev, struct vpu_jsm_msg *req ivpu_ipc_consumer_add(vdev, &cons, channel, NULL); - ret = ivpu_ipc_send(vdev, &cons, req); + ret = ivpu_ipc_send(vdev, &cons, req, msg_size); if (ret) { ivpu_warn_ratelimited(vdev, "IPC send failed: %d\n", ret); goto consumer_del; @@ -331,7 +332,7 @@ ivpu_ipc_send_receive_internal(struct ivpu_device *vdev, struct vpu_jsm_msg *req 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) + u32 channel, unsigned long timeout_ms, u32 msg_size) { struct vpu_jsm_msg hb_req = { .type = VPU_JSM_MSG_QUERY_ENGINE_HB }; struct vpu_jsm_msg hb_resp; @@ -341,13 +342,15 @@ int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req, if (ret < 0) return ret; - ret = ivpu_ipc_send_receive_internal(vdev, req, expected_resp, resp, channel, timeout_ms); + ret = ivpu_ipc_send_receive_internal(vdev, req, expected_resp, resp, channel, timeout_ms, + msg_size); if (ret != -ETIMEDOUT) goto rpm_put; hb_ret = ivpu_ipc_send_receive_internal(vdev, &hb_req, VPU_JSM_MSG_QUERY_ENGINE_HB_DONE, &hb_resp, VPU_IPC_CHAN_ASYNC_CMD, - vdev->timeout.jsm); + vdev->timeout.jsm, + IVPU_JSM_MSG_BASE_SIZE); if (hb_ret == -ETIMEDOUT) ivpu_pm_trigger_recovery(vdev, "IPC timeout"); @@ -357,7 +360,7 @@ int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req, } int ivpu_ipc_send_and_wait(struct ivpu_device *vdev, struct vpu_jsm_msg *req, - u32 channel, unsigned long timeout_ms) + u32 channel, unsigned long timeout_ms, u32 msg_size) { struct ivpu_ipc_consumer cons; int ret; @@ -368,7 +371,7 @@ int ivpu_ipc_send_and_wait(struct ivpu_device *vdev, struct vpu_jsm_msg *req, ivpu_ipc_consumer_add(vdev, &cons, channel, NULL); - ret = ivpu_ipc_send(vdev, &cons, req); + ret = ivpu_ipc_send(vdev, &cons, req, msg_size); if (ret) { ivpu_warn_ratelimited(vdev, "IPC send failed: %d\n", ret); goto consumer_del; diff --git a/drivers/accel/ivpu/ivpu_ipc.h b/drivers/accel/ivpu/ivpu_ipc.h index b524a1985..c1b2ef3d7 100644 --- a/drivers/accel/ivpu/ivpu_ipc.h +++ b/drivers/accel/ivpu/ivpu_ipc.h @@ -11,6 +11,13 @@ #include "vpu_jsm_api.h" +/* Size of a JSM message with no payload */ +#define IVPU_JSM_MSG_BASE_SIZE ((u32)offsetof(struct vpu_jsm_msg, payload)) +/* Size of a JSM message with a specific payload member */ +#define IVPU_JSM_MSG_SIZE(member) \ + ((u32)(offsetof(struct vpu_jsm_msg, payload) + \ + sizeof(((struct vpu_jsm_msg *)0)->payload.member))) + struct ivpu_bo; /* VPU FW boot notification */ @@ -97,17 +104,18 @@ void ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *c void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons); int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, - struct vpu_jsm_msg *req); + struct vpu_jsm_msg *req, u32 msg_size); int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, struct ivpu_ipc_hdr *ipc_buf, struct vpu_jsm_msg *jsm_msg, unsigned long timeout_ms); int ivpu_ipc_send_receive_internal(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); + struct vpu_jsm_msg *resp, u32 channel, unsigned long timeout_ms, + u32 msg_size); 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); + u32 channel, unsigned long timeout_ms, u32 msg_size); int ivpu_ipc_send_and_wait(struct ivpu_device *vdev, struct vpu_jsm_msg *req, - u32 channel, unsigned long timeout_ms); + u32 channel, unsigned long timeout_ms, u32 msg_size); #endif /* __IVPU_IPC_H__ */ diff --git a/drivers/accel/ivpu/ivpu_jsm_msg.c b/drivers/accel/ivpu/ivpu_jsm_msg.c index 07b1d6f61..a74f5aed8 100644 --- a/drivers/accel/ivpu/ivpu_jsm_msg.c +++ b/drivers/accel/ivpu/ivpu_jsm_msg.c @@ -105,7 +105,8 @@ int ivpu_jsm_register_db(struct ivpu_device *vdev, u32 ctx_id, u32 db_id, req.payload.register_db.host_ssid = ctx_id; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_REGISTER_DB_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(register_db)); if (ret) ivpu_err_ratelimited(vdev, "Failed to register doorbell %u: %d\n", db_id, ret); @@ -121,7 +122,8 @@ int ivpu_jsm_unregister_db(struct ivpu_device *vdev, u32 db_id) req.payload.unregister_db.db_idx = db_id; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_UNREGISTER_DB_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(unregister_db)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to unregister doorbell %u: %d\n", db_id, ret); @@ -140,7 +142,8 @@ int ivpu_jsm_get_heartbeat(struct ivpu_device *vdev, u32 engine, u64 *heartbeat) req.payload.query_engine_hb.engine_idx = engine; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_QUERY_ENGINE_HB_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(query_engine_hb)); if (ret) { ivpu_err_ratelimited(vdev, "Failed to get heartbeat from engine %d: %d\n", engine, ret); @@ -162,7 +165,8 @@ int ivpu_jsm_reset_engine(struct ivpu_device *vdev, u32 engine, struct vpu_jsm_m req.payload.engine_reset.engine_idx = engine; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_ENGINE_RESET_DONE, resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(engine_reset)); if (ret) { ivpu_err_ratelimited(vdev, "Failed to reset engine %d: %d\n", engine, ret); ivpu_pm_trigger_recovery(vdev, "Engine reset failed"); @@ -187,7 +191,8 @@ int ivpu_jsm_preempt_engine(struct ivpu_device *vdev, u32 engine, u32 preempt_id req.payload.engine_preempt.preempt_id = preempt_id; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_ENGINE_PREEMPT_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(engine_preempt)); if (ret) ivpu_err_ratelimited(vdev, "Failed to preempt engine %d: %d\n", engine, ret); @@ -203,7 +208,8 @@ int ivpu_jsm_dyndbg_control(struct ivpu_device *vdev, char *command, size_t size strscpy(req.payload.dyndbg_control.dyndbg_cmd, command, VPU_DYNDBG_CMD_MAX_LEN); ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_DYNDBG_CONTROL_RSP, &resp, - VPU_IPC_CHAN_GEN_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_GEN_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(dyndbg_control)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to send command \"%s\": ret %d\n", command, ret); @@ -219,7 +225,8 @@ int ivpu_jsm_trace_get_capability(struct ivpu_device *vdev, u32 *trace_destinati int ret; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_TRACE_GET_CAPABILITY_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_BASE_SIZE); if (ret) { ivpu_warn_ratelimited(vdev, "Failed to get trace capability: %d\n", ret); return ret; @@ -243,7 +250,8 @@ int ivpu_jsm_trace_set_config(struct ivpu_device *vdev, u32 trace_level, u32 tra req.payload.trace_config.trace_hw_component_mask = trace_hw_component_mask; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_TRACE_SET_CONFIG_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(trace_config)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to set config: %d\n", ret); @@ -259,7 +267,8 @@ int ivpu_jsm_context_release(struct ivpu_device *vdev, u32 host_ssid) req.payload.ssid_release.host_ssid = host_ssid; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_SSID_RELEASE_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(ssid_release)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to release context: %d\n", ret); @@ -278,7 +287,8 @@ int ivpu_jsm_pwr_d0i3_enter(struct ivpu_device *vdev) req.payload.pwr_d0i3_enter.send_response = 1; ret = ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_PWR_D0I3_ENTER_DONE, &resp, - VPU_IPC_CHAN_GEN_CMD, vdev->timeout.d0i3_entry_msg); + VPU_IPC_CHAN_GEN_CMD, vdev->timeout.d0i3_entry_msg, + IVPU_JSM_MSG_SIZE(pwr_d0i3_enter)); if (ret) return ret; @@ -301,7 +311,8 @@ int ivpu_jsm_hws_create_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_grou req.payload.hws_create_cmdq.cmdq_size = cmdq_size; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_CREATE_CMD_QUEUE_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_create_cmdq)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to create command queue: %d\n", ret); @@ -318,7 +329,8 @@ int ivpu_jsm_hws_destroy_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id) req.payload.hws_destroy_cmdq.cmdq_id = cmdq_id; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_DESTROY_CMD_QUEUE_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_destroy_cmdq)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to destroy command queue: %d\n", ret); @@ -339,7 +351,8 @@ int ivpu_jsm_hws_register_db(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id, req.payload.hws_register_db.cmdq_size = cmdq_size; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_REGISTER_DB_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_register_db)); if (ret) ivpu_err_ratelimited(vdev, "Failed to register doorbell %u: %d\n", db_id, ret); @@ -358,7 +371,8 @@ int ivpu_jsm_hws_resume_engine(struct ivpu_device *vdev, u32 engine) req.payload.hws_resume_engine.engine_idx = engine; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_HWS_RESUME_ENGINE_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_resume_engine)); if (ret) { ivpu_err_ratelimited(vdev, "Failed to resume engine %d: %d\n", engine, ret); ivpu_pm_trigger_recovery(vdev, "Engine resume failed"); @@ -384,7 +398,8 @@ int ivpu_jsm_hws_set_context_sched_properties(struct ivpu_device *vdev, u32 ctx_ req.payload.hws_set_context_sched_properties.grace_period_lower_priority = 0; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_SET_CONTEXT_SCHED_PROPERTIES_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_set_context_sched_properties)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to set context sched properties: %d\n", ret); @@ -404,7 +419,8 @@ int ivpu_jsm_hws_set_scheduling_log(struct ivpu_device *vdev, u32 engine_idx, u3 req.payload.hws_set_scheduling_log.notify_index = 0; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_HWS_SET_SCHEDULING_LOG_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_set_scheduling_log)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to set scheduling log: %d\n", ret); @@ -429,7 +445,8 @@ int ivpu_jsm_hws_setup_priority_bands(struct ivpu_device *vdev) setup->normal_band_percentage = 10; ret = ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP_RSP, - &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(hws_priority_band_setup)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to set priority bands: %d\n", ret); @@ -449,7 +466,8 @@ int ivpu_jsm_metric_streamer_start(struct ivpu_device *vdev, u64 metric_group_ma req.payload.metric_streamer_start.buffer_size = buffer_size; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_START_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(metric_streamer_start)); if (ret) { ivpu_warn_ratelimited(vdev, "Failed to start metric streamer: ret %d\n", ret); return ret; @@ -467,7 +485,8 @@ int ivpu_jsm_metric_streamer_stop(struct ivpu_device *vdev, u64 metric_group_mas req.payload.metric_streamer_stop.metric_group_mask = metric_group_mask; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_STOP_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(metric_streamer_stop)); if (ret) ivpu_warn_ratelimited(vdev, "Failed to stop metric streamer: ret %d\n", ret); @@ -486,7 +505,8 @@ int ivpu_jsm_metric_streamer_update(struct ivpu_device *vdev, u64 metric_group_m req.payload.metric_streamer_update.buffer_size = buffer_size; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_UPDATE_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(metric_streamer_update)); if (ret) { ivpu_warn_ratelimited(vdev, "Failed to update metric streamer: ret %d\n", ret); return ret; @@ -515,7 +535,8 @@ int ivpu_jsm_metric_streamer_info(struct ivpu_device *vdev, u64 metric_group_mas req.payload.metric_streamer_start.buffer_size = buffer_size; ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_INFO_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(metric_streamer_start)); if (ret) { ivpu_warn_ratelimited(vdev, "Failed to get metric streamer info: ret %d\n", ret); return ret; @@ -543,7 +564,8 @@ int ivpu_jsm_dct_enable(struct ivpu_device *vdev, u32 active_us, u32 inactive_us req.payload.pwr_dct_control.dct_inactive_us = inactive_us; return ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_DCT_ENABLE_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_SIZE(pwr_dct_control)); } int ivpu_jsm_dct_disable(struct ivpu_device *vdev) @@ -552,7 +574,8 @@ int ivpu_jsm_dct_disable(struct ivpu_device *vdev) struct vpu_jsm_msg resp; return ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_DCT_DISABLE_DONE, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_BASE_SIZE); } int ivpu_jsm_state_dump(struct ivpu_device *vdev) @@ -561,7 +584,8 @@ int ivpu_jsm_state_dump(struct ivpu_device *vdev) struct vpu_jsm_msg resp; return ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_STATE_DUMP_RSP, &resp, - VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); + VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm, + IVPU_JSM_MSG_BASE_SIZE); } int ivpu_jsm_state_dump_no_reply(struct ivpu_device *vdev) @@ -569,5 +593,6 @@ int ivpu_jsm_state_dump_no_reply(struct ivpu_device *vdev) struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_STATE_DUMP }; return ivpu_ipc_send_and_wait(vdev, &req, VPU_IPC_CHAN_ASYNC_CMD, - vdev->timeout.state_dump_msg); + vdev->timeout.state_dump_msg, + IVPU_JSM_MSG_BASE_SIZE); } -- 2.51.1