Skip to content

Commit

Permalink
drm/xe/guc: Fix handling of GUC_HXG_TYPE_NO_RESPONSE_BUSY
Browse files Browse the repository at this point in the history
If GuC responds with the NO_RESPONSE_BUSY message, we extend
our timeout while waiting for the actual response, but we wrongly
assumed that the next message will be RESPONSE_SUCCESS, missing
that we still can get RESPONSE_FAILURE.

Change the condition for the expected message type, using only
common bits from RESPONSE_SUCCESS and RESPONSE_FAILURE (as they
differ, by ABI design, only by the last bit).

v2: add comment/checks to the code (Matt)

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
  • Loading branch information
Michal Wajdeczko authored and Rodrigo Vivi committed Dec 21, 2023
1 parent cd1c9c5 commit 1d087cb
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions drivers/gpu/drm/xe/xe_guc.c
Original file line number Diff line number Diff line change
Expand Up @@ -659,9 +659,20 @@ int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request,
header = xe_mmio_read32(gt, reply_reg);
if (FIELD_GET(GUC_HXG_MSG_0_TYPE, header) ==
GUC_HXG_TYPE_NO_RESPONSE_BUSY) {

ret = xe_mmio_wait32(gt, reply_reg, GUC_HXG_MSG_0_TYPE,
FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_RESPONSE_SUCCESS),
/*
* Once we got a BUSY reply we must wait again for the final
* response but this time we can't use ORIGIN mask anymore.
* To spot a right change in the reply, we take advantage that
* response SUCCESS and FAILURE differ only by the single bit
* and all other bits are set and can be used as a new mask.
*/
u32 resp_bits = GUC_HXG_TYPE_RESPONSE_SUCCESS & GUC_HXG_TYPE_RESPONSE_FAILURE;
u32 resp_mask = FIELD_PREP(GUC_HXG_MSG_0_TYPE, resp_bits);

BUILD_BUG_ON(FIELD_MAX(GUC_HXG_MSG_0_TYPE) != GUC_HXG_TYPE_RESPONSE_SUCCESS);
BUILD_BUG_ON((GUC_HXG_TYPE_RESPONSE_SUCCESS ^ GUC_HXG_TYPE_RESPONSE_FAILURE) != 1);

ret = xe_mmio_wait32(gt, reply_reg, resp_mask, resp_mask,
1000000, &header, false);

if (unlikely(FIELD_GET(GUC_HXG_MSG_0_ORIGIN, header) !=
Expand Down

0 comments on commit 1d087cb

Please sign in to comment.