Commit a54e016a authored by Michal Wajdeczko's avatar Michal Wajdeczko

drm/xe/guc: Return CTB HXG response DATA0 if no buffer provided

Most of the synchronous GuC HXG action responses are defined in
such a way that only mandatory DATA0 from the HXG header is used
and only in few cases it is more than MBZ (must be zero).

For those cases where HXG action returns just DATA0, return that
value if caller didn't provide buffer for the full response.
Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240112102554.761-1-michal.wajdeczko@intel.com
parent 34e9d836
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
struct g2h_fence { struct g2h_fence {
u32 *response_buffer; u32 *response_buffer;
u32 seqno; u32 seqno;
u32 response_data;
u16 response_len; u16 response_len;
u16 error; u16 error;
u16 hint; u16 hint;
...@@ -45,6 +46,7 @@ struct g2h_fence { ...@@ -45,6 +46,7 @@ struct g2h_fence {
static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer) static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
{ {
g2h_fence->response_buffer = response_buffer; g2h_fence->response_buffer = response_buffer;
g2h_fence->response_data = 0;
g2h_fence->response_len = 0; g2h_fence->response_len = 0;
g2h_fence->fail = false; g2h_fence->fail = false;
g2h_fence->retry = false; g2h_fence->retry = false;
...@@ -780,7 +782,7 @@ static int guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len, ...@@ -780,7 +782,7 @@ static int guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len,
ret = -EIO; ret = -EIO;
} }
return ret > 0 ? response_buffer ? g2h_fence.response_len : 0 : ret; return ret > 0 ? response_buffer ? g2h_fence.response_len : g2h_fence.response_data : ret;
} }
int xe_guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len, int xe_guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len,
...@@ -877,6 +879,8 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len) ...@@ -877,6 +879,8 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len)
} else if (g2h_fence->response_buffer) { } else if (g2h_fence->response_buffer) {
g2h_fence->response_len = hxg_len; g2h_fence->response_len = hxg_len;
memcpy(g2h_fence->response_buffer, hxg, hxg_len * sizeof(u32)); memcpy(g2h_fence->response_buffer, hxg, hxg_len * sizeof(u32));
} else {
g2h_fence->response_data = FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, hxg[0]);
} }
g2h_release_space(ct, GUC_CTB_HXG_MSG_MAX_LEN); g2h_release_space(ct, GUC_CTB_HXG_MSG_MAX_LEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment