Lines Matching refs:evtchnl
25 struct xen_drm_front_evtchnl *evtchnl = dev_id; in evtchnl_interrupt_ctrl() local
26 struct xen_drm_front_info *front_info = evtchnl->front_info; in evtchnl_interrupt_ctrl()
31 if (unlikely(evtchnl->state != EVTCHNL_STATE_CONNECTED)) in evtchnl_interrupt_ctrl()
37 rp = evtchnl->u.req.ring.sring->rsp_prod; in evtchnl_interrupt_ctrl()
41 for (i = evtchnl->u.req.ring.rsp_cons; i != rp; i++) { in evtchnl_interrupt_ctrl()
42 resp = RING_GET_RESPONSE(&evtchnl->u.req.ring, i); in evtchnl_interrupt_ctrl()
43 if (unlikely(resp->id != evtchnl->evt_id)) in evtchnl_interrupt_ctrl()
53 evtchnl->u.req.resp_status = resp->status; in evtchnl_interrupt_ctrl()
54 complete(&evtchnl->u.req.completion); in evtchnl_interrupt_ctrl()
64 evtchnl->u.req.ring.rsp_cons = i; in evtchnl_interrupt_ctrl()
66 if (i != evtchnl->u.req.ring.req_prod_pvt) { in evtchnl_interrupt_ctrl()
69 RING_FINAL_CHECK_FOR_RESPONSES(&evtchnl->u.req.ring, in evtchnl_interrupt_ctrl()
74 evtchnl->u.req.ring.sring->rsp_event = i + 1; in evtchnl_interrupt_ctrl()
83 struct xen_drm_front_evtchnl *evtchnl = dev_id; in evtchnl_interrupt_evt() local
84 struct xen_drm_front_info *front_info = evtchnl->front_info; in evtchnl_interrupt_evt()
85 struct xendispl_event_page *page = evtchnl->u.evt.page; in evtchnl_interrupt_evt()
89 if (unlikely(evtchnl->state != EVTCHNL_STATE_CONNECTED)) in evtchnl_interrupt_evt()
104 if (unlikely(event->id != evtchnl->evt_id++)) in evtchnl_interrupt_evt()
109 xen_drm_front_on_frame_done(front_info, evtchnl->index, in evtchnl_interrupt_evt()
124 struct xen_drm_front_evtchnl *evtchnl) in evtchnl_free() argument
128 if (evtchnl->type == EVTCHNL_TYPE_REQ) in evtchnl_free()
129 page = (unsigned long)evtchnl->u.req.ring.sring; in evtchnl_free()
130 else if (evtchnl->type == EVTCHNL_TYPE_EVT) in evtchnl_free()
131 page = (unsigned long)evtchnl->u.evt.page; in evtchnl_free()
135 evtchnl->state = EVTCHNL_STATE_DISCONNECTED; in evtchnl_free()
137 if (evtchnl->type == EVTCHNL_TYPE_REQ) { in evtchnl_free()
139 evtchnl->u.req.resp_status = -EIO; in evtchnl_free()
140 complete_all(&evtchnl->u.req.completion); in evtchnl_free()
143 if (evtchnl->irq) in evtchnl_free()
144 unbind_from_irqhandler(evtchnl->irq, evtchnl); in evtchnl_free()
146 if (evtchnl->port) in evtchnl_free()
147 xenbus_free_evtchn(front_info->xb_dev, evtchnl->port); in evtchnl_free()
150 if (evtchnl->gref != GRANT_INVALID_REF) in evtchnl_free()
151 gnttab_end_foreign_access(evtchnl->gref, 0, page); in evtchnl_free()
153 memset(evtchnl, 0, sizeof(*evtchnl)); in evtchnl_free()
157 struct xen_drm_front_evtchnl *evtchnl, in evtchnl_alloc() argument
166 memset(evtchnl, 0, sizeof(*evtchnl)); in evtchnl_alloc()
167 evtchnl->type = type; in evtchnl_alloc()
168 evtchnl->index = index; in evtchnl_alloc()
169 evtchnl->front_info = front_info; in evtchnl_alloc()
170 evtchnl->state = EVTCHNL_STATE_DISCONNECTED; in evtchnl_alloc()
171 evtchnl->gref = GRANT_INVALID_REF; in evtchnl_alloc()
182 init_completion(&evtchnl->u.req.completion); in evtchnl_alloc()
183 mutex_init(&evtchnl->u.req.req_io_lock); in evtchnl_alloc()
186 FRONT_RING_INIT(&evtchnl->u.req.ring, sring, XEN_PAGE_SIZE); in evtchnl_alloc()
190 evtchnl->u.req.ring.sring = NULL; in evtchnl_alloc()
204 evtchnl->u.evt.page = (struct xendispl_event_page *)page; in evtchnl_alloc()
208 evtchnl->gref = gref; in evtchnl_alloc()
210 ret = xenbus_alloc_evtchn(xb_dev, &evtchnl->port); in evtchnl_alloc()
214 ret = bind_evtchn_to_irqhandler(evtchnl->port, in evtchnl_alloc()
216 evtchnl); in evtchnl_alloc()
220 evtchnl->irq = ret; in evtchnl_alloc()
270 struct xen_drm_front_evtchnl *evtchnl, in evtchnl_publish() argument
274 struct xenbus_device *xb_dev = evtchnl->front_info->xb_dev; in evtchnl_publish()
278 ret = xenbus_printf(xbt, path, node_ring, "%u", evtchnl->gref); in evtchnl_publish()
285 ret = xenbus_printf(xbt, path, node_chnl, "%u", evtchnl->port); in evtchnl_publish()
346 void xen_drm_front_evtchnl_flush(struct xen_drm_front_evtchnl *evtchnl) in xen_drm_front_evtchnl_flush() argument
350 evtchnl->u.req.ring.req_prod_pvt++; in xen_drm_front_evtchnl_flush()
351 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&evtchnl->u.req.ring, notify); in xen_drm_front_evtchnl_flush()
353 notify_remote_via_irq(evtchnl->irq); in xen_drm_front_evtchnl_flush()