if (unlikely(evtchnl->state != EVTCHNL_STATE_CONNECTED)) return IRQ_HANDLED;
spin_lock_irqsave(&front_info->io_lock, flags);
again:
rp = evtchnl->u.req.ring.sring->rsp_prod; /* ensure we see queued responses up to rp */
virt_rmb();
for (i = evtchnl->u.req.ring.rsp_cons; i != rp; i++) {
resp = RING_GET_RESPONSE(&evtchnl->u.req.ring, i); if (unlikely(resp->id != evtchnl->evt_id)) continue;
switch (resp->operation) { case XENDISPL_OP_PG_FLIP: case XENDISPL_OP_FB_ATTACH: case XENDISPL_OP_FB_DETACH: case XENDISPL_OP_DBUF_CREATE: case XENDISPL_OP_DBUF_DESTROY: case XENDISPL_OP_SET_CONFIG:
evtchnl->u.req.resp_status = resp->status;
complete(&evtchnl->u.req.completion); break;
default:
DRM_ERROR("Operation %d is not supported\n",
resp->operation); break;
}
}
evtchnl->u.req.ring.rsp_cons = i;
if (i != evtchnl->u.req.ring.req_prod_pvt) { int more_to_do;
RING_FINAL_CHECK_FOR_RESPONSES(&evtchnl->u.req.ring,
more_to_do); if (more_to_do) goto again;
} else {
evtchnl->u.req.ring.sring->rsp_event = i + 1;
}
if (evtchnl->type == EVTCHNL_TYPE_REQ)
page = evtchnl->u.req.ring.sring; elseif (evtchnl->type == EVTCHNL_TYPE_EVT)
page = evtchnl->u.evt.page; if (!page) return;
evtchnl->state = EVTCHNL_STATE_DISCONNECTED;
if (evtchnl->type == EVTCHNL_TYPE_REQ) { /* release all who still waits for response if any */
evtchnl->u.req.resp_status = -EIO;
complete_all(&evtchnl->u.req.completion);
}
if (evtchnl->irq)
unbind_from_irqhandler(evtchnl->irq, evtchnl);
if (evtchnl->port)
xenbus_free_evtchn(front_info->xb_dev, evtchnl->port);
/* end access and free the page */
xenbus_teardown_ring(&page, 1, &evtchnl->gref);
spin_lock_irqsave(&front_info->io_lock, flags); for (i = 0; i < front_info->num_evt_pairs; i++) {
front_info->evt_pairs[i].req.state = state;
front_info->evt_pairs[i].evt.state = state;
}
spin_unlock_irqrestore(&front_info->io_lock, flags);
}
void xen_drm_front_evtchnl_free_all(struct xen_drm_front_info *front_info)
{ int i;
if (!front_info->evt_pairs) return;
for (i = 0; i < front_info->num_evt_pairs; i++) {
evtchnl_free(front_info, &front_info->evt_pairs[i].req);
evtchnl_free(front_info, &front_info->evt_pairs[i].evt);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.