g2h_fence
struct g2h_fence *g2h_fence)
xe_gt_assert(gt, !g2h_len || !g2h_fence);
xe_gt_assert(gt, !num_g2h || !g2h_fence);
if (g2h_fence) {
if (g2h_fence_needs_alloc(g2h_fence)) {
g2h_fence->seqno = next_ct_seqno(ct, true);
g2h_fence->seqno, g2h_fence,
seqno = g2h_fence->seqno;
ret = h2g_write(ct, action, len, seqno, !!g2h_fence);
u32 g2h_len, struct g2h_fence *g2h_fence,
g2h_fence ?
struct g2h_fence *g2h_fence)
xe_gt_assert(gt, !g2h_len || !g2h_fence);
g2h_fence);
if (!guc_ct_send_wait_for_retry(ct, len, g2h_len, g2h_fence,
u32 g2h_len, u32 num_g2h, struct g2h_fence *g2h_fence)
xe_gt_assert(ct_to_gt(ct), !g2h_len || !g2h_fence);
ret = guc_ct_send_locked(ct, action, len, g2h_len, num_g2h, g2h_fence);
struct g2h_fence g2h_fence;
g2h_fence_init(&g2h_fence, response_buffer);
ret = guc_ct_send(ct, action, len, 0, 0, &g2h_fence);
ret = xa_err(xa_store(&ct->fence_lookup, g2h_fence.seqno,
&g2h_fence, GFP_KERNEL));
if (!g2h_fence_needs_alloc(&g2h_fence))
xa_erase(&ct->fence_lookup, g2h_fence.seqno);
ret = wait_event_timeout(ct->g2h_fence_wq, READ_ONCE(g2h_fence.done), HZ);
if (READ_ONCE(g2h_fence.done)) {
g2h_fence.seqno, action[0]);
g2h_fence.seqno, action[0], str_yes_no(g2h_fence.done));
xa_erase(&ct->fence_lookup, g2h_fence.seqno);
if (g2h_fence.retry) {
action[0], g2h_fence.reason);
if (g2h_fence.fail) {
if (g2h_fence.cancel) {
action[0], g2h_fence.error, g2h_fence.hint);
ret = response_buffer ? g2h_fence.response_len : g2h_fence.response_data;
struct g2h_fence *g2h_fence;
g2h_fence = xa_erase(&ct->fence_lookup, fence);
if (unlikely(!g2h_fence)) {
xe_gt_assert(gt, fence == g2h_fence->seqno);
g2h_fence->fail = true;
g2h_fence->error = FIELD_GET(GUC_HXG_FAILURE_MSG_0_ERROR, hxg[0]);
g2h_fence->hint = FIELD_GET(GUC_HXG_FAILURE_MSG_0_HINT, hxg[0]);
g2h_fence->retry = true;
g2h_fence->reason = FIELD_GET(GUC_HXG_RETRY_MSG_0_REASON, hxg[0]);
} else if (g2h_fence->response_buffer) {
g2h_fence->response_len = hxg_len;
memcpy(g2h_fence->response_buffer, hxg, hxg_len * sizeof(u32));
g2h_fence->response_data = FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, hxg[0]);
WRITE_ONCE(g2h_fence->done, true);
static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
memset(g2h_fence, 0, sizeof(*g2h_fence));
g2h_fence->response_buffer = response_buffer;
g2h_fence->seqno = ~0x0;
static void g2h_fence_cancel(struct g2h_fence *g2h_fence)
g2h_fence->cancel = true;
g2h_fence->fail = true;
WRITE_ONCE(g2h_fence->done, true);
static bool g2h_fence_needs_alloc(struct g2h_fence *g2h_fence)
return g2h_fence->seqno == ~0x0;
struct g2h_fence *g2h_fence;
xa_for_each(&ct->fence_lookup, idx, g2h_fence)
g2h_fence_cancel(g2h_fence);