Commit eb04985d authored by Rodrigo Vivi's avatar Rodrigo Vivi
Browse files

drm/xe: Wait for success on guc done.



Rather than a constant check on proto and wait not busy,
let's wait for the expected success and then check the
protocol afterwards.

With this, we can now use the regular xe_mmio_wait32
and kill this local need for the wait_for.

Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
parent 2e5be5d5
Loading
Loading
Loading
Loading
+8 −17
Original line number Diff line number Diff line
@@ -22,13 +22,6 @@
#include "i915_reg_defs.h"
#include "gt/intel_gt_regs.h"

#include <linux/delay.h>
/*
 * FIXME: This header has been deemed evil and we need to kill it. Temporarily
 * including so we can use 'wait_for'.
 */
#include "i915_utils.h"

/* TODO: move to common file */
#define GUC_PVC_MOCS_INDEX_MASK		REG_GENMASK(25, 24)
#define PVC_MOCS_UC_INDEX		1
@@ -688,19 +681,17 @@ int xe_guc_send_mmio(struct xe_guc *guc, const u32 *request, u32 len)
	header = xe_mmio_read32(gt, reply_reg);
	if (FIELD_GET(GUC_HXG_MSG_0_TYPE, header) ==
	    GUC_HXG_TYPE_NO_RESPONSE_BUSY) {
#define done ({ header = xe_mmio_read32(gt, reply_reg); \
		FIELD_GET(GUC_HXG_MSG_0_ORIGIN, header) != \
		GUC_HXG_ORIGIN_GUC || \
		FIELD_GET(GUC_HXG_MSG_0_TYPE, header) != \
		GUC_HXG_TYPE_NO_RESPONSE_BUSY; })

		ret = wait_for(done, 1000);
		if (unlikely(ret))
			goto timeout;
		ret = xe_mmio_wait32(gt, reply_reg,
				     FIELD_PREP(GUC_HXG_MSG_0_TYPE,
						GUC_HXG_TYPE_RESPONSE_SUCCESS),
				     GUC_HXG_MSG_0_TYPE, 1000, &header);

		if (unlikely(FIELD_GET(GUC_HXG_MSG_0_ORIGIN, header) !=
			     GUC_HXG_ORIGIN_GUC))
			goto proto;
#undef done
		if (unlikely(ret))
			goto timeout;
	}

	if (FIELD_GET(GUC_HXG_MSG_0_TYPE, header) ==